2013-12-09 65 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

相关问题