免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4916 | 回复: 1
打印 上一主题 下一主题

【讨论】带参数的游标的写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-23 17:40 |只看该作者 |倒序浏览
比较表中 cell_id相同的记录在两个不同时间段发生的更新,如某项发生变化则记录到另一个表 test_ne_change 中
开始写的,效率极低
  1. CREATE OR REPLACE PROCEDURE w_ne_change
  2. AS

  3.    CURSOR cur_new
  4.    IS
  5.       SELECT int_id, omc_id || ':' || msc_id || ':' || bsc_id AS related_id,
  6.              omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  7.              trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  8.              max_pdch, device_type, software_version, dumpfre_type, site_no,
  9.              cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  10.              TIMESTAMP
  11.         FROM appuser.W_C_CELL
  12.        WHERE TIMESTAMP = '2004-04-23 8' AND cell_id < 200;

  13.    CURSOR cur_old
  14.    IS
  15.       SELECT int_id, omc_id || ':' || msc_id || ':' || bsc_id AS related_id,
  16.              omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  17.              trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  18.              max_pdch, device_type, software_version, dumpfre_type, site_no,
  19.              cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  20.              TIMESTAMP
  21.         FROM appuser.W_C_CELL
  22.        WHERE TIMESTAMP = '2004-04-23 6' AND cell_id < 200;
  23. BEGIN
  24.    FOR v_new IN cur_new
  25.    LOOP
  26.       FOR v_old IN cur_old
  27.       LOOP
  28.          IF v_old.cell_id = v_new.cell_id
  29.          THEN
  30.             BEGIN
  31.                IF v_new.related_id <>; v_old.related_id
  32.                THEN
  33.                   INSERT INTO TEST_NE_CHANGE
  34.                               (omc_id, omc_int_id,
  35.                                ne_id, old_value,
  36.                                now_value, modify_item,
  37.                                modify_time
  38.                               )
  39.                        VALUES (v_new.omc_id, v_new.omc_int_id,
  40.                                v_new.cell_id, v_old.related_id,
  41.                                v_new.related_id, 'related_id',
  42.                                v_new.TIMESTAMP
  43.                               );

  44.                   COMMIT;
  45.                  
  46.                END IF;
  47.             END;
  48.          END IF;
  49.       END LOOP;
  50.    END LOOP;
  51. END;
复制代码


效率太慢了,如果有一万条数据比较的话就超慢。高手们帮我看看吧

论坛徽章:
0
2 [报告]
发表于 2004-04-23 18:40 |只看该作者

【讨论】带参数的游标的写法

如此改了一下,效率高了不少 :)

  1. CREATE OR REPLACE PROCEDURE x_ne_change
  2. AS
  3.    CURSOR cur_new
  4.    IS
  5.       SELECT int_id, omc_id || ':' || msc_id || ':' || bsc_id AS related_id,
  6.              omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  7.              trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  8.              max_pdch, device_type, software_version, dumpfre_type, site_no,
  9.              cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  10.              TIMESTAMP
  11.         FROM appuser.K_C_CELL
  12.        WHERE TIMESTAMP = '2004-04-23 8' AND cell_id < 2000;

  13.    CURSOR cur_old (c_no NUMBER)
  14.    IS
  15.       SELECT int_id, omc_id || ':' || msc_id || ':' || bsc_id AS related_id,
  16.              omc_id, msc_id, bsc_id, ne_name, cell_id, lac, freq_band,
  17.              trx_count, tch, sdcch, gprs_enabled, gprs_trx, dedicated_pdch,
  18.              max_pdch, device_type, software_version, dumpfre_type, site_no,
  19.              cell_no, rac, ncc, bcc, sms_cb_used, bsc_omc_int_id, omc_int_id,
  20.              TIMESTAMP
  21.         FROM appuser.K_C_CELL
  22.        WHERE TIMESTAMP = '2004-04-21 6' AND cell_id = c_no;
  23. BEGIN
  24.    FOR v_new IN cur_new
  25.    LOOP
  26.       FOR v_old IN cur_old (v_new.cell_id)
  27.       LOOP
  28.          BEGIN
  29.             IF v_new.related_id <>; v_old.related_id
  30.             THEN
  31.                INSERT INTO TEST_NE_CHANGE
  32.                            (omc_id, omc_int_id, ne_id,
  33.                             old_value, now_value,
  34.                             modify_item, modify_time
  35.                            )
  36.                     VALUES (v_new.omc_id, v_new.omc_int_id, v_new.cell_id,
  37.                             v_old.related_id, v_new.related_id,
  38.                             'related_id', v_new.TIMESTAMP
  39.                            );

  40.                COMMIT;
  41.             END IF;

  42.             IF v_new.tch <>; v_old.tch
  43.             THEN
  44.                INSERT INTO TEST_NE_CHANGE
  45.                            (omc_id, omc_int_id, ne_id,
  46.                             old_value, now_value, modify_item, modify_time
  47.                            )
  48.                     VALUES (v_new.omc_id, v_new.omc_int_id, v_new.cell_id,
  49.                             v_old.tch, v_new.tch, 'TCH', v_new.TIMESTAMP
  50.                            );

  51.                COMMIT;
  52.             END IF;
  53.          END;
  54.       END LOOP;
  55.    END LOOP;
  56. END;
  57. /
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP