2013-12-09 62 views
0

我對Oracle很有點新,我想知道,如果我可以給update statement case中的變量賦值。我可以爲更新語句中的變量賦值嗎?

我到目前爲止這樣的代碼:

PROCEDURE insert_repayment_data_inst(

    date_of_payment_l    IN credit_mo_repayment.date_of_payment%TYPE, 
    amoount_to_pay_l    IN credit_mo_repayment.ammount_to_pay%TYPE, 
    client_number_l    IN credit_mo_repayment.client_number%TYPE, 
    is_paid_l      IN credit_mo_repayment.is_paid%TYPE, 
    month_l      IN credit_mo_repayment.is_paid%TYPE, 
    year_l      IN credit_mo_repayment.is_paid%TYPE, 
    ending_balance_l    IN credit_mo_repayment.ending_balance%TYPE, 
    tests       IN credit_mo_repayment.ending_balance%TYPE 
) AS 
    BEGIN 

    select monthly_installment into tests 
    from credit_mo_repayment 
    WHERE (to_char(date_of_payment, 'mm') = to_char(to_date(date_of_payment_l), 'mm')) 
     AND (to_char(date_of_payment, 'yy') = to_char(to_date(date_of_payment_l), 'yy')); 

    UPDATE credit_mo_repayment 
    SET 

    monthly_installment = CASE 
          WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN Monthly_installment - amoount_to_pay_l 
          WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN 0 
         END, 

    ending_balance = CASE 
        WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN ending_balance - ABS(Monthly_installment - amoount_to_pay_l) tests:= ending_balance - ABS(Monthly_installment - amoount_to_pay_l) 
        WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN ending_balance 
        END, 
    ammount_to_pay = ammount_to_pay + amoount_to_pay_l 
    WHERE (to_char(date_of_payment, 'mm') = to_char(to_date(date_of_payment_l), 'mm')) 
     AND (to_char(date_of_payment, 'yy') = to_char(to_date(date_of_payment_l), 'yy'));         
END insert_repayment_data_inst; 

正如你可以看到我試圖將值賦給變量的情況下內部這樣 tests:= ending_balance - ABS(Monthly_installment - amoount_to_pay_l)

但沒有運氣。

我也嘗試將monthly_installment的值分配給tests變量,然後只是做數學,但我也沒有運氣。

select monthly_installment into tests 
from credit_mo_repayment 
WHERE (to_char(date_of_payment, 'mm') = to_char(to_date(date_of_payment_l), 'mm')) 
     AND (to_char(date_of_payment, 'yy') = to_char(to_date(date_of_payment_l), 'yy')); 

我知道我在語法中缺少一些東西,但我無法發現它。

+0

當您嘗試選擇測試時出了什麼問題?錯誤信息? – Armunin

+0

@Armunin'錯誤(683,3):PL/SQL:SQL Statement ignored','錯誤(683,35):PLS-00403:expression'TESTS'不能用作SELECT/FETCH語句的INTO目標','錯誤(684,3):PL/SQL:ORA-00904::invalid identifier' – Slim

+0

您確定'tests'的類型正確嗎? 'ending_balance'與'monthly_installment'的類型相同嗎? – Armunin

回答

1

首先,您必須將目標變量定義爲OUT-參數或新變量。例如:

PROCEDURE insert_repayment_data_inst(

    date_of_payment_l    IN credit_mo_repayment.date_of_payment%TYPE, 
    amoount_to_pay_l    IN credit_mo_repayment.ammount_to_pay%TYPE, 
    client_number_l    IN credit_mo_repayment.client_number%TYPE, 
    is_paid_l      IN credit_mo_repayment.is_paid%TYPE, 
    month_l      IN credit_mo_repayment.is_paid%TYPE, 
    year_l      IN credit_mo_repayment.is_paid%TYPE, 
    ending_balance_l    IN credit_mo_repayment.ending_balance%TYPE, 
    tests       IN credit_mo_repayment.ending_balance%TYPE 
) AS 
-- new variable 
    monthly_payments_output credit_mo_repayment.ending_balance%TYPE; 
    BEGIN 

二:你可以嘗試RETURNING -clause如下所述: http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/collections.htm#BABHDGIG這裏
http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/sqloperations.htm#BABEBDIA
應該導致這樣的事情哪(未經測試):

UPDATE credit_mo_repayment 
    SET 

    monthly_installment = CASE 
          WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN Monthly_installment - amoount_to_pay_l 
          WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN 0 
         END, 

    ending_balance = CASE 
        WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN ending_balance - ABS(Monthly_installment - amoount_to_pay_l) 
        WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN ending_balance 
        END, 
    ammount_to_pay = ammount_to_pay + amoount_to_pay_l 
    WHERE (to_char(date_of_payment, 'mm') = to_char(to_date(date_of_payment_l), 'mm')) 
     AND (to_char(date_of_payment, 'yy') = to_char(to_date(date_of_payment_l), 'yy')) 
RETURNING monthly_installment INTO tests; 
+0

這裏是我得到的:'錯誤(711, 20):PLS-00103:遇到下列其中一項時遇到符號「MONTHLY_INSTALLMENT」::=。(@%;' – Slim

+0

在我的代碼中沒有任何測試數據很難測試或重現。 – Armunin

1

你可以這樣說:

UPDATE credit_mo_repayment SET 
monthly_installment = 
    CASE 
    WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN Monthly_installment - amoount_to_pay_l 
    WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN 0 
    END, 
ending_balance = 
    CASE 
    WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN ending_balance - ABS(Monthly_installment - amoount_to_pay_l) 
    WHEN (Monthly_installment - amoount_to_pay_l >= 0) THEN ending_balance 
    END, 
ammount_to_pay = ammount_to_pay + amoount_to_pay_l 
WHERE (TO_CHAR(date_of_payment, 'mm') = TO_CHAR(TO_DATE(date_of_payment_l), 'mm')) 
    AND (TO_CHAR(date_of_payment, 'yy') = TO_CHAR(TO_DATE(date_of_payment_l), 'yy')) 
RETURNING 
    CASE 
    WHEN (Monthly_installment - amoount_to_pay_l < 0) THEN ending_balance - ABS(Monthly_installment - amoount_to_pay_l) 
    ELSE NULL 
    END   
INTO tests; 

未測試 - 我不確定是否允許在RETURNING子句中使用CASE表達式。

+0

無法工作:( – Slim

相關問題