6

SELECTSQLステートメントを含む文字列があります。
そのステートメントの実行結果を画面に出力するにはどうすればよいでしょうか。実行はネイティブの動的SQLEXECUTE IMMEDIATE)を使用して行われます。

例:

DECLARE
v_stmt VARCHAR2 := 'SELECT * FROM employees';
BEGIN
EXECUTE IMMEDIATE v_stmt; -- ??? how to output result of that select on the screen.
END;

重要な注意:テーブルの構造はどのようなものでもかまいません。テーブルの名前をパラメーターとして受け入れるプロシージャを作成する必要があるため、テーブル構造をハードコーディングできず、実行したくありません。

回答ありがとうございます。どんなアイデアでも大歓迎です/

4

3 に答える 3

5

その実行をすぐにdbms_sqlカーソルに変更できる場合は、dbms_sqlカーソルから列名を取得できるため、次のソリューションが役立つはずです。

https://forums.oracle.com/forums/thread.jspa?threadID=700648

于 2013-01-25T19:22:01.483 に答える
5

12cクライアントを使用してOracle12cを使用している場合、これは機能するはずです。

declare
    rc sys_refcursor;
begin
    open rc for 'select * from dual';
    dbms_sql.return_result(rc);
end;
于 2017-04-06T15:56:31.740 に答える
1

はい、selectステートメントを動的に実行できます。

テーブルがあるとしましょうtest。4列Row_id,Name,Rankなどあります。やるとselect * from test; 結果は

Row_id Name   Rank  
1      R1    5 
2      R2    1 
3      R3    2 
4      R4    4 

これで、DBMS_SQLパッケージを使用して、SELECTSqlStatamentを動的に実行できます。

コードは以下のとおりです。

   DECLARE
        v_CursorID  NUMBER;
        v_table VARCHAR2(50):='test';
        v_SelectRecords  VARCHAR2(500);
        v_NUMRows  INTEGER;
        v_MyNum INTEGER;
        v_Myname VARCHAR2(50);
        v_Rank INTEGER;



    BEGIN
         v_CursorID := DBMS_SQL.OPEN_CURSOR;
        v_SelectRecords := 'SELECT * from ' || v_table ;
        DBMS_SQL.PARSE(v_CursorID,v_SelectRecords,DBMS_SQL.V7);
        DBMS_SQL.DEFINE_COLUMN(v_CursorID,1,v_MyNum);
        DBMS_SQL.DEFINE_COLUMN(v_CursorID,2,v_Myname,50);
        DBMS_SQL.DEFINE_COLUMN(v_CursorID,3,v_Rank);

        v_NumRows := DBMS_SQL.EXECUTE(v_CursorID);
   LOOP
        IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN
             EXIT;
        END IF;

        DBMS_SQL.COLUMN_VALUE(v_CursorId,1,v_MyNum);
        DBMS_SQL.COLUMN_VALUE(v_CursorId,2,v_Myname);
        DBMS_SQL.COLUMN_VALUE(v_CursorId,3,v_Rank);



        DBMS_OUTPUT.PUT_LINE(v_MyNum || ' ' || v_Myname || ' ' || v_Rank  );

   END LOOP;

   EXCEPTION
        WHEN OTHERS THEN
                  RAISE;
        DBMS_SQL.CLOSE_CURSOR(v_CursorID);
        end;
于 2013-01-28T10:12:30.917 に答える