如何执行dbms_output.put_line的结果

时间:2017-08-01 11:51:34

标签: sql oracle stored-procedures plsql execute-immediate

表格中包含此类数据: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:\

3 个答案:

答案 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包