在pl / sql中的BEGIN块中使用ACCEPT

时间:2014-04-21 23:05:13

标签: oracle plsql

我试图在我的BEGIN块中使用ACCEPT,但我一直在收到错误。如果if条件被触发,我想接受用户输入。我怎样才能解决这个问题?以下是我的剧本:

ACCEPT ExpNum NUMBER PROMPT 'Enter an expense number:  ';

SELECT *
FROM ExpByCC
WHERE ExpNum = &ExpNum;

SELECT IsCash,CashAmt
FROM EXPMAST
WHERE ExpNum = &ExpNum
AND IsCash = 'Y';

ACCEPT CashAmount PROMPT 'Enter the amount of cash used for the expense:  ';

DECLARE
    CashTotal NUMBER(11,2);

BEGIN
    SELECT SUM(Amt)
    INTO CashTotal
    FROM EXPDET
    WHERE ExpNum = &ExpNum;

    IF &CashAmount < (CashTotal - 0)
    THEN
            ACCEPT CType PROMPT 'Enter a credit card type:  ';
            ACCEPT CCNum PROMPT 'Enter a credot card number:  ';
            ACCEPT Amt Prompt 'Enter an amount:  ';


    END IF;

END;
/

1 个答案:

答案 0 :(得分:3)

ACCEPT是一个SQL * Plus命令。在将代码发送到数据库之前,客户端(SQL * Plus)会对其进行解释。 PL / SQL是一种仅在服务器上运行的语言。因此,你不能将这两者交织在一起。您不能在PL / SQL块中嵌入SQL * Plus命令。作为一般规则,PL / SQL块不能与用户交互。

如果你真的想要真正地了解杂草,可以在你的SQL * Plus脚本中构建一个相当复杂的分支逻辑,这样第二个只有三个ACCEPT语句的脚本会当且仅当&CashAmount < (CashTotal - 0)运行,但这很少是适当的方法。这可能涉及创建一个名为next_script的新SQL * Plus变量,将该变量填充为块的一部分,然后在脚本中动态调用next_script。但是,这不是建立稳固,可靠,易于维护的系统的方法。