首页 > 解决方案 > oracle中有“立即执行”时如何实现refcursor?

问题描述

我之前使用过 sys_refcursor 来返回 select 语句的数据。但是,我在这里使用 execute immediate,所以我无法在 execute immediate 语句中使用 sys_refcursor。

以前我做

R_C OUT SYS_REFCURSOR //refcursor
    OPEN R_C FOR  //it used to handle the return of all select statement
    SELECT * FROM table_name;

但是,我今天尝试立即执行,我无法打印 select 语句的数据。所以,按照我的尝试是:

CREATE OR REPLACE PROCEDURE OT.check_data(DATA1 number,R_C OUT SYS_REFCURSOR)
    IS 
    vquery long;
    BEGIN
    vquery :='select * from ot.employee ';
    if data1 = 10 then
    vquery := vquery||' where deptno in (10)';
    else
     vquery := vquery||' where deptno in (20,30)';
    end if;
    execute immediate vquery;
    END;
    /

   exec OT.check_data(10); 

程序运行正常,但我看不到 select 语句的数据。如何在控制台中显示立即执行的数据?我正在使用 toad。

标签: oracleplsqloracle11g

解决方案


您可以通过执行以下操作为动态构建的 SELECT 语句返回 SYS_REFCURSOR:

CREATE OR REPLACE PROCEDURE OT.check_data(DATA1    number,
                                          R_C OUT  SYS_REFCURSOR)
IS 
  vQuery VARCHAR2(32767);
  rc     SYS_REFCURSOR;
BEGIN
  vQuery :='select * from ot.employee ';

  if data1 = 10 then
    vQuery := vQuery ||' where deptno in (10)';
  else
    vQuery := vQuery ||' where deptno in (20,30)';
  end if;

  OPEN rc FOR vQuery;
  R_C := rc;
END;

我强烈建议您不要使用 LONG 数据类型。这已被弃用多年,而今天(tm)甲骨文最终将放弃对它的支持。要么使用 VARCHAR2,在这种情况下就足够了,要么使用 CLOB。


推荐阅读