暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在表中循环并取决于列的值,在其他列中插入新值

askTom 2017-03-29
312

问题描述

我创建了一个过程来在budget1,budget2,budget3中拆分每个项目的预算
取决于count1,count2和coun3列中的数字。很好。
当我使用DBMS_OUTPUT-PUT_LINE时,我得到了项目和不同的预算
现在我想在列Budget1中的表BUDGET_TEST中插入这个值,BUDGET2和BUDGET3取决于项目。

在我的程序中,我为每个项目分配了预算。这意味着对于Count1,我有Budget1,对于Count2,我有budget2,对于COUNT3,我有budget3。这在过程中是可变的。
我的输出与使用DBMS_OUTPUT.PUT_LINE的过程:

项目预算预算1预算2预算3
a 100 50 10 10
b 100 20 20 0
c 100 5 0 0

我已经在过程中完成了算术运算,该过程取决于COUNT1,COUNT2,count § 中的值,以使用IF ELSE语句获取此值。

然后我想从表BUDGET_TEST中的过程中插入这个不同的值。在开始时,表BUDGET_TEST中的列BUDGET1,BUDGET2和BUDGET3为空。
项目预算计数1计数2计数3预算1预算2预算3
a 100 1 3 2-
b 100 3 2 0-
c 100 2 0 0-
然后我想把它放在我的表格BUDGET_TEST中
项目预算计数1计数2计数3预算1预算2预算3
a 100 1 3 2 50 10 10
b 100 3 2 0 20 20 0
c 100 2 0 0 50 0


专家解答

我在努力理解你想做的事情的逻辑...

但是,如果您的目标是在工作结束时获得update语句,则需要解决一些问题。

您可以通过查看该过程的编译错误来获得线索:

CREATE TABLE BUDGET_TEST( 
project Varchar2(20), BUDGET NUMBER(8,0), COUNT1 NUMBER(8,0), 
BUDGET1 NUMBER(8,0), COUNT2 NUMBER(8,0), BUDGET2 NUMBER(8,0), 
COUNT3 NUMBER(8,0), BUDGET3 NUMBER(8,0) 
);

Insert into BUDGET_TEST (project,budget,Count1,Count2,count3) VALUES ('a',100,1,3,2);
Insert into BUDGET_TEST (project,budget,Count1,Count2,count3) VALUES ('b',100,3,2,0);
Insert into BUDGET_TEST (project,budget,Count1,Count2,count3) VALUES ('a',100,2,0,0);

select * from budget_test;

CREATE OR REPLACE PROCEDURE p
IS 
  budget1 INTEGER(10); 
  budget2 INTEGER(10); 
  budget3 INTEGER(10); 
  CURSOR cur 
  IS 
    SELECT PROJECT,budget,count1,count2,count3,BUDGET1,BUDGET2,BUDGET3 
    FROM BUDGET_TEST ; 
BEGIN 
  FOR i IN CUR 
  LOOP 
    IF i.count3 !=0 THEN 
      budget3   := (i.budget * 0.2)/i.count3; 
      budget2   :=(i.budget  *0.3)/ i.count2; 
      budget1   := (i.budget  *0.5)/ i.count1; 
    ELSE 
      IF i.count2 !=0 THEN 
        budget3   :=0; 
        budget2   := (i.budget *0.4)/i.count2; 
        budget1   := (i.budget *0.6)/ i.count1; 
      ELSE 
        IF i.count1 !=0 THEN 
          budget3   :=0; 
          budget2   :=0; 
          budget1   :=(i.budget)/i.count1; 
          ELSE  
           budget1:=0; 
        END IF; 
      END IF; 
    END IF; 
    DBMS_OUTPUT.put_line(i.project || ' ' || i.budget||' ' || budget1 || ' '|| budget2 || ' '|| budget3); 
    UPDATE BUDGET_TEST 
    SET    BUDGET1 = budget1, 
           BUDGET2 = budget2, 
           BUDGET3 = budget3 
    where  current of cur; 
    
  END LOOP; 
END;
/
sho err

LINE/COL ERROR
-------- -------------------------------------------------------------------------------
33/5     PL/SQL: SQL Statement ignored
37/23    PLS-00404: cursor 'CUR' must be declared with FOR UPDATE to use with CURRENT OF
37/23    PL/SQL: ORA-00904: : invalid identifier


所以你的光标缺少 “FOR UPDATE” 子句。

第二个问题是您的变量名称与您的列名相同!Oracle数据库将把所有这些解析为更新中的列名。所以要么你需要:

-重命名您的变量
-完全限定变量和列 (尽管无论如何这都是一个好主意)

我怀疑您可以将所有内容重写为一个更新...
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论