OracleSQL精妙SQL语句讲解

来源:Oracle认证    发布时间:2012-11-12    Oracle认证视频    评论

  -- 逐行提交

  DECLARE

  BEGIN

  FOR cur IN (SELECT * FROM user_objects) LOOP

  INSERT INTO t_loop VALUES cur;

  COMMIT;

  END LOOP;

  END;

  -- 模拟批量提交http://blog.knowsky.com/

  DECLARE

  v_count NUMBER;

  BEGIN

  FOR cur IN (SELECT * FROM user_objects) LOOP

  INSERT INTO t_loop VALUES cur;

  v_count := v_count + 1;

  IF v_count >= 100 THEN

  COMMIT;

  END IF;

  END LOOP;

  COMMIT;

  END;

  -- 真正的批量提交

  DECLARE

  CURSOR cur IS

  SELECT * FROM user_objects;

  TYPE rec IS TABLE OF user_objects%ROWTYPE;

  recs rec;

  BEGIN

  OPEN cur;

  WHILE (TRUE) LOOP

  FETCH cur BULK COLLECT

  INTO recs LIMIT 100;

  -- forall 实现批量

  FORALL i IN 1 .. recs.COUNT

  INSERT INTO t_loop VALUES recs (i);

  COMMIT;

  EXIT WHEN cur%NOTFOUND;

  END LOOP;

  CLOSE cur;

  END;

  -- 悲观锁定/乐观锁定

  DROP TABLE t_lock PURGE;

  CREATE TABLE t_lock AS SELECT 1 ID FROM dual;

  SELECT * FROM t_lock;

  -- 常见的实现逻辑,隐含bug

  DECLARE

  v_cnt NUMBER;

  BEGIN

  -- 这里有并发性的bug

  SELECT MAX(ID) INTO v_cnt FROM t_lock;

  -- here for other operation

  v_cnt := v_cnt + 1;

  INSERT INTO t_lock (ID) VALUES (v_cnt);

  COMMIT;

  END;

  -- 高并发环境下,安全的实现逻辑

  DECLARE

  v_cnt NUMBER;

  BEGIN

  -- 对指定的行取得lock

  SELECT ID INTO v_cnt FROM t_lock WHERE ID=1 FOR UPDATE;

  -- 在有lock的情况下继续下面的操作

  SELECT MAX(ID) INTO v_cnt FROM t_lock;

  -- here for other operation

  v_cnt := v_cnt + 1;

  INSERT INTO t_lock (ID) VALUES (v_cnt);

  COMMIT; --提交并且释放lock

  END;

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答