How to output result of SELECT statement which is executed using native dynamic SQL?

后端 未结 3 1017
[愿得一人]
[愿得一人] 2020-12-03 16:10

I have a string which contains SQL SELECT statement.
I wonder how can I output result of the execution of that statement on the screen, execution will be do

相关标签:
3条回答
  • 2020-12-03 16:47

    If you are on Oracle 12c with a 12c client, this should work:

    declare
        rc sys_refcursor;
    begin
        open rc for 'select * from dual';
        dbms_sql.return_result(rc);
    end;
    
    0 讨论(0)
  • 2020-12-03 16:52

    If you can change that execute immediate into a dbms_sql cursor, then the following solution should be able to help you, as you can get the column names from a dbms_sql cursor:

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

    0 讨论(0)
  • 2020-12-03 16:53

    Yes we can execute select statement dynamically.

    Let say we have a table test. It has four column Row_id,Name,Rank etc When we do select * from test; Result will be

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

    Now we can use DBMS_SQL package to execute dynamically SELECT Sql Statament.

    Code is below:

       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;
    
    0 讨论(0)
提交回复
热议问题