为啥我的 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 脚本中被忽略? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥数据在我的控制器中被截断为 0? [复制]

为啥这个 PL/SQL 查询不使用 ODP.NET 执行

为啥 LINQ 在我的查询中使用错误的数据类型,而它在 EF 架构中被正确声明?

为啥我的十进制值在 SQL 插入中被四舍五入为整数?

如何在 PL/SQL 块 (IF/THEN) 中执行“插入...选择...

为啥有换行符时我的 PL/SQL 过程不能编译?