2017-08-01 28 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注入的入口點。