如何执行 dbms_output.put_line 的结果
How to execute results of dbms_output.put_line
有一列table包含这种数据:select to_char(sysdate,'day') from dual
。我想获得 table 保留的每个查询的结果。
我的结果集应该是select to_char(sysdate,'day') from dual
查询的结果。所以在这种情况下是 星期二 。
SO_SQL_BODY 是 Varchar2.
我写了这段代码,但它 returns 只有 table 数据。
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;
İf var_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;
本例不需要完整的光标。一个隐式的会使它更短。
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;
您应该添加一个异常处理程序来处理 table 中存在错误 SQL 查询的情况。另请注意,执行保存在数据库 table 中的查询是您 SQL 注入的入口点。
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;
/
尝试这个 - 迭代到非空记录 - 执行它们并打印 result.This 脚本工作假设 SO_SQL_BODY 包含一个查询,如果投影只投影一个 column.Also超过两列然后尝试使用 refcursor 和 dbms_sql 包
有一列table包含这种数据:select to_char(sysdate,'day') from dual
。我想获得 table 保留的每个查询的结果。
我的结果集应该是select to_char(sysdate,'day') from dual
查询的结果。所以在这种情况下是 星期二 。
SO_SQL_BODY 是 Varchar2.
我写了这段代码,但它 returns 只有 table 数据。
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;
İf var_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;
本例不需要完整的光标。一个隐式的会使它更短。
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;
您应该添加一个异常处理程序来处理 table 中存在错误 SQL 查询的情况。另请注意,执行保存在数据库 table 中的查询是您 SQL 注入的入口点。
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;
/
尝试这个 - 迭代到非空记录 - 执行它们并打印 result.This 脚本工作假设 SO_SQL_BODY 包含一个查询,如果投影只投影一个 column.Also超过两列然后尝试使用 refcursor 和 dbms_sql 包