2017-08-01 29 views
0

有一张表包含这种数据:select to_char(sysdate,'day') from dual在一列中。我想获取表格保留的每个查询的结果。如何执行dbms_output.put_line的结果

我的结果集应该是select to_char(sysdate,'day') from dual查询的结果。所以在这种情况下,它是一个周二

SO_SQL_BODY是Varchar2。

我写了这段代码,但它只返回表格数据。

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; 
+0

您可以共享表格数据吗? – hemalp108

回答

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; 
/

试试这个 - 迭代,以不为空的记录 - 执行它们并打印result.This脚本工作假设SO_SQL_BODY包含哪些项目只有一个column.Also如果投影是有两个以上列的查询的事实然后尝试使用refcursor和dbms_sql程序包

0

012f 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; 
+0

它给出了一个错误。 ORA-06535:在EXECUTE IMMEDIATE中的语句字符串是NULL或0长度 – 1010111100011

+0

做'var_names(indx).SO_SQL_BODY'这个语句返回一个可执行的SQL文本? –

+0

我不这么认为。它是一个有两列的表,并且保留'select'从'dual'类型的数据中选择to_char(sysdate,'day'),类型是varchar2。 – 1010111100011

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注入的入口点。