我有一个查询
select * from myTable
...我希望将此查询包装在存储过程中,并让存储过程输出此查询的结果。
我该怎么做?
在ms-sql中,我可以将查询作为字符串存储到字符串变量中。然后执行“执行(变量)”。为什么Oracle中没有这样的东西?
答案 0 :(得分:5)
使用:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
BEGIN
OPEN L_CURSOR FOR
SELECT * from MYTABLE;
RETURN L_CURSOR;
END;
如果要在Oracle上运行动态SQL,请使用此选项:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY;
RETURN L_CURSOR;
END;
如果要在动态SQL中包含绑定变量:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY
USING bind_var1;
RETURN L_CURSOR;
END;
答案 1 :(得分:0)
您需要使用引用游标。
查看odp文档。它有一个很好的例子,涵盖了DB和.Net代码。
它附带了oracle客户端的安装,但它隐藏在目录结构的深处。转到 - > odp - > doc - > 。
答案 2 :(得分:0)
参考游标多年来一直是标准的做法,但使用流水线表函数的方法略有不同:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2345
它们在数据仓库应用程序中得到了广泛的应用,并且执行可以并行化,因此它们的性能非常高(不如仅仅运行SELECT)。