当oracle中有“立即执行”时,如何实现refcursor?

时间:2019-11-24 03:26:49

标签: oracle plsql oracle11g

我以前使用过sys_refcursor返回选择语句的数据。但是,我在这里使用立即执行,因此无法在执行立即语句中使用sys_refcursor。

以前我曾经做过

url("http://localhost:3002/delete/"+id)

但是,我今天尝试立即执行,但无法打印select语句的数据。 因此,以下是我尝试过的:

put(form)

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

2 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作为动态构建的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数据类型。多年来已经不推荐使用它,而Oracle(Oracle)最终将放弃对此的支持。使用VARCHAR2(在这种情况下绰绰有余),或者使用CLOB。

答案 1 :(得分:0)

您可以为其创建一个简单的过程。

CREATE OR REPLACE PROCEDURE OT.check_data(DATA1    number,
                                          R_C OUT  SYS_REFCURSOR)
IS 
BEGIN
  Open R_C for 'select * from ot.employee where deptno in ('
               || case when data1 = 10 then '10' 
                       Else '10,20' end
               || ')';

END;
/

您可以这样调用程序:

Declare
Rc sys_refcursor;
Begin
Ot.check_data(10, rc);
-- do something with returned cursor
End;
/

您可以在pl / sql块中打印或使用光标数据:see this qna

干杯!