Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如果l_curr_bal=l_剩余金额和l_分期付款 l_安装金额:=0; 如果结束; 如果结束; 如果l_bal_flg='Y',则 l_curr_bal:=l_CalculatedBalance-l_install_amt; l_bal_flg:='N_Oracle_Plsql - Fatal编程技术网

Oracle 如果l_curr_bal=l_剩余金额和l_分期付款 l_安装金额:=0; 如果结束; 如果结束; 如果l_bal_flg='Y',则 l_curr_bal:=l_CalculatedBalance-l_install_amt; l_bal_flg:='N

Oracle 如果l_curr_bal=l_剩余金额和l_分期付款 l_安装金额:=0; 如果结束; 如果结束; 如果l_bal_flg='Y',则 l_curr_bal:=l_CalculatedBalance-l_install_amt; l_bal_flg:='N,oracle,plsql,Oracle,Plsql,如果l_curr_bal=l_剩余金额和l_分期付款 l_安装金额:=0; 如果结束; 如果结束; 如果l_bal_flg='Y',则 l_curr_bal:=l_CalculatedBalance-l_install_amt; l_bal_flg:='N'; 其他的 l_curr_bal:=l_curr_bal-l_安装金额; 如果结束; l_安装顺序:=l_安装顺序+1; DBMS|u OUTPUT.PUT|u LINE(l|u install|u seq||'''l|u install|u

如果l_curr_bal=l_剩余金额和l_分期付款 l_安装金额:=0; 如果结束; 如果结束; 如果l_bal_flg='Y',则 l_curr_bal:=l_CalculatedBalance-l_install_amt; l_bal_flg:='N'; 其他的 l_curr_bal:=l_curr_bal-l_安装金额; 如果结束; l_安装顺序:=l_安装顺序+1; DBMS|u OUTPUT.PUT|u LINE(l|u install|u seq||'''l|u install|u amt|''l|u curr|u bal); 端环; 结束; --输出: 计算余额59024 34 1315 14125 35 14125 0 计算余额63024 31 1362 22164 32 2591 19573 33 2724 16849 34 2724 14125 35 14125 0 计算余额55024 31 1362 14164 32 39 14125 33 0 14125 34 0 14125 35 14125 0
我不明白。你能举一个更详细的例子说明你的初始数据和预期结果吗?余额只是表中的一个固定值。我想选择该值并应用于另一个表,因此结果应该看起来像问题中的更新。请查看问题中的更新代码,以便使用其他表中值的余额金额。如果剩余余额大于表中的值,则表中的值应减少至0,否则应从表中的值中减去剩余余额。是的,你能不能用一些我不懂的代码举例说明一下。你能举一个更详细的例子说明你的初始数据和预期结果吗?余额只是表中的一个固定值。我想选择该值并应用于另一个表,因此结果应该看起来像问题中的更新。请查看问题中的更新代码,以便使用其他表中值的余额金额。如果剩余余额大于表中的值,则表中的值应减少至0,否则应从表中的值中减去剩余余额。是的,你能在一些代码示例中显示吗请尝试:-)是的,我尝试过它的外观完美请尝试:-)是的,我尝试过它的外观完美
  1021  1021-955 = 66
  1021  1021-1021 = 0
  1021  1021-1021 = 0
DECLARE
   l_balance       NUMBER := 2997;
   l_running_bal   NUMBER := 0;
   l_bal_flg       VARCHAR2 (1) := 'Y';


   CURSOR c
   IS
          SELECT 1021 installment
            FROM DUAL
      CONNECT BY LEVEL <= 3;
BEGIN
   FOR i IN c LOOP
      IF l_bal_flg = 'Y' THEN
         l_running_bal := l_balance - i.installment;
         l_bal_flg := 'N';
      ELSE
         l_running_bal := l_running_bal - i.installment;
      END IF;


      DBMS_OUTPUT.PUT_LINE (l_running_bal);
   END LOOP;
END;
  1021  66
  1021  0
  1021  0
set serverout on size 20000
DECLARE
   l_balance       NUMBER := 2997;
   l_sub           NUMBER;

   CURSOR c
   IS
          SELECT 1021 installment
            FROM DUAL
      CONNECT BY LEVEL <= 3;
BEGIN
   FOR i IN c LOOP
      l_sub := greatest(least(l_balance, i.installment),-i.installment);
      l_balance := l_balance - l_sub;
      DBMS_OUTPUT.PUT_LINE (i.installment||' '||(i.installment-l_sub));
   END LOOP;
END;
DECLARE
   l_bal_flg              VARCHAR2 (10) := 'Y';
   l_install_amt          NUMBER := 1362;
   l_calcaulatedbalance   NUMBER := 59024;
   l_curr_bal             NUMBER := 0;
   l_tot_inst_amount             NUMBER := 0;
   l_last_bal_amount             NUMBER := 0;
   l_install_amount2             NUMBER := 0;

   l_last_bal_amount2             NUMBER := 0;
   l_residual_amt         NUMBER := 14125;
   l_installment_cnt      NUMBER := 34;
   l_install_seq          NUMBER := 1;
   l_bal_trans            NUMBER :=0;
   l_bal_trans_cnt            NUMBER :=0;
BEGIN
-- amount to be balanced at last before transaction
l_tot_inst_amount := l_calcaulatedbalance-l_residual_amt;
l_last_bal_amount := round(((l_tot_inst_amount/(l_installment_cnt-1)) -  l_install_amt) * (l_installment_cnt-1));

-- to get the transaction from which it has to be balanced
IF l_last_bal_amount <> 0
THEN
   l_last_bal_amount2 :=   ABS(l_last_bal_amount);
   l_install_amount2  :=   l_install_amt;
   l_BAL_TRANS := ceil(l_last_bal_amount2/l_install_amt);
   -- to get the amount to be added on first transaction to be balanced
loop
exit when l_last_bal_amount2 < l_install_amt;
l_last_bal_amount2 := l_last_bal_amount2 - l_install_amt;
end loop;

-- to get the exact transaction count on which first balance to be made
l_bal_trans_cnt :=l_installment_cnt-l_bal_trans;
END IF;

   FOR j IN 1 .. l_installment_cnt LOOP

-- adjustment at the transactions to be balanced
         IF l_bal_trans_cnt = l_install_seq THEN
            l_install_amt := l_install_amount2+(l_last_bal_amount2*(l_last_bal_amount/ABS(l_last_bal_amount)));

        elsif l_install_seq > l_bal_trans_cnt  and l_last_bal_amount >0  then
        l_install_amt := l_install_amount2+l_install_amount2;
         END IF;  



      IF l_residual_amt <> 0 THEN
         IF l_installment_cnt = l_install_seq THEN
            l_install_amt := l_residual_amt;
         END IF;
         -- if balance to be paid is the residual amount then no installment to be paid for the current month 
         IF l_curr_bal = l_residual_amt and l_installment_cnt <> l_install_seq THEN
            l_install_amt := 0;
         END IF;         
      END IF;


      IF l_bal_flg = 'Y' THEN
         l_curr_bal := l_calcaulatedbalance - l_install_amt;
         l_bal_flg := 'N';
      ELSE
         l_curr_bal := l_curr_bal - l_install_amt;
      END IF;

      l_install_seq := l_install_seq + 1;

      DBMS_OUTPUT.PUT_LINE (l_install_seq||' '||l_install_amt || '  ' || l_curr_bal);


   END LOOP;
END;


-- output:
for calculated balance 59024
34 1315  14125
35 14125  0

for calculated balance 63024
31 1362  22164
32 2591  19573
33 2724  16849
34 2724  14125
35 14125  0

for calculated balance 55024
31 1362  14164
32 39  14125
33 0  14125
34 0  14125
35 14125  0