问题描述
我创建了一个过程来在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
取决于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语句,则需要解决一些问题。
您可以通过查看该过程的编译错误来获得线索:
所以你的光标缺少 “FOR UPDATE” 子句。
第二个问题是您的变量名称与您的列名相同!Oracle数据库将把所有这些解析为更新中的列名。所以要么你需要:
-重命名您的变量
-完全限定变量和列 (尽管无论如何这都是一个好主意)
我怀疑您可以将所有内容重写为一个更新...
但是,如果您的目标是在工作结束时获得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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




