簡體   English   中英

如何在pl/sql developer中調用存儲過程

[英]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_FOUNDTOO_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM