在Oracle存储过程中运行查询

时间:2009-10-14 20:34:58

标签: sql oracle plsql

我有一个查询

select * from myTable

...我希望将此查询包装在存储过程中,并让存储过程输出此查询的结果。

我该怎么做?

在ms-sql中,我可以将查询作为字符串存储到字符串变量中。然后执行“执行(变量)”。为什么Oracle中没有这样的东西?

3 个答案:

答案 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)。