表格中包含此类数据:select to_char(sysdate,'day') from dual
。我希望获得表保存的每个查询的结果。
我的结果集应该是CREATE or replace PROCEDURE a_proc
AS
CURSOR var_cur IS
select SO_SQL_BODY FROM SO_SUB_VARS group by SO_SQL_BODY;
var_t var_cur%ROWTYPE;
TYPE var_ntt IS TABLE OF var_t%TYPE;
var_names var_ntt;
BEGIN
OPEN var_cur;
FETCH var_cur BULK COLLECT INTO var_names;
CLOSE var_cur;
FOR indx IN 1..var_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(var_names(indx).SO_SQL_BODY);
END LOOP;
END a_proc;
查询的结果。所以在这种情况下,它是星期二。
SO_SQL_BODY是Varchar2。
我编写了这段代码,但它只返回表数据。
E:\
答案 0 :(得分:0)
İfvar_names(indx).SO_SQL_BODY
输出是一个可运行的sql文本;
CREATE or replace PROCEDURE a_proc
AS
CURSOR var_cur IS
select SO_SQL_BODY FROM SO_SUB_VARS group by SO_SQL_BODY;
var_t var_cur%ROWTYPE;
TYPE var_ntt IS TABLE OF var_t%TYPE;
var_names var_ntt;
BEGIN
OPEN var_cur;
FETCH var_cur BULK COLLECT INTO var_names;
CLOSE var_cur;
FOR indx IN 1..var_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(var_names(indx).SO_SQL_BODY);
EXECUTE IMMEDIATE var_names(indx).SO_SQL_BODY;
END LOOP;
END a_proc;
答案 1 :(得分:0)
此示例不需要完整的光标。隐含的会缩短它。
create or replace procedure a_proc is
lReturnValue varchar2(250);
begin
for q in (select so_sql_body from so_sub_vars group by so_sql_body)
loop
execute immediate q.so_sql_body into lReturnValue;
dbms_output.put_line(lReturnValue);
end loop;
end a_proc;
您应该添加一个异常处理程序,它将关注表中存在错误SQL查询的情况。另请注意,执行保存在数据库表中的查询是SQL注入的入口点。
答案 2 :(得分:0)
DECLARE
res varchar2(4000);
sql_str varchar2(1000);
BEGIN
FOR r IN
(select SO_SQL_BODY FROM SO_SUB_VARS WHERE SO_SQL_BODY IS NOT NULL
)
LOOP
sql_str := r.SO_SQL_BODY;
EXECUTE immediate sql_str INTO res;
dbms_output.put_line(sql_str);
dbms_output.put_line('***********************');
dbms_output.put_line(res);
dbms_output.put_line('***********************');
END LOOP;
END;
/
尝试这一点 - 迭代到不为空记录 - 执行它们并打印结果。这个脚本的工作原理是假设SO_SQL_BODY包含一个只投影一列的查询。如果投影有两列以上,那么尝试使用refcursor和dbms_sql包