oracle - 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。
解决方案
您可以通过执行以下操作为动态构建的 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。
推荐阅读
- jenkins - jenkins字符串参数的字符串长度限制是多少
- java - Jsoup 不解析特定的 DIv
- android - Firebase Analytics Log Events
- angular - $event.target.value 对点击事件不起作用
- android - Android Gradle:混合版本会导致运行时崩溃
- javascript - 获取点击 javascript 的动态创建的元素
- mysql - 如何在值组之间添加换行符/标题?
- laravel - Laravel Voyager 路线限制
- node.js - 在 ejs 渲染中使用 HTTP.request
- c# - 获取上下文连接并将其用作其他地方的连接