本文转自:
I answered a question on a DBA Forum today and I thought it was a common enough question to warrant a blog posting.
Question: I am new to the wonderful world of Oracle. I want to be able to view the results of a stored procedure in an output window, say out of Oracle SQL developer. Unfortunately it appears I need to write some more code to actually view the data.
…
On a more generic note, can anyone explain to me why Oracle has chosen to make PL/SQL inordinately more complicated than say MS SQL/Servers tSQL? I mean in tSQL I would just write:
CREATE OR REPLACE PROCEDURE TESTSPROC2 AS select * from test_table order by id_no; GO
and viola, a nice result set spits out in Query Analyzer (or a .net application).
Answer:
Before I go on, let me say I agree that PL/SQL is more powerful. That being said, here are your options.
1. Test it with REFCURSOR using a FUNCTION and selecting from dual:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | SQL > create or replace function testfunc return sys_refcursor 2 as 3 c_test sys_refcursor ; 4 begin 5 open c_test for select first_name , last_name , email from employees where rownum < 10 ; 6 return c_test ; 7 end ; 8 / Function created . SQL > select testfunc ( ) from dual ; TESTFUNC ( ) -- -- -- -- -- -- -- -- -- -- CURSOR STATEMENT : 1 CURSOR STATEMENT : 1 FIRST_NAME LAST_NAME EMAIL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -- -- -- - Steven King SKING Neena Kochhar NKOCHHAR Lex De Haan LDEHAAN Alexander Hunold AHUNOLD Bruce Ernst BERNST David Austin DAUSTIN Valli Pataballa VPATABAL Diana Lorentz DLORENTZ Nancy Greenberg NGREENBE 9 rows selected . |
2. Use the same function and return it into a variable:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SQL > variable rc refcursor SQL > exec : rc : = testfunc ( ) PL / SQL procedure successfully completed . SQL > print rc FIRST_NAME LAST_NAME EMAIL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -- -- -- - Steven King SKING Neena Kochhar NKOCHHAR Lex De Haan LDEHAAN Alexander Hunold AHUNOLD Bruce Ernst BERNST David Austin DAUSTIN Valli Pataballa VPATABAL Diana Lorentz DLORENTZ Nancy Greenberg NGREENBE 9 rows selected . |
3. Use your procedure with a variable:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | SQL > create or replace procedure testproc ( c_test out sys_refcursor ) is 2 begin 3 open c_test for select first_name , last_name , email from employees where rownum < 10 ; 4 end ; 5 / Procedure created . SQL > variable rc2 refcursor SQL > exec testproc ( : rc2 ) ; PL / SQL procedure successfully completed . SQL > print rc2 FIRST_NAME LAST_NAME EMAIL -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - -- -- -- -- -- -- -- -- -- -- -- -- - Steven King SKING Neena Kochhar NKOCHHAR Lex De Haan LDEHAAN Alexander Hunold AHUNOLD Bruce Ernst BERNST David Austin DAUSTIN Valli Pataballa VPATABAL Diana Lorentz DLORENTZ Nancy Greenberg NGREENBE 9 rows selected . |
#3 is more in-line with your original needs. Personally I’m a fan of #1 and #2 because of the capabilities of returning a refcursor as a function, like passing it into .