当我运行我的脚本时,我在输入N时询问“付款方式是现金(是/否)?”但它仍然执行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 CashChoice PROMPT 'Will the payment method be cash (Y/N)? ';
DECLARE
ChoiceCash VARCHAR2(1);
NumRowInExpByCC NUMBER;
BEGIN
ChoiceCash := &CashChoice;
IF ChoiceCash = 'Y'
THEN
UPDATE EXPMAST
SET IsCash = ChoiceCash,
CashAmt = &CashAmount
WHERE ExpNum = &ExpNum;
COMMIT;
ELSE
&CType;
&CCnum;
&Amt;
END IF;
END;
/
答案 0 :(得分:1)
当您在PL / SQL中使用SQL * Plus替换变量时,SQL * Plus仅仅充当预处理器。它必须在将PL / SQL块发送到要执行的数据库之前为所有变量提供替换值。这意味着,即使您在ELSE
块中引用了未达到的替换变量,SQL * Plus仍需要确定要替换的值。 SQL * Plus无法执行PL / SQL代码,数据库也无法提示输入。
实际上,如果您需要提示人工输入,并且您希望这些提示由某种逻辑驱动,那么SQL * Plus通常不是您正在寻找的工具。有许多语言(shell脚本/批处理文件等),它们具有提示用户输入,执行简单条件逻辑,然后调用SQL * Plus(或使用内置API)与数据库交互的功能。