如何执行 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 包