两个表 a,b
SQL> select * from a; SQL> select * from b;
ID 201201 201202 ID MONTH ZU_NO
---- ------ ------ ---- ------- -----
1 10 5 201202 15
5 20
通过存储过程实现根据b表的month字段的值去修改a表和month字段一样的,id一样的这个数值,得到以下结果
ID 201201 201202
---- ------ ------
1 10
5 15 经过循序渐进现在情况是这样的
create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b; 对
update a set id=p_zu ; 对
update b set p_id='5'; 错
update b set p_month=p_zu; 更错
END ;经多方查找资料在以表名、列名为变量修改时,只能用动态sql了create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
yuan varchar2(200);
sql_str varchar(2000);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b ;
sql_str:='update a set '||p_month||'=8';
END ;
到这一步时可以编译成功,但是执行没结果,不能达到修改a表的把从b表选的”201202“字段列,数值修改为8,只有实现了这一步,以后才能用到游标进行遍历修改使用占位符来当列名的变量
create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
yuan varchar2(200);
sql_str varchar(2000);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b ;
sql_str:='update a set '||:1||'=8';
EXECUTE IMMEDIATE sql_str
USING p_month;
END ;
SQL> select * from a; SQL> select * from b;
ID 201201 201202 ID MONTH ZU_NO
---- ------ ------ ---- ------- -----
1 10 5 201202 15
5 20
通过存储过程实现根据b表的month字段的值去修改a表和month字段一样的,id一样的这个数值,得到以下结果
ID 201201 201202
---- ------ ------
1 10
5 15 经过循序渐进现在情况是这样的
create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b; 对
update a set id=p_zu ; 对
update b set p_id='5'; 错
update b set p_month=p_zu; 更错
END ;经多方查找资料在以表名、列名为变量修改时,只能用动态sql了create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
yuan varchar2(200);
sql_str varchar(2000);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b ;
sql_str:='update a set '||p_month||'=8';
END ;
到这一步时可以编译成功,但是执行没结果,不能达到修改a表的把从b表选的”201202“字段列,数值修改为8,只有实现了这一步,以后才能用到游标进行遍历修改使用占位符来当列名的变量
create or replace procedure tongji is
p_month varchar2(6);
p_id number(3);
p_zu number(3);
yuan varchar2(200);
sql_str varchar(2000);
BEGIN
select id,month,zu_no into p_id,p_month,p_zu from b ;
sql_str:='update a set '||:1||'=8';
EXECUTE IMMEDIATE sql_str
USING p_month;
END ;
ID 201201 201202 ID MONTH ZU_NO
---- ------ ------ ---- ------- -----
1 10 5 201202 15
上面b表的id是哪个?
10是201201?5是201202?
SQL> select * from a;
ID 201201 201202
---- ------ ------
1 10 7
5 7
SQL> select * from b;
ID MONTH ZU_NO
---- ------- -----
5 201202 15
SQL> 现在我已经通过存储过程实现了,现在正在处理如果B表有多条记录的情况,使用到了游标,请协助
create or replace procedure tongji is
p_month number;
p_id varchar2(16);
p_zu number(3);
sql_str varchar(2000);
Rcursor cursor1 is select id,month,zu_no into p_id,p_month,p_zu from b_bak ;
BEGIN
open cursor1
loop
--select id,month,zu_no into p_id,p_month,p_zu from b_bak ;
FETCH cursor1 INTO p_id,p_month,p_zu;
exit when cursor1%notfound;
-- sql_str:='update a set "'||p_month||'"=8';
sql_str:='update a_bak set "'||p_month||'"='||p_zu||' where a_bak.cstm_id='''||p_id||'''';
EXECUTE IMMEDIATE sql_str;
--USING p_id;
-- dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果
end loop;
close cursor1;
commit;
END ;
SQL> show error
Errors for PROCEDURE YUANDB.TONGJI:
LINE/COL ERROR
-------- ------------------------------------------------------------------------------------------------
6/20 PLS-00103: 出现符号 "IS"在需要下列之一时: := . ( @ % ; not null range default character
create or replace procedure tongji is
p_month number;
p_id varchar2(16);
p_zu number(3);
sql_str varchar(2000);
cursor cursor1 is select id,month,zu_no from b_bak ;
BEGIN
open cursor1;
loop
--select id,month,zu_no into p_id,p_month,p_zu from b_bak ;
FETCH cursor1 INTO p_id,p_month,p_zu;
exit when cursor1%notfound;
-- sql_str:='update a set "'||p_month||'"=8';
sql_str:='update a_bak set "'||p_month||'"='||p_zu||' where a_bak.cstm_id='''||p_id||'''';
EXECUTE IMMEDIATE sql_str;
--USING p_id;
-- dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果
end loop;
close cursor1;
commit;
END ;
using b
on (a.id = b.id)
when matched then
update set a.month = b.p_zu用b表更新a表,有这样的语法,不需要用过程