2017-08-01 1 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; 
/

これを試してみてください - nullではないレコードを繰り返す - result.Thisスクリプトは投影が二つ以上の列である場合SO_SQL_BODYは一つだけcolumn.Alsoを投影したクエリが含まれていることを想定した作品にそれらを実行し、印刷しますrefcursorとdbms_sqlパッケージを使用してください。

0

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

私はそうは思わない。これは、2つのカラムと、 'to_char(sysdate、' day ')を2種類のデータから選択するカラムを持つテーブルです。タイプは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インジェクションのエントリポイントになります。

関連する問題