我正在將存儲過程從SQL Server轉換爲Oracle。 此存儲過程提供了直接結果集。我的意思是,如果您在例如Management Studio中調用存儲過程,則直接獲取結果集。從oracle存儲過程獲取結果集
通過轉換到Oracle我走對,我在甲骨文將不會顯示
我在互聯網上搜索,並看到該存儲過程應該產生一個REF CURSOR的ResultSet中的問題,但我仍與走問題編寫一小段代碼來獲取結果集。
僞代碼:
調用存儲過程並獲得光標 請與光標的東西,使我的結果集出現
有人的想法?
我正在將存儲過程從SQL Server轉換爲Oracle。 此存儲過程提供了直接結果集。我的意思是,如果您在例如Management Studio中調用存儲過程,則直接獲取結果集。從oracle存儲過程獲取結果集
通過轉換到Oracle我走對,我在甲骨文將不會顯示
我在互聯網上搜索,並看到該存儲過程應該產生一個REF CURSOR的ResultSet中的問題,但我仍與走問題編寫一小段代碼來獲取結果集。
僞代碼:
調用存儲過程並獲得光標 請與光標的東西,使我的結果集出現
有人的想法?
在SQL加:
SQL> create procedure myproc (prc out sys_refcursor)
2 is
3 begin
4 open prc for select * from emp;
5 end;
6/
Procedure created.
SQL> var rc refcursor
SQL> execute myproc(:rc)
PL/SQL procedure successfully completed.
SQL> print rc
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ----------- ---------- ---------- ----------
7839 KING PRESIDENT 17-NOV-1981 4999 10
7698 BLAKE MANAGER 7839 01-MAY-1981 2849 30
7782 CLARKE MANAGER 7839 09-JUN-1981 2449 10
7566 JONES MANAGER 7839 02-APR-1981 2974 20
7788 SCOTT ANALYST 7566 09-DEC-1982 2999 20
7902 FORD ANALYST 7566 03-DEC-1981 2999 20
7369 SMITHY CLERK 7902 17-DEC-1980 9988 11 20
7499 ALLEN SALESMAN 7698 20-FEB-1981 1599 3009 30
7521 WARDS SALESMAN 7698 22-FEB-1981 1249 551 30
7654 MARTIN SALESMAN 7698 28-SEP-1981 1249 1400 30
7844 TURNER SALESMAN 7698 08-SEP-1981 1499 0 30
7876 ADAMS CLERK 7788 12-JAN-1983 1099 20
7900 JAMES CLERK 7698 03-DEC-1981 949 30
7934 MILLER CLERK 7782 23-JAN-1982 1299 10
6668 Umberto CLERK 7566 11-JUN-2009 19999 0 10
9567 ALLBRIGHT ANALYST 7788 02-JUN-2009 76999 24 10
非常好!謝謝你的答覆,託尼。我可以通過Unix/Linux腳本將這些結果導出爲CSV嗎? – 2014-09-15 16:22:43
在SQL加:
SQL> var r refcursor
SQL> set autoprint on
SQL> exec :r := function_returning_refcursor();
替換到你的過程/函數的調用和REFCURSOR內容的最後一行將顯示
Oracle不是sql服務器。嘗試在SQL Developer中的下列
variable rc refcursor;
exec testproc(:rc2);
print rc2
您好我知道這是前一段時間,但問我剛剛想通了這一點,它可能幫助別人。不知道這是否正是您要查找的內容,但這是我如何調用存儲過程並使用SQL Developer查看輸出。
在SQL Developer中查看過程時,右鍵單擊並選擇'運行'或選擇Ctrl + F11以打開運行PL/SQL窗口。這將創建一個包含需要修改的輸入和輸出參數的模板。我的proc返回一個sys_refcursor。對我來說是一個聲明行類型是完全等同於選擇語句/ SYS_REFCURSOR由PROC返回最棘手的部分:
DECLARE
P_CAE_SEC_ID_N NUMBER;
P_FM_SEC_CODE_C VARCHAR2(200);
P_PAGE_INDEX NUMBER;
P_PAGE_SIZE NUMBER;
v_Return sys_refcursor;
type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),rownum number, v_total_count number);
v_rec t_row;
BEGIN
P_CAE_SEC_ID_N := NULL;
P_FM_SEC_CODE_C := NULL;
P_PAGE_INDEX := 0;
P_PAGE_SIZE := 25;
CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
P_CAE_SEC_ID_N => P_CAE_SEC_ID_N,
P_FM_SEC_CODE_C => P_FM_SEC_CODE_C,
P_PAGE_INDEX => P_PAGE_INDEX,
P_PAGE_SIZE => P_PAGE_SIZE,
P_FOF_SEC_REFCUR => v_Return
);
-- Modify the code to output the variable
-- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = ');
loop
fetch v_Return into v_rec;
exit when v_Return%notfound;
DBMS_OUTPUT.PUT_LINE('sec_id = ' || v_rec.CAE_SEC_ID || 'sec code = ' ||v_rec.FM_SEC_CODE);
end loop;
END;
我的解決辦法是建立一個管道函數。優點是可以將查詢一行:
select * from table(yourfunction(param1, param2));
要定義你需要做的是這樣的功能如下:
-- Declare the record columns
TYPE your_record IS RECORD(
my_col1 VARCHAR2(50),
my_col2 varchar2(4000)
);
TYPE your_results IS TABLE OF your_record;
-- Declare the function
function yourfunction(a_Param1 varchar2, a_Param2 varchar2)
return your_results pipelined is
rt your_results;
begin
-- Your query to load the table type
select s.col1,s.col2
bulk collect into rt
from your_table s
where lower(s.col1) like lower('%'||a_Param1||'%');
-- Stuff the results into the pipeline..
if rt.count > 0 then
for i in rt.FIRST .. rt.LAST loop
pipe row (rt(i));
end loop;
end if;
-- Add more results as you please....
return;
end find;
正如上面提到的,你會怎麼做來查看你的結果是:
select * from table(yourfunction(param1, param2)) t order by t.my_col1;
我wounder 。這個問題有超過90K的觀點,並且只有20票贊成票。它應該得到每張視圖的最高票數。 :D – 2017-08-23 11:58:26