CREATE OR REPLACE PROCEDURE update_msg
(
  MSG_DATE in date,
  MSG in VARCHAR2,
  POST in VARCHAR2,
  PROV in VARCHAR2,
  CITY in VARCHAR2,
  OTHER in VARCHAR2,
  COMPANY in VARCHAR2,
  TEL in VARCHAR2,
  MSG_HASH in NUMBER
)
is
BEGIN
if MSG_HASH = 0 then
   insert into msg(MSG_DATE,msg,postcity,provfrom,cityFrom,othercityfrom,company,tel,msg_hash) values(MSG_DATE,MSG,POST,PROV,CITY,OTHER,COMPANY,TEL,MSG_HASH);
else 
   update msg set msg_date=MSG_DATE where msg_hash=MSG_HASH;
   if  sql%rowcount = 0 then
       insert into msg(MSG_DATE,msg,postcity,provfrom,cityFrom,othercityfrom,company,tel,msg_hash) values(MSG_DATE,MSG,POST,PROV,CITY,OTHER,COMPANY,TEL,MSG_HASH);
   end if;
end if;
END;
/
---------------------------
---------------------------
---------------------------
---------------------------
---------------------------
问题:第一个else后面的代码似乎只能执行一次,导致表里只有一条msg_hash为非零的数据
oracle存储过程

解决方案 »

  1.   

    不懂lz是什么意思
    update msg set msg_date=MSG_DATE where msg_hash=MSG_HASH;
    你这个sql能执行吗?
      

  2.   

    你这个是if else的单循环,你还指望他执行几次呢,你输入的是一组数据,就只能执行一次啊,除非你用游标,输入一个集什么的,然后把if放在一个for或者loop的多循环里面,才能多次执行
      

  3.   

    如果楼主传入的值是从表里面提取出来的,完全没必要这样做。只需要传一个参数就可以。后面的insert和update使用merge into语句解决,你可以看下merge into例子,很好用的,不过数据量很大就不推荐用这个了。
      

  4.   


    如果说用循环的话,需要在参数里传个list,应该怎么弄啊。。
      

  5.   

     update msg set msg_date=MSG_DATE where msg_hash=MSG_HASH;
    oracle 变量不区分大小写,你这个msg_hash是入参还是字段名称?肯定会有问题。