两个表 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 ;
SQL> select * from a;
ID 201201 201202
---- ------ ------
1 10
5 20
SQL> select * from b;
ID MONTH ZU_NO
---- ------- -----
5 201202 15
想要达到的效果
ID 201201 201202
---- ------ ------
1 10
5 15
create or replace procedure tongji is
p_month number;
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';
EXECUTE IMMEDIATE sql_str;
--dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果
--USING p_month;
commit;
END ;
通过引入了dbms_output.put_line(sql_str),存储过程编译成功后,通过设置set serverout on,
执行存储过程发现原先设置的sql_str结果为“update a set 201202=8”,201202没有用“”引起来所
以失败,找到原因后对原存储过程进行修改为“sql_str:='update a set "'||p_month||'"=8';”,并增加了事务提交commit; 使问题得到完美解决,下一步是想法对a表和b表进行关联或通过游标实现b表对应的ID去修改a表同样ID下变量的值,胜利在望了,特此总结一下!