[英]Oracle PL/SQL: how to execute a procedure with a varray as out parameter?
[英]How to execute an oracle procedure with an out cursor parameter in an anonymous PL/SQL block?
我正在使用Oracle XE的HR數據庫學習PL / SQL。
我創建了以下存儲過程:
CREATE OR REPLACE PROCEDURE get_employees( p_country_id IN CHAR
, p_emp OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_emp FOR
SELECT e.first_name
,e.last_name
,e.department_id
,d.department_name
,l.city
,l.state_province
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
INNER JOIN locations l
ON d.location_id = l.location_id
WHERE l.country_id = p_country_id;
END;
我知道如何在SQL Developer GUI界面中執行它並查看結果。 我也從中學到賈斯汀洞在這里和這里如何執行它並查看結果SQL * Plus的風格像這樣:
VARIABLE CE REFCURSOR;
EXEC GET_EMPLOYEES('US', :CE);
PRINT CE;
我想在匿名PL / SQL塊中執行存儲過程並在網格中查看結果,但它沒有成功。
就像Justin Cave建議的那樣,以下執行得很好,但結果不會顯示:
DECLARE
C_EMP SYS_REFCURSOR;
BEGIN
GET_EMPLOYEES('US', C_EMP);
END;
以下將失敗:
DECLARE
C_EMP SYS_REFCURSOR;
L_REC C_EMP%ROWTYPE; --THIS LINE FAILS.
BEGIN
GET_EMPLOYEES('US', C_EMP);
-- LOOP AND FETCH GOES HERE.
END;
錯誤消息說:
PLS-00320:此表達式類型的聲明不完整或格式錯誤
我不明白。 我一直在其他一些匿名PL / SQL塊中這樣做,它完美地工作。 這條線路有什么問題? 想不通。
我認為你誤解了%ROWTYPE的使用。 在存儲表中的所有行時,應該只使用%ROWTYPE。 而不是使用%ROWTYPE,使您自己的類型(記錄)適合您要獲取的列的數據類型。 嘗試這個:
DECLARE
C_EMP SYS_REFCURSOR;
TYPE new_type IS RECORD(FIRST_NAME VARCHAR2(100), LAST_NAME VARCHAR2(200), DEPARTMENT_ID NUMBER, DEPARTMENT_NAME VARCHAR2(200), CITY VARCHAR2(200), STATE_PROVINCE VARCHAR2(200));
L_REC new_type; --instead of using %ROWTYPE, use the declared type
BEGIN
GET_EMPLOYEES('US', C_EMP);
LOOP
FETCH c_emp INTO l_rec;
EXIT WHEN c_emp%NOTFOUND;
dbms_output.put_line(l_rec.first_name||'_'||
l_rec.last_name||'_'||
l_rec.department_id||'_'||
l_rec.department_name||'_'||
l_rec.city||'_'||
l_rec.state_province);
END LOOP;
CLOSE c_emp;
END;
我相信這個問題沒有簡短的答案。
要了解問題所在,您應該研究強類型和弱類型的反饋器是什么。
Oracle DBMS沒有內置工具將refcursor結果放入網格中。 如果您要編寫一個嘗試DBMS_SQL包和動態PL / SQL - 那么就可以編寫一個產生您期望的結果的程序(即將任何sys_refcursor放入網格中)。
但是如果你剛剛開始學習PL / SQL,請不要浪費你的時間 - 首先,獲得一些經驗,你會看到如何做到這一點。 只要沒有發生,請使用SQL Developer的hack 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.