为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]
Posted
技术标签:
【中文标题】为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]【英文标题】:Why is my IF being ignored in my PL?SQL script? [duplicate]为什么我的 IF 在我的 PL?SQL 脚本中被忽略? [复制] 【发布时间】:2014-04-22 01:08:03 【问题描述】:当我运行我的脚本时,当它询问“付款方式是否为现金 (Y/N)?”时,我输入 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;
/
【问题讨论】:
你的输出是什么?代码看起来不错。您可以反转 if 条件以避免 = vs == 混淆,但它不应该改变任何事情。 SQL> @addexpPay.sql 输入费用编号:1 旧 3:WHERE ExpNum = &ExpNum 新 3:WHERE ExpNum = 1 未选择行旧 3:WHERE ExpNum = &ExpNum 新 3:WHERE ExpNum = 1 I CASHAMT - ---------- Y 10.5 付款方式是现金(Y/N)吗? N 输入现金金额: 可能难以阅读,但我输入 N 仍然运行第一个 if 【参考方案1】:当您在 PL/SQL 中使用 SQL*Plus 替换变量时,SQL*Plus 仅充当预处理器。它必须为所有变量提供替换值,然后才能将 PL/SQL 块发送到要执行的数据库。这意味着即使您在不会到达的ELSE
块中引用替换变量,SQL*Plus 仍然需要确定要替换的值。 SQL*Plus 无法执行 PL/SQL 代码,数据库无法提示人工输入。
实际上,如果您需要提示人工输入并且希望这些提示由某种逻辑驱动,SQL*Plus 通常不是您要寻找的工具。有许多语言(shell 脚本/批处理文件等)具有提示用户输入、执行简单条件逻辑、然后调用 SQL*Plus(或使用内置 API)与数据库交互的功能。
【讨论】:
以上是关于为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 LINQ 在我的查询中使用错误的数据类型,而它在 EF 架构中被正确声明?