2014-04-22 22 views
0

當我運行我的腳本時,當它詢問「付款方式是現金(是/否)?」時,我輸入N?但它仍然執行IF下的聲明......爲什麼會發生這種情況?爲什麼我的PL在SQL腳本中被忽略?

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

你的輸出是什麼?代碼看起來不錯。你可以反轉條件,以避免= vs ==混淆,但它不應該改變一件事情。 – vav

+0

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 支付方式是現金(是/否)? N 輸入值爲cashamount: – Stc5097

+0

可能難以閱讀,但我輸入N,它仍然運行第一個if – Stc5097

回答

1

當您在PL/SQL中使用SQL * Plus替換變量時,SQL * Plus僅僅充當預處理器。它必須爲所有變量提供替代值,然後才能將PL/SQL塊發送到要執行的數據庫。這意味着,即使您在ELSE塊中引用了替代變量,但仍無法達到,SQL * Plus仍然需要確定要替換的值。 SQL * Plus不能執行PL/SQL代碼,並且數據庫不能提示輸入人員。

實際上,如果您需要提示輸入人爲因素,並且希望這些提示是由某種邏輯驅動的,那麼SQL * Plus通常不是您正在尋找的工具。有許多語言(shell腳本/批處理文件等)可以提供用戶輸入,執行簡單的條件邏輯,然後調用SQL * Plus(或使用內置的API)與數據庫進行交互。

相關問題