一个存储过程如下:
CREATE OR REPLACE PROCEDURE AA_BB(OUTS OUT VARCHAR) IS
INSSQL   VARCHAR2(4000);
BEGIN
    INSSQL:='insert into city1 select id,cs from city where not exists(SELECT 1 FROM CITY1 WHERE CITY.ID= CITY1.ID)';  --把表city的数据 复制到city1中 id没有的,100万数据量 执行一次20秒。
    EXECUTE IMMEDIATE INSSQL;
    OUTS:=SQL%rowcount;
    COMMIT;
END;这个村粗过程如果被2个页面同时执行的话,看到city1表里有200万数据。是并发导致吗?怎么改写这个存储过程。

解决方案 »

  1.   


    --你的city表是不是沒主鍵或索引,怎麼這麼慢,我設置id為主鍵,用100萬測試,執行sp一秒
    CREATE OR REPLACE PROCEDURE AA_BB(OUTS OUT VARCHAR) IS
    INSSQL VARCHAR2(4000);
    BEGIN
      lock table city1 in exclusive mode;
      INSSQL:='insert into city1 select id,cs from city where not exists(SELECT 1 FROM CITY1 WHERE CITY.ID= CITY1.ID)'; --把表city的数据 复制到city1中 id没有的,100万数据量 执行一次20秒。
      EXECUTE IMMEDIATE INSSQL;
      OUTS:=SQL%rowcount;
      COMMIT;
    END;
    /
      

  2.   

    在id列上加索引,然后用merge into吧
      

  3.   

    在city1的id上加个主键吧,2个页面同时执行的话,有一个就会等待,最后报错了。
      

  4.   

    有别的索引的。city表里有一个obj_id是唯一索引了,
    我这个id只是举个例子的字段,它实际是  设备、日期等多个字段。
      

  5.   

    好吧,建索引,主键,
    有没有其他别的方法比如 在insert前加一行 lock table CITY1 in share row exclusive mode;
    但是这个锁一旦加上其他客户就不能操作这个的其他数据了,有没有控制一批记录的锁?