我有一个包含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;
重要说明:表的结构可以是任意的。我必须编写一个接受表名作为参数的过程,所以我不能硬编码表结构而不想这样做。
感谢您的回复。任何想法非常赞赏/
答案 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;