如何输出使用本机动态SQL执行的SELECT语句的结果?

时间:2013-01-25 19:17:20

标签: oracle plsql

我有一个包含SQL SELECT语句的字符串 我想知道如何在屏幕上输出该语句的执行结果,执行将使用本机动态SQL (EXECUTE IMMEDIATE完成。

示例:

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

重要说明:表的结构可以是任意的。我必须编写一个接受表名作为参数的过程,所以我不能硬编码表结构而不想这样做。

感谢您的回复。任何想法非常赞赏/

3 个答案:

答案 0 :(得分:3)

如果你可以将执行立即更改为dbms_sql游标,那么以下解决方案应该能够帮助你,因为你可以从dbms_sql游标中获取列名:

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

答案 1 :(得分:3)

如果您使用12c客户端使用Oracle 12c,则应该可以使用:

declare
    rc sys_refcursor;
begin
    open rc for 'select * from dual';
    dbms_sql.return_result(rc);
end;

答案 2 :(得分:1)

是的,我们可以动态执行select语句。

假设我们有一张表test。它有四列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包来动态执行SELECT Sql Statament。

代码如下:

   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;