[英]How to call a stored procedure in pl/sql developer
我是新手,有一個簡單的問題。
我在 pl/sql developer 中創建了一個類似的過程
CREATE OR REPLACE PROCEDURE myproc2 AS
BEGIN
SELECT cd_desc des, cd_value cd FROM v_codes WHERE cd_type='CVS02'
END;
現在我想調用該程序並查看 output 但是當我運行它時
BEGIN
myproc2;
END;
在 Pl/sql 中我收到一條錯誤消息,說 object myproc2 無效
如何在 PL/SQL 中調用存儲過程?
你說得對,但程序是錯誤的。 如果你檢查它的狀態,它是無效的。
在 PL/SQL 中, SELECT
需要INTO
:
CREATE OR REPLACE PROCEDURE myproc2 AS
l_cd_desc v_codes.cd_desc%type;
l_cd_value v_codes.cd_value%type;
BEGIN
SELECT v.cd_desc, v.cd_value
INTO l_cd_desc, l_cd_value
FROM v_codes v
WHERE v.cd_type = 'CVS02';
END;
當心可能的NO_DATA_FOUND
或TOO_MANY_ROWS
異常。
此外,雖然它現在可以正常運行(我猜),但您什么也看不到,因為您不知道接下來要做什么。 例如,您可以選擇顯示您獲取的值。 在這種情況下,添加
<snip>
WHERE v.cd_type = 'CVS02';
dbms_output.put_line(l_cd_desc ||', '|| l_cd_value);
END;
不要忘記啟用服務器輸出。
正如您評論的那樣,您得到了too_many_rows
。 如何處理? 這取決於你想做什么。 一種選擇是切換到 cursor FOR
循環; 現在您不需要局部變量並且 - 因為沒有SELECT
語句本身 - 也沒有INTO
子句:
CREATE OR REPLACE PROCEDURE myproc2
AS
BEGIN
FOR cur_r IN (SELECT v.cd_desc, v.cd_value
FROM v_codes v
WHERE v.cd_type = 'CVS02')
LOOP
DBMS_OUTPUT.put_line (cur_r.cd_desc || ', ' || cur_r.cd_value);
END LOOP;
END;
Oracle SQL Developer 的一大優點是 GUI,它為您做事。
您可以打開工作表並以傳統方式運行它:
BEGIN
PROCEDURENAME(PARAM);
END;
或者您可以使用 GUI,使用(View->) Find DB object
找到 object,找到它,單擊它並使用工具欄中的green arrow
。 它將為您在過程中使用的任何參數打開一個 UI。
在 SQL Developer 中,如果您想查看 output 則可以返回 cursor:
CREATE OR REPLACE PROCEDURE myproc2(
o_cursor OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN o_cursor FOR
SELECT cd_desc AS des,
cd_value AS cd
FROM v_codes
WHERE cd_type='CVS02'; -- You need a ; statement terminator here.
END;
/
然后你可以使用:
-- Declare a cursor bind variable
VARIABLE cur SYS_REFCURSOR;
BEGIN
-- Call the cursor outputting into the bind variable.
myproc2(:cur);
END;
/
-- Print the cursor
PRINT :cur;
並將其作為腳本運行(使用F5 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.