从 PL/SQL 块中的 CASE 语句调用 Procs:面临的问题

Posted

技术标签:

【中文标题】从 PL/SQL 块中的 CASE 语句调用 Procs:面临的问题【英文标题】:Calling Procs from CASE statement in PL/SQL Block : issue faced 【发布时间】:2018-04-14 15:30:32 【问题描述】:

我创建了以下块,要求用户选择选项。 然后每个选项调用存储过程来处理接收到的信息(无论是显示余额还是存款,为特定ID进行提款。

`set serveroutput on
DECLARE
  V_CHOICE NUMBER(1)  := &V_CHOICE;
  ID       NUMBER(5)  := &ID;
  AMT      NUMBER(20) := &AMT;
BEGIN
  CASE V_CHOICE
  WHEN 1 THEN
    EXEC SHOW_BALANCE(ID);
  WHEN 2 THEN
    EXEC DEPOSITS (ID ,AMT);
  WHEN 3 THEN
    EXEC WITHDRAWAL (ID, AMT);
  ELSE
    DBMS_OUTPUT.PUT_LINE ('Invalid choice');
  END CASE;
END;
/`

这些过程中的每一个都可以通过传递各自的参数来单独执行,但是在使用 case 语句时,我遇到了 PL/SQL 编译错误

 Error report:
ORA-06550: line 8, column 6:
PLS-00103: Encountered the symbol "SHOW_BALANCE" when expecting one of the following:

   := . ( @ % ;
The symbol ":=" was substituted for "SHOW_BALANCE" to continue.

请告知 PL/SQL 块有什么问题。

【问题讨论】:

EXEC 是 SQL*Plus 命令,而不是 PL/SQL 命令。 【参考方案1】:

你需要删除EXEC:

set serveroutput on;
DECLARE
  V_CHOICE NUMBER(1)  := &V_CHOICE;
  ID       NUMBER(5)  := &ID;
  AMT      NUMBER(20) := &AMT;
BEGIN
  CASE V_CHOICE
  WHEN 1 THEN        SHOW_BALANCE(ID);
  WHEN 2 THEN        DEPOSITS(ID ,AMT);
  WHEN 3 THEN        WITHDRAWAL(ID, AMT);
  ELSE               DBMS_OUTPUT.PUT_LINE('Invalid choice');
  END CASE;
END;
/

【讨论】:

非常感谢 lad2025。 @ChinmayDeshpande How does accepting an answer work?

以上是关于从 PL/SQL 块中的 CASE 语句调用 Procs:面临的问题的主要内容,如果未能解决你的问题,请参考以下文章

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?

PL/SQL 中 CASE 语句中的堆栈条件

我在 PL SQL 中的 CASE 语句有啥问题?

为啥在匿名 PL/SQL 块中没有立即引发异常?

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

类似于 Oracle PL/SQL 块中的 finally Block (JAVA)