• 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率


    我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据:

    我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目的表中去

    1、需要同步的数据表结构:WSFMDJ

      1 -- Create table
      2 create table WSFMDJ
      3 (
      4   newid         VARCHAR2(32) not null,
      5   reghospital   VARCHAR2(8),
      6   hospitalid    VARCHAR2(20),
      7   regname       VARCHAR2(20),
      8   regaac002     VARCHAR2(20),
      9   regmz         VARCHAR2(6),
     10   regblood      VARCHAR2(6),
     11   regage        NUMBER(10),
     12   regspousename VARCHAR2(50),
     13   regphone      VARCHAR2(20),
     14   regjsjh       VARCHAR2(20),
     15   regcsjh       VARCHAR2(20),
     16   regaddres     VARCHAR2(100),
     17   regyunci      VARCHAR2(10) default 1,
     18   regchanci     VARCHAR2(10) default 1,
     19   regyunzhou    VARCHAR2(10),
     20   redeverydate  NUMBER(10),
     21   regcheckcount VARCHAR2(10),
     22   regtaiershu   VARCHAR2(10),
     23   regtaifangw   VARCHAR2(50),
     24   regtaifangws  VARCHAR2(50),
     25   yangshuiqkxz  VARCHAR2(50),
     26   yangshuiqkl   VARCHAR2(50),
     27   yangshuiqk    VARCHAR2(100),
     28   regjdqkms     VARCHAR2(8),
     29   regjdrjzs     NUMBER(10),
     30   regjdlong     NUMBER(10,2),
     31   regpomo       VARCHAR2(50),
     32   regpomodes    VARCHAR2(100),
     33   regfmfs       VARCHAR2(6),
     34   regccfirstd   NUMBER(10) default 0,
     35   regccfirstm   NUMBER(10) default 0,
     36   regccsecondd  NUMBER(10) default 0,
     37   regccsecondm  NUMBER(10) default 0,
     38   regccthreed   NUMBER(10) default 0,
     39   regccthreem   NUMBER(10) default 0,
     40   regchanchen   VARCHAR2(6) default 0,
     41   regchanchenm  NUMBER(10),
     42   reghyqk       VARCHAR2(6),
     43   reghyqkdes    VARCHAR2(100),
     44   reggjqk       VARCHAR2(100),
     45   regtaipan     VARCHAR2(50),
     46   regtaipanwzqk VARCHAR2(50),
     47   regtaipanxz   VARCHAR2(50),
     48   regtaipanqt   VARCHAR2(100),
     49   regcscxl      NUMBER(10,2),
     50   regchcxl      NUMBER(10,2),
     51   reglcgwpd     VARCHAR2(50),
     52   regchansfmys  VARCHAR2(50),
     53   regyuncqbfz   VARCHAR2(100),
     54   birthdate     DATE,
     55   regyeqksex    VARCHAR2(4),
     56   regyeqkbody   NUMBER(10,2),
     57   regyeqkheight NUMBER(10,2),
     58   regyeqkpf     VARCHAR2(8),
     59   regyeqkpfs    VARCHAR2(8),
     60   regyeqkpft    VARCHAR2(8),
     61   regyeqkfmjg   VARCHAR2(50),
     62   regjkzk       VARCHAR2(6),
     63   regyeqkcsqx   VARCHAR2(50),
     64   regyeqkfmsw   VARCHAR2(8),
     65   regyeqkswyy   VARCHAR2(50),
     66   regdeathtime  DATE,
     67   regyeqkfmqj   VARCHAR2(8),
     68   regyeqkbfz    VARCHAR2(50),
     69   regzjc        VARCHAR2(8),
     70   regzjcsj      DATE,
     71   regzysj       VARCHAR2(8),
     72   regzysjdate   DATE,
     73   regqydss      VARCHAR2(50),
     74   regqydsssj    DATE,
     75   regsfcjdx     VARCHAR2(8),
     76   regcompjys    VARCHAR2(8),
     77   regcfjys      VARCHAR2(8),
     78   regjsff       VARCHAR2(6),
     79   regjsys       VARCHAR2(100),
     80   regsyz        VARCHAR2(100),
     81   regremark     VARCHAR2(100),
     82   regtime       DATE,
     83   regauthor     VARCHAR2(50),
     84   altertime     DATE,
     85   alterauthor   VARCHAR2(50)
     86 )
     87 tablespace WSJDB
     88   pctfree 10
     89   initrans 1
     90   maxtrans 255
     91   storage
     92   (
     93     initial 64K
     94     next 8K
     95     minextents 1
     96     maxextents unlimited
     97   );
     98 -- Add comments to the table 
     99 comment on table WSFMDJ
    100   is '分娩登记信息';
    101 -- Add comments to the columns 
    102 comment on column WSFMDJ.newid
    103   is '序列号';
    104 comment on column WSFMDJ.reghospital
    105   is '所属医院编码';
    106 comment on column WSFMDJ.hospitalid
    107   is '住院号';
    108 comment on column WSFMDJ.regname
    109   is '产妇姓名';
    110 comment on column WSFMDJ.regaac002
    111   is '产妇身份证号';
    112 comment on column WSFMDJ.regmz
    113   is '民族';
    114 comment on column WSFMDJ.regblood
    115   is '血型';
    116 comment on column WSFMDJ.regage
    117   is '年龄';
    118 comment on column WSFMDJ.regspousename
    119   is '配偶姓名';
    120 comment on column WSFMDJ.regphone
    121   is '联系电话';
    122 comment on column WSFMDJ.regjsjh
    123   is '计生证号';
    124 comment on column WSFMDJ.regcsjh
    125   is '出生证号';
    126 comment on column WSFMDJ.regaddres
    127   is '现住地址';
    128 comment on column WSFMDJ.regyunci
    129   is '孕次';
    130 comment on column WSFMDJ.regchanci
    131   is '产次';
    132 comment on column WSFMDJ.regyunzhou
    133   is '孕周';
    134 comment on column WSFMDJ.redeverydate
    135   is '天数';
    136 comment on column WSFMDJ.regcheckcount
    137   is '在本院检查次数';
    138 comment on column WSFMDJ.regtaiershu
    139   is '胎儿数';
    140 comment on column WSFMDJ.regtaifangw
    141   is '胎方位一级';
    142 comment on column WSFMDJ.regtaifangws
    143   is '胎方位二级';
    144 comment on column WSFMDJ.yangshuiqkxz
    145   is '羊水性质';
    146 comment on column WSFMDJ.yangshuiqkl
    147   is '羊水量概况';
    148 comment on column WSFMDJ.yangshuiqk
    149   is '羊水情况量描述(ml)毫升';
    150 comment on column WSFMDJ.regjdqkms
    151   is '脐带情况描述(附注)';
    152 comment on column WSFMDJ.regjdrjzs
    153   is '脐带绕颈周数';
    154 comment on column WSFMDJ.regjdlong
    155   is '脐带长度(cm)';
    156 comment on column WSFMDJ.regpomo
    157   is '破膜方式';
    158 comment on column WSFMDJ.regpomodes
    159   is '破膜描述';
    160 comment on column WSFMDJ.regfmfs
    161   is '分娩方式';
    162 comment on column WSFMDJ.regccfirstd
    163   is '产程一用时';
    164 comment on column WSFMDJ.regccfirstm
    165   is '产程一用分';
    166 comment on column WSFMDJ.regccsecondd
    167   is '产程二用时';
    168 comment on column WSFMDJ.regccsecondm
    169   is '产程二用分';
    170 comment on column WSFMDJ.regccthreed
    171   is '产程三用时';
    172 comment on column WSFMDJ.regccthreem
    173   is '产程三用分';
    174 comment on column WSFMDJ.regchanchen
    175   is '累计产程用时';
    176 comment on column WSFMDJ.regchanchenm
    177   is '累计产程用分';
    178 comment on column WSFMDJ.reghyqk
    179   is '开口方式';
    180 comment on column WSFMDJ.reghyqkdes
    181   is '会阴情况描述(cm)';
    182 comment on column WSFMDJ.reggjqk
    183   is '宫颈情况';
    184 comment on column WSFMDJ.regtaipan
    185   is '胎盘脱落方式';
    186 comment on column WSFMDJ.regtaipanwzqk
    187   is '胎盘完整情况';
    188 comment on column WSFMDJ.regtaipanxz
    189   is '胎盘性质';
    190 comment on column WSFMDJ.regtaipanqt
    191   is '胎盘重量G';
    192 comment on column WSFMDJ.regcscxl
    193   is '产时出血量/术中(ml)';
    194 comment on column WSFMDJ.regchcxl
    195   is '产后2小时出血量(ml)';
    196 comment on column WSFMDJ.reglcgwpd
    197   is '临产高危评定';
    198 comment on column WSFMDJ.regchansfmys
    199   is '产时分娩因素/主要手术指征';
    200 comment on column WSFMDJ.regyuncqbfz
    201   is '孕产期并发症';
    202 comment on column WSFMDJ.birthdate
    203   is '出生时间';
    204 comment on column WSFMDJ.regyeqksex
    205   is '婴儿性别';
    206 comment on column WSFMDJ.regyeqkbody
    207   is '婴儿体重';
    208 comment on column WSFMDJ.regyeqkheight
    209   is '婴儿身高';
    210 comment on column WSFMDJ.regyeqkpf
    211   is '婴儿评分1MIN';
    212 comment on column WSFMDJ.regyeqkpfs
    213   is '婴儿评分5MIN';
    214 comment on column WSFMDJ.regyeqkpft
    215   is '婴儿评分10MIN';
    216 comment on column WSFMDJ.regyeqkfmjg
    217   is '分娩结果';
    218 comment on column WSFMDJ.regjkzk
    219   is '健康状况';
    220 comment on column WSFMDJ.regyeqkcsqx
    221   is '婴儿出生缺陷';
    222 comment on column WSFMDJ.regyeqkfmsw
    223   is '新生儿死亡';
    224 comment on column WSFMDJ.regyeqkswyy
    225   is '婴儿死亡原因';
    226 comment on column WSFMDJ.regdeathtime
    227   is '死亡时间';
    228 comment on column WSFMDJ.regyeqkfmqj
    229   is '是否婴儿插管抢救';
    230 comment on column WSFMDJ.regyeqkbfz
    231   is '新生儿并发症';
    232 comment on column WSFMDJ.regzjc
    233   is '是否早接触';
    234 comment on column WSFMDJ.regzjcsj
    235   is '早接触时间';
    236 comment on column WSFMDJ.regzysj
    237   is '是否早吸吮';
    238 comment on column WSFMDJ.regzysjdate
    239   is '早吸吮时间';
    240 comment on column WSFMDJ.regqydss
    241   is '是否取阴道塞纱';
    242 comment on column WSFMDJ.regqydsssj
    243   is '取阴道塞纱时间';
    244 comment on column WSFMDJ.regsfcjdx
    245   is '是否采脐带血';
    246 comment on column WSFMDJ.regcompjys
    247   is '是否落实绝育术';
    248 comment on column WSFMDJ.regcfjys
    249   is '绝育术类型';
    250 comment on column WSFMDJ.regjsff
    251   is '接生方法';
    252 comment on column WSFMDJ.regjsys
    253   is '接生医生';
    254 comment on column WSFMDJ.regsyz
    255   is '护婴者';
    256 comment on column WSFMDJ.regremark
    257   is '备注';
    258 comment on column WSFMDJ.regtime
    259   is '登记时间/数据写入时间';
    260 comment on column WSFMDJ.regauthor
    261   is '登记人员';
    262 comment on column WSFMDJ.altertime
    263   is '修改时间';
    264 comment on column WSFMDJ.alterauthor
    265   is '修改人员';
    266 -- Create/Recreate primary, unique and foreign key constraints 
    267 alter table WSFMDJ
    268   add constraint PK_WSFMDJ primary key (NEWID)
    269   using index 
    270   tablespace USERS
    271   pctfree 10
    272   initrans 2
    273   maxtrans 255
    274   storage
    275   (
    276     initial 64K
    277     next 1M
    278     minextents 1
    279     maxextents unlimited
    280   );

    2、创建数据同步目的表:WSFMDJBAK

      1 -- Create table
      2 create table WSFMDJBAK
      3 (
      4   newid         VARCHAR2(32) not null,
      5   reghospital   VARCHAR2(8),
      6   hospitalid    VARCHAR2(20),
      7   regname       VARCHAR2(20),
      8   regaac002     VARCHAR2(20),
      9   regmz         VARCHAR2(6),
     10   regblood      VARCHAR2(6),
     11   regage        NUMBER(10),
     12   regspousename VARCHAR2(50),
     13   regphone      VARCHAR2(20),
     14   regjsjh       VARCHAR2(20),
     15   regcsjh       VARCHAR2(20),
     16   regaddres     VARCHAR2(100),
     17   regyunci      VARCHAR2(10) default 1,
     18   regchanci     VARCHAR2(10) default 1,
     19   regyunzhou    VARCHAR2(10),
     20   redeverydate  NUMBER(10),
     21   regcheckcount VARCHAR2(10),
     22   regtaiershu   VARCHAR2(10),
     23   regtaifangw   VARCHAR2(50),
     24   regtaifangws  VARCHAR2(50),
     25   yangshuiqkxz  VARCHAR2(50),
     26   yangshuiqkl   VARCHAR2(50),
     27   yangshuiqk    VARCHAR2(100),
     28   regjdqkms     VARCHAR2(8),
     29   regjdrjzs     NUMBER(10),
     30   regjdlong     NUMBER(10,2),
     31   regpomo       VARCHAR2(50),
     32   regpomodes    VARCHAR2(100),
     33   regfmfs       VARCHAR2(6),
     34   regccfirstd   NUMBER(10) default 0,
     35   regccfirstm   NUMBER(10) default 0,
     36   regccsecondd  NUMBER(10) default 0,
     37   regccsecondm  NUMBER(10) default 0,
     38   regccthreed   NUMBER(10) default 0,
     39   regccthreem   NUMBER(10) default 0,
     40   regchanchen   VARCHAR2(6) default 0,
     41   regchanchenm  NUMBER(10),
     42   reghyqk       VARCHAR2(6),
     43   reghyqkdes    VARCHAR2(100),
     44   reggjqk       VARCHAR2(100),
     45   regtaipan     VARCHAR2(50),
     46   regtaipanwzqk VARCHAR2(50),
     47   regtaipanxz   VARCHAR2(50),
     48   regtaipanqt   VARCHAR2(100),
     49   regcscxl      NUMBER(10,2),
     50   regchcxl      NUMBER(10,2),
     51   reglcgwpd     VARCHAR2(50),
     52   regchansfmys  VARCHAR2(50),
     53   regyuncqbfz   VARCHAR2(100),
     54   birthdate     DATE,
     55   regyeqksex    VARCHAR2(4),
     56   regyeqkbody   NUMBER(10,2),
     57   regyeqkheight NUMBER(10,2),
     58   regyeqkpf     VARCHAR2(8),
     59   regyeqkpfs    VARCHAR2(8),
     60   regyeqkpft    VARCHAR2(8),
     61   regyeqkfmjg   VARCHAR2(50),
     62   regjkzk       VARCHAR2(6),
     63   regyeqkcsqx   VARCHAR2(50),
     64   regyeqkfmsw   VARCHAR2(8),
     65   regyeqkswyy   VARCHAR2(50),
     66   regdeathtime  DATE,
     67   regyeqkfmqj   VARCHAR2(8),
     68   regyeqkbfz    VARCHAR2(50),
     69   regzjc        VARCHAR2(8),
     70   regzjcsj      DATE,
     71   regzysj       VARCHAR2(8),
     72   regzysjdate   DATE,
     73   regqydss      VARCHAR2(50),
     74   regqydsssj    DATE,
     75   regsfcjdx     VARCHAR2(8),
     76   regcompjys    VARCHAR2(8),
     77   regcfjys      VARCHAR2(8),
     78   regjsff       VARCHAR2(6),
     79   regjsys       VARCHAR2(100),
     80   regsyz        VARCHAR2(100),
     81   regremark     VARCHAR2(100),
     82   regtime       DATE,
     83   regauthor     VARCHAR2(50),
     84   altertime     DATE,
     85   alterauthor   VARCHAR2(50),
     86   options       VARCHAR2(6)
     87 )
     88 tablespace WSJDB
     89   pctfree 10
     90   initrans 1
     91   maxtrans 255
     92   storage
     93   (
     94     initial 64K
     95     next 8K
     96     minextents 1
     97     maxextents unlimited
     98   );
     99 -- Add comments to the table 
    100 comment on table WSFMDJBAK
    101   is '分娩登记信息备份表';
    102 -- Add comments to the columns 
    103 comment on column WSFMDJBAK.newid
    104   is '序列号';
    105 comment on column WSFMDJBAK.reghospital
    106   is '所属医院编码';
    107 comment on column WSFMDJBAK.hospitalid
    108   is '住院号';
    109 comment on column WSFMDJBAK.regname
    110   is '产妇姓名';
    111 comment on column WSFMDJBAK.regaac002
    112   is '产妇身份证号';
    113 comment on column WSFMDJBAK.regmz
    114   is '民族';
    115 comment on column WSFMDJBAK.regblood
    116   is '血型';
    117 comment on column WSFMDJBAK.regage
    118   is '年龄';
    119 comment on column WSFMDJBAK.regspousename
    120   is '配偶姓名';
    121 comment on column WSFMDJBAK.regphone
    122   is '联系电话';
    123 comment on column WSFMDJBAK.regjsjh
    124   is '计生证号';
    125 comment on column WSFMDJBAK.regcsjh
    126   is '出生证号';
    127 comment on column WSFMDJBAK.regaddres
    128   is '现住地址';
    129 comment on column WSFMDJBAK.regyunci
    130   is '孕次';
    131 comment on column WSFMDJBAK.regchanci
    132   is '产次';
    133 comment on column WSFMDJBAK.regyunzhou
    134   is '孕周';
    135 comment on column WSFMDJBAK.redeverydate
    136   is '天数';
    137 comment on column WSFMDJBAK.regcheckcount
    138   is '在本院检查次数';
    139 comment on column WSFMDJBAK.regtaiershu
    140   is '胎儿数';
    141 comment on column WSFMDJBAK.regtaifangw
    142   is '胎方位一级';
    143 comment on column WSFMDJBAK.regtaifangws
    144   is '胎方位二级';
    145 comment on column WSFMDJBAK.yangshuiqkxz
    146   is '羊水性质';
    147 comment on column WSFMDJBAK.yangshuiqkl
    148   is '羊水量概况';
    149 comment on column WSFMDJBAK.yangshuiqk
    150   is '羊水情况量描述(ml)毫升';
    151 comment on column WSFMDJBAK.regjdqkms
    152   is '脐带情况描述(附注)';
    153 comment on column WSFMDJBAK.regjdrjzs
    154   is '脐带绕颈周数';
    155 comment on column WSFMDJBAK.regjdlong
    156   is '脐带长度(cm)';
    157 comment on column WSFMDJBAK.regpomo
    158   is '破膜方式';
    159 comment on column WSFMDJBAK.regpomodes
    160   is '破膜描述';
    161 comment on column WSFMDJBAK.regfmfs
    162   is '分娩方式';
    163 comment on column WSFMDJBAK.regccfirstd
    164   is '产程一用时';
    165 comment on column WSFMDJBAK.regccfirstm
    166   is '产程一用分';
    167 comment on column WSFMDJBAK.regccsecondd
    168   is '产程二用时';
    169 comment on column WSFMDJBAK.regccsecondm
    170   is '产程二用分';
    171 comment on column WSFMDJBAK.regccthreed
    172   is '产程三用时';
    173 comment on column WSFMDJBAK.regccthreem
    174   is '产程三用分';
    175 comment on column WSFMDJBAK.regchanchen
    176   is '累计产程用时';
    177 comment on column WSFMDJBAK.regchanchenm
    178   is '累计产程用分';
    179 comment on column WSFMDJBAK.reghyqk
    180   is '开口方式';
    181 comment on column WSFMDJBAK.reghyqkdes
    182   is '会阴情况描述(cm)';
    183 comment on column WSFMDJBAK.reggjqk
    184   is '宫颈情况';
    185 comment on column WSFMDJBAK.regtaipan
    186   is '胎盘脱落方式';
    187 comment on column WSFMDJBAK.regtaipanwzqk
    188   is '胎盘完整情况';
    189 comment on column WSFMDJBAK.regtaipanxz
    190   is '胎盘性质';
    191 comment on column WSFMDJBAK.regtaipanqt
    192   is '胎盘重量G';
    193 comment on column WSFMDJBAK.regcscxl
    194   is '产时出血量/术中(ml)';
    195 comment on column WSFMDJBAK.regchcxl
    196   is '产后2小时出血量(ml)';
    197 comment on column WSFMDJBAK.reglcgwpd
    198   is '临产高危评定';
    199 comment on column WSFMDJBAK.regchansfmys
    200   is '产时分娩因素/主要手术指征';
    201 comment on column WSFMDJBAK.regyuncqbfz
    202   is '孕产期并发症';
    203 comment on column WSFMDJBAK.birthdate
    204   is '出生时间';
    205 comment on column WSFMDJBAK.regyeqksex
    206   is '婴儿性别';
    207 comment on column WSFMDJBAK.regyeqkbody
    208   is '婴儿体重';
    209 comment on column WSFMDJBAK.regyeqkheight
    210   is '婴儿身高';
    211 comment on column WSFMDJBAK.regyeqkpf
    212   is '婴儿评分1MIN';
    213 comment on column WSFMDJBAK.regyeqkpfs
    214   is '婴儿评分5MIN';
    215 comment on column WSFMDJBAK.regyeqkpft
    216   is '婴儿评分10MIN';
    217 comment on column WSFMDJBAK.regyeqkfmjg
    218   is '分娩结果';
    219 comment on column WSFMDJBAK.regjkzk
    220   is '健康状况';
    221 comment on column WSFMDJBAK.regyeqkcsqx
    222   is '婴儿出生缺陷';
    223 comment on column WSFMDJBAK.regyeqkfmsw
    224   is '新生儿死亡';
    225 comment on column WSFMDJBAK.regyeqkswyy
    226   is '婴儿死亡原因';
    227 comment on column WSFMDJBAK.regdeathtime
    228   is '死亡时间';
    229 comment on column WSFMDJBAK.regyeqkfmqj
    230   is '是否婴儿插管抢救';
    231 comment on column WSFMDJBAK.regyeqkbfz
    232   is '新生儿并发症';
    233 comment on column WSFMDJBAK.regzjc
    234   is '是否早接触';
    235 comment on column WSFMDJBAK.regzjcsj
    236   is '早接触时间';
    237 comment on column WSFMDJBAK.regzysj
    238   is '是否早吸吮';
    239 comment on column WSFMDJBAK.regzysjdate
    240   is '早吸吮时间';
    241 comment on column WSFMDJBAK.regqydss
    242   is '是否取阴道塞纱';
    243 comment on column WSFMDJBAK.regqydsssj
    244   is '取阴道塞纱时间';
    245 comment on column WSFMDJBAK.regsfcjdx
    246   is '是否采脐带血';
    247 comment on column WSFMDJBAK.regcompjys
    248   is '是否落实绝育术';
    249 comment on column WSFMDJBAK.regcfjys
    250   is '绝育术类型';
    251 comment on column WSFMDJBAK.regjsff
    252   is '接生方法';
    253 comment on column WSFMDJBAK.regjsys
    254   is '接生医生';
    255 comment on column WSFMDJBAK.regsyz
    256   is '护婴者';
    257 comment on column WSFMDJBAK.regremark
    258   is '备注';
    259 comment on column WSFMDJBAK.regtime
    260   is '登记时间/数据写入时间';
    261 comment on column WSFMDJBAK.regauthor
    262   is '登记人员';
    263 comment on column WSFMDJBAK.altertime
    264   is '修改时间';
    265 comment on column WSFMDJBAK.alterauthor
    266   is '修改人员';
    267 comment on column WSFMDJBAK.options
    268   is '操作类型(0/正常)(1/已经修改)(2/无效)(3/新增数据)';
    269 -- Create/Recreate primary, unique and foreign key constraints 
    270 alter table WSFMDJBAK
    271   add constraint PK_WSFMDJBAK primary key (NEWID)
    272   using index 
    273   tablespace USERS
    274   pctfree 10
    275   initrans 2
    276   maxtrans 255
    277   storage
    278   (
    279     initial 64K
    280     next 1M
    281     minextents 1
    282     maxextents unlimited
    283   );

    3、创建多线程处理日志记录表:

     1 -- Create table
     2 create table PROCESS_JOB
     3 (
     4   process_id   VARCHAR2(32) not null,
     5   proce_name   VARCHAR2(100),
     6   process_des  VARCHAR2(100),
     7   process_code NUMBER(10),
     8   process_mesg VARCHAR2(100),
     9   process_date DATE
    10 )
    11 tablespace USERS
    12   pctfree 10
    13   initrans 1
    14   maxtrans 255
    15   storage
    16   (
    17     initial 64K
    18     next 8K
    19     minextents 1
    20     maxextents unlimited
    21   );
    22 -- Add comments to the table 
    23 comment on table PROCESS_JOB
    24   is '过程日志记录表';
    25 -- Add comments to the columns 
    26 comment on column PROCESS_JOB.process_id
    27   is '记录线程日志的主键ID';
    28 comment on column PROCESS_JOB.proce_name
    29   is '存取过程名称';
    30 comment on column PROCESS_JOB.process_des
    31   is '日志描述';
    32 comment on column PROCESS_JOB.process_code
    33   is '执行信息代码(100001/存在执行的线程|100002/存取过程出错|100003/记录动作说明)';
    34 comment on column PROCESS_JOB.process_mesg
    35   is '错误信息';
    36 comment on column PROCESS_JOB.process_date
    37   is '记录日志时间';
    38 -- Create/Recreate primary, unique and foreign key constraints 
    39 alter table PROCESS_JOB
    40   add constraint PK_PROCESS_JOB primary key (PROCESS_ID)
    41   using index 
    42   tablespace USERS
    43   pctfree 10
    44   initrans 2
    45   maxtrans 255
    46   storage
    47   (
    48     initial 64K
    49     next 1M
    50     minextents 1
    51     maxextents unlimited
    52   );

    4、创建多线程处理分组表:

    -- Create table
    create table PROCESS_GROUPS
    (
      xh         VARCHAR2(32),
      table_name VARCHAR2(50),
      sign_code  VARCHAR2(3) default '0',
      start_time DATE,
      end_time   DATE,
      thread_num VARCHAR2(3),
      err_mesg   VARCHAR2(200),
      pro_code   VARCHAR2(5),
      spare1     VARCHAR2(50),
      spare2     VARCHAR2(50)
    )
    tablespace USERS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
      );
    -- Add comments to the table 
    comment on table PROCESS_GROUPS
      is '多线程处理分组表';
    -- Add comments to the columns 
    comment on column PROCESS_GROUPS.xh
      is '序号(被处理数据的主键ID)';
    comment on column PROCESS_GROUPS.table_name
      is '被处理的表名称';
    comment on column PROCESS_GROUPS.sign_code
      is '执行标志(0未执行,1正在执行,2执行成功,3执行失败)';
    comment on column PROCESS_GROUPS.start_time
      is '开始时间';
    comment on column PROCESS_GROUPS.end_time
      is '终止时间';
    comment on column PROCESS_GROUPS.thread_num
      is '线程号';
    comment on column PROCESS_GROUPS.err_mesg
      is '错误信息';
    comment on column PROCESS_GROUPS.pro_code
      is '错误代码';
    comment on column PROCESS_GROUPS.spare1
      is '备用字段1';
    comment on column PROCESS_GROUPS.spare2
      is '备用字段2';
    -- Create/Recreate indexes 
    create index IND_PROCESS_GROUPS_SIGN_CODE on PROCESS_GROUPS (SIGN_CODE)
      tablespace USERS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
      );
    create index IND_PROCESS_GROUPS_TABLENAME on PROCESS_GROUPS (TABLE_NAME)
      tablespace USERS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
      );

    5、创建多线程分组处理备份表:

     1 -- Create table
     2 create table PROCESS_GROUPS_BAK
     3 (
     4   xh         VARCHAR2(32),
     5   table_name VARCHAR2(50),
     6   sign_code  VARCHAR2(3),
     7   start_time DATE,
     8   end_time   DATE,
     9   thread_num VARCHAR2(3),
    10   err_mesg   VARCHAR2(200),
    11   pro_code   VARCHAR2(5),
    12   spare1     VARCHAR2(50),
    13   spare2     VARCHAR2(50)
    14 )
    15 tablespace USERS
    16   pctfree 10
    17   initrans 1
    18   maxtrans 255
    19   storage
    20   (
    21     initial 64K
    22     next 1M
    23     minextents 1
    24     maxextents unlimited
    25   );

    上述全部初始化工作已经完成,下面编写PLSQL  上干货,完成多线程处理

    新建立PLSQL程序包和体

     1 CREATE OR REPLACE PACKAGE PAK_多线程同步数据 IS
     2 
     3   DFF_OK  CONSTANT NUMBER := 0; -- 成功
     4   DFF_ERR CONSTANT NUMBER := -1; -- 系统错误(不能定义大于0的值)
     5   TYPE MY_CURSOR IS REF CURSOR;
     6 
     7   PROCEDURE PRC_多线程_日志记录(PRM_PROCE_NAME IN VARCHAR2,
     8                                PRM_PROCE_DES  IN VARCHAR2,
     9                                PRM_PROCE_CODE IN VARCHAR2,
    10                                   PRO_PROCE_MESG IN VARCHAR2,
    11                                PRM_APPCODE    OUT NUMBER,
    12                                PRM_ERRMSG     OUT VARCHAR2);
    13                                                             
    14   PROCEDURE PRC_多线程_执行的线程(PRM_BZ       OUT NUMBER,
    15                                  PRM_APPCODE  OUT NUMBER,
    16                                  PRM_ERRMESG  OUT VARCHAR2);                               
    17                                
    18   PROCEDURE PRC_多线程_入口(PARAMETERS_ID  IN VARCHAR2,
    19                            PRM_APPCODE    OUT NUMBER,
    20                            PRM_ERRMESG    OUT VARCHAR2);
    21                            
    22   PROCEDURE PRC_WSFMDJBAK_数据同步(PARAMETERS_ID   IN VARCHAR2,
    23                                   PRM_APPCODE      OUT NUMBER,
    24                                   PRM_ERRMESG      OUT VARCHAR2);
    25                                   
    26   PROCEDURE PRC_多线程调用(PARAMETERS_ID    IN VARCHAR2,
    27                           PRM_APPCODE       OUT NUMBER,
    28                           PRM_ERRMESG       OUT VARCHAR2);  
    29                           
    30   PROCEDURE PRC_单线调用接口(PRM_线程号     IN VARCHAR2,
    31                             PRM_APPCODE    OUT NUMBER,
    32                             PRM_ERRMESG    OUT VARCHAR2);
    33   
    34   PROCEDURE PRC_数据同步(PRM_NEWID         IN VARCHAR2, 
    35                         PRM_APPCODE        OUT NUMBER, 
    36                         PRM_ERRMESG        OUT VARCHAR2);                            
    37                             
    38   PROCEDURE PRC_读线程分组表数据(PRM_线程号    IN VARCHAR2, 
    39                                 RID           OUT ROWID, 
    40                                 PRM_APPCODE   OUT NUMBER, 
    41                                 PRM_ERRMESG   OUT VARCHAR2);                                                      
    42                              
    43   PROCEDURE GET_CURSOR_WSFMDJ(PARAMETERS_ID    IN VARCHAR2,
    44                               CURSOR_WSFMDJ    OUT MY_CURSOR);                                                                                
    45 END PAK_多线程同步数据;

    编写具体的PLSQL函数功能实现:

      1 CREATE OR REPLACE PACKAGE BODY PAK_多线程同步数据 IS
      2 /*-------------------------------------------------------------------------------------
      3 ** 过程名称 :PRC_多线程_日志记录
      4 ** 功能描述 :多线程调用处理,日志记录功能
      5 ** 参数描述 :参数标识             名称                       输入输出         类型
      6 ** --------------------------------------------------------------------------------
      7 **            PRM_PROCE_NAME    调用的存取过程名称               输入        VARCHAR2
      8 **            PRM_PROCE_DES     日志描述                        输入        VARCHAR2
      9 **            PRM_PROCE_CODE    日志记录代码                    输入        VARCHAR2
     10 **            PRO_PROCE_MESG   日志记录错误信息                 输入        VARCHAR2
     11 **            PRM_APPCODE      执行返回代码                     输出        NUMBER
     12 **            PRM_ERRMSG      出错信息                         输出        VARCHAR2
     13 ||-----------------------------------------------------------------------------------*/
     14   PROCEDURE PRC_多线程_日志记录(PRM_PROCE_NAME IN VARCHAR2,
     15                                PRM_PROCE_DES  IN VARCHAR2,
     16                                PRM_PROCE_CODE IN VARCHAR2,
     17                                PRO_PROCE_MESG IN VARCHAR2,
     18                                PRM_APPCODE    OUT NUMBER,
     19                                PRM_ERRMSG     OUT VARCHAR2) IS
     20   BEGIN
     21     PRM_APPCODE := PAK_多线程同步数据.DFF_OK;
     22     INSERT INTO PROCESS_JOB
     23       (PROCESS_ID,
     24        PROCE_NAME,
     25        PROCESS_DES,
     26        PROCESS_CODE,
     27        PROCESS_MESG,
     28        PROCESS_DATE)
     29     VALUES
     30       (PROCESS_SEQ.NEXTVAL,
     31        PRM_PROCE_NAME,
     32        PRM_PROCE_DES,
     33        PRM_PROCE_CODE,
     34        PRO_PROCE_MESG,
     35        SYSDATE);
     36     COMMIT;
     37   EXCEPTION
     38     WHEN OTHERS THEN
     39       PRM_APPCODE := PAK_多线程同步数据.DFF_ERR;
     40       PRM_ERRMSG  := '插入线程日子记录表出错' || SQLERRM;
     41   END PRC_多线程_日志记录;
     42   
     43 /*-------------------------------------------------------------------------------------
     44 ** 过程名称 :PRC_多线程_执行的线程
     45 ** 功能描述 :判断是否存在未完成的线程还在执行
     46 ** 参数描述 :参数标识             名称                       输入输出         类型
     47 ** --------------------------------------------------------------------------------
     48 **            PRM_BZ           是否存在标志                     输出        NUMBER
     49 **            PRM_APPCODE      执行返回代码                     输出        NUMBER
     50 **            PRM_ERRMSG      出错信息                         输出        VARCHAR2
     51 ||-----------------------------------------------------------------------------------*/  
     52   PROCEDURE PRC_多线程_执行的线程(PRM_BZ       OUT NUMBER,
     53                                  PRM_APPCODE  OUT NUMBER,
     54                                  PRM_ERRMESG  OUT VARCHAR2) IS
     55    N_COUN      NUMBER(10) := 0;                                 
     56   BEGIN
     57     PRM_APPCODE := PAK_多线程同步数据.DFF_OK;
     58     SELECT COUNT(1)
     59       INTO N_COUN
     60       FROM USER_SCHEDULER_JOBS A
     61      WHERE A.JOB_NAME LIKE 'THREAD_FMDJ_%';
     62      
     63      IF N_COUN > 0 THEN
     64        PRM_BZ := 1;
     65      ELSE
     66        PRM_BZ := 0;  
     67      END IF;
     68      
     69   EXCEPTION
     70     WHEN OTHERS THEN
     71       PRM_APPCODE := PAK_多线程同步数据.DFF_ERR;
     72       PRM_ERRMESG := '判断是否存在执行的线程出错'||SQLERRM;
     73       RETURN;
     74   END PRC_多线程_执行的线程;
     75   
     76 /*-------------------------------------------------------------------------------------
     77 ** 过程名称 :PRC_多线程_入口
     78 ** 功能描述 :多线程调用入口
     79 ** 参数描述 :参数标识             名称                             输入输出         类型
     80 ** --------------------------------------------------------------------------------
     81 **            PARAMETERS_ID     需要同步的主键字符串(以','间隔)    输入        VARCHAR2
     82 **            PRM_APPCODE      执行返回代码                        输出        NUMBER
     83 **            PRM_ERRMSG      出错信息                             输出        VARCHAR2
     84 ||-----------------------------------------------------------------------------------*/  
     85   PROCEDURE PRC_多线程_入口(PARAMETERS_ID  IN VARCHAR2,
     86                            PRM_APPCODE    OUT NUMBER,
     87                            PRM_ERRMESG    OUT VARCHAR2) IS
     88     N_BZ              NUMBER(2);
     89     V_CODE            NUMBER(3);
     90     V_ERRMESG         VARCHAR2(500);
     91   BEGIN
     92     PRM_APPCODE  := PAK_多线程同步数据.DFF_OK;
     93     --判断是否存在执行的线程
     94     PRC_多线程_执行的线程(N_BZ,V_CODE,V_ERRMESG);
     95     IF N_BZ > 0 THEN
     96       PRC_多线程_日志记录('PRC_多线程_入口',
     97                          '存在执行的线程,不能继续执行',
     98                          '100001',
     99                          '存在执行的线程',
    100                          V_CODE,
    101                          V_ERRMESG);
    102       PRM_ERRMESG := '存在执行的线程,不能继续执行,请联系管理员!';                   
    103       RETURN;
    104     ELSE
    105       PRC_WSFMDJBAK_数据同步(PARAMETERS_ID,PRM_APPCODE,PRM_ERRMESG);
    106       IF PRM_APPCODE = PAK_多线程同步数据.DFF_ERR THEN
    107          PRC_多线程_日志记录('PRC_多线程_入口',
    108                          PRM_ERRMESG,
    109                          '100002',
    110                          '数据同步出错',
    111                          V_CODE,
    112                          V_ERRMESG);
    113          RETURN;
    114       END IF;
    115     END IF;
    116     EXCEPTION
    117       WHEN OTHERS THEN
    118          PRM_APPCODE   := PAK_多线程同步数据.DFF_ERR;
    119          PRM_ERRMESG   := '多线程入口出错:'||PRM_ERRMESG|| SQLERRM; 
    120          RETURN; 
    121   END PRC_多线程_入口; 
    122 
    123 /*-------------------------------------------------------------------------------------
    124 ** 过程名称 :PRC_WSFMDJBAK_数据同步
    125 ** 功能描述 :数据同步操作入口
    126 ** 参数描述 :参数标识             名称                             输入输出         类型
    127 ** --------------------------------------------------------------------------------
    128 **            PARAMETERS_ID     需要同步的主键字符串(以','间隔)    输入        VARCHAR2
    129 **            PRM_APPCODE      执行返回代码                        输出        NUMBER
    130 **            PRM_ERRMSG      出错信息                             输出        VARCHAR2
    131 ||-----------------------------------------------------------------------------------*/    
    132   PROCEDURE PRC_WSFMDJBAK_数据同步(PARAMETERS_ID   IN VARCHAR2,
    133                                   PRM_APPCODE      OUT NUMBER,
    134                                   PRM_ERRMESG      OUT VARCHAR2) IS
    135    --N_TEMP  NUMBER(8) := 0;                                  
    136   BEGIN
    137     PRM_APPCODE := PAK_多线程同步数据.DFF_OK;
    138      --日志记录开始同步数据
    139      PRC_多线程_日志记录('PRC_WSFMDJBAK_数据同步',
    140                          '同步分娩登记信息备份表数据开始',
    141                          '100003',
    142                          '',
    143                          PRM_APPCODE,
    144                          PRM_ERRMESG);
    145     PRC_多线程调用(PARAMETERS_ID,PRM_APPCODE,PRM_ERRMESG);
    146     IF PRM_APPCODE = PAK_多线程同步数据.DFF_ERR THEN
    147       RETURN;
    148     END IF;
    149     
    150     /*WHILE (TRUE) LOOP
    151       --延时10秒后再次查询结果情况
    152       DBMS_LOCK.SLEEP(2);
    153       BEGIN
    154       SELECT COUNT(1)
    155         INTO N_TEMP
    156         FROM PROCESS_GROUPS A
    157        WHERE A.SIGN_CODE IN ('0', '1')
    158          AND A.TABLE_NAME = 'WSFMDJ';
    159       EXCEPTION
    160         WHEN NO_DATA_FOUND THEN
    161           N_TEMP := 0;
    162       END;
    163       EXIT WHEN N_TEMP = 0; 
    164     END LOOP;*/  
    165     
    166     --日志记录开始同步数据
    167      PRC_多线程_日志记录('PRC_WSFMDJBAK_数据同步',
    168                          '同步分娩登记信息备份表数据结束',
    169                          '100003',
    170                          '',
    171                          PRM_APPCODE,
    172                          PRM_ERRMESG);             
    173     EXCEPTION
    174       WHEN OTHERS THEN
    175         PRM_APPCODE := PAK_多线程同步数据.DFF_ERR;
    176         PRM_ERRMESG := 'PRC_WSFMDJBAK_数据同步存取过程执行出错'||SQLERRM;
    177         RETURN;
    178   END PRC_WSFMDJBAK_数据同步;
    179 
    180 /*-------------------------------------------------------------------------------------
    181 ** 过程名称 :PKG_多线程调用
    182 ** 功能描述 :调用多线程进行数据处理
    183 ** 参数描述 :参数标识             名称                             输入输出         类型
    184 ** --------------------------------------------------------------------------------
    185 **            PARAMETERS_ID     需要同步的主键字符串(以','间隔)    输入        VARCHAR2
    186 **            PRM_APPCODE      执行返回代码                        输出        NUMBER
    187 **            PRM_ERRMSG      出错信息                             输出        VARCHAR2
    188 ||-----------------------------------------------------------------------------------*/   
    189   PROCEDURE PRC_多线程调用(PARAMETERS_ID     IN VARCHAR2,
    190                           PRM_APPCODE       OUT NUMBER,
    191                           PRM_ERRMESG       OUT VARCHAR2) IS
    192     N_THREADS       PLS_INTEGER := 5;       --启用的线程数量    
    193     CURSOR_WSFMDJ   MY_CURSOR;              --分娩登记信息表的游标变量
    194     REC_FMDJ        WSFMDJ%ROWTYPE;
    195     STR_JOB         VARCHAR2(500);
    196     
    197     BEGIN
    198       PRM_APPCODE  := PAK_多线程同步数据.DFF_OK;
    199 
    200       BEGIN
    201         --备份线程分组表的历史数据
    202         INSERT INTO PROCESS_GROUPS_BAK SELECT * FROM PROCESS_GROUPS;
    203         --删除线程分组表的历史数据
    204         DELETE FROM PROCESS_GROUPS A WHERE  A.TABLE_NAME='WSFMDJ';
    205         --拿到需要同步操作的数据游标
    206         GET_CURSOR_WSFMDJ(PARAMETERS_ID,CURSOR_WSFMDJ);
    207         
    208         --生成线程分组表主键数据
    209         PRC_多线程_日志记录('PRC_多线程调用',
    210                          '生成线程分组表主键数据',
    211                          '100003',
    212                          '',
    213                          PRM_APPCODE,
    214                          PRM_ERRMESG);
    215                          
    216         LOOP
    217         FETCH CURSOR_WSFMDJ INTO REC_FMDJ;
    218         EXIT WHEN CURSOR_WSFMDJ%NOTFOUND OR REC_FMDJ.NEWID IS NULL;  
    219         
    220          -- 生成线程分组表的数据信息
    221         INSERT INTO PROCESS_GROUPS
    222           (XH,
    223            TABLE_NAME,
    224            SIGN_CODE,
    225            START_TIME,
    226            END_TIME,
    227            THREAD_NUM,
    228            ERR_MESG,
    229            PRO_CODE)
    230         VALUES
    231           (REC_FMDJ.NEWID,
    232            'WSFMDJ',
    233            '0',
    234            NULL,
    235            NULL,
    236            NULL,
    237            NULL,
    238            NULL);
    239            -- 提交
    240         COMMIT;
    241         END LOOP; 
    242         CLOSE CURSOR_WSFMDJ;     
    243       EXCEPTION
    244           WHEN OTHERS THEN
    245              PRM_APPCODE  := PAK_多线程同步数据.DFF_ERR;
    246              PRM_ERRMESG  := '生成线程分组表数据出错!错误原因:' || SQLERRM;
    247              RETURN;
    248       END;
    249       
    250       --产生多个线程进行数据处理
    251         PRC_多线程_日志记录('PRC_多线程调用',
    252                          '产生多个线程进行数据处理',
    253                          '100003',
    254                          '',
    255                          PRM_APPCODE,
    256                          PRM_ERRMESG);
    257       --产生5个线程调用处理数据
    258       FOR X IN 0 .. N_THREADS - 1 LOOP
    259         STR_JOB := 'DECLARE
    260         PRM_APPCODE NUMBER(3);
    261         PRM_ERRMESG VARCHAR2(200);
    262         BEGIN
    263           PAK_多线程同步数据.PRC_单线调用接口(''' || X || ''', PRM_APPCODE, PRM_ERRMESG);
    264         END;';
    265 
    266         DBMS_SCHEDULER.CREATE_JOB(JOB_NAME   => 'THREAD_FMDJ_' || X,
    267                                   JOB_TYPE   => 'PLSQL_BLOCK',
    268                                   JOB_ACTION => STR_JOB,
    269                                   ENABLED    => FALSE,
    270                                   AUTO_DROP  => TRUE,
    271                                   COMMENTS   => 'PRC_WSFMDJBAK_数据同步' || X);
    272         DBMS_SCHEDULER.ENABLE(NAME => 'THREAD_FMDJ_' || X);
    273       END LOOP;
    274       EXCEPTION
    275         WHEN OTHERS THEN
    276           PRM_APPCODE   := PAK_多线程同步数据.DFF_ERR;
    277           PRM_ERRMESG   := 'PRC_多线程调用存取过程执行出错,'||SQLERRM;
    278           RETURN;
    279   END PRC_多线程调用;
    280 
    281 /*-------------------------------------------------------------------------------------
    282 ** 过程名称 :PRC_单线调用接口
    283 ** 功能描述 :单线程处理接口入口,进行数据处理
    284 ** 参数描述 :参数标识             名称                             输入输出         类型
    285 ** --------------------------------------------------------------------------------
    286 **            PRM_线程号        线程号                             输入        VARCHAR2
    287 **            PRM_APPCODE      执行返回代码                        输出        NUMBER
    288 **            PRM_ERRMSG      出错信息                             输出        VARCHAR2
    289 ||-----------------------------------------------------------------------------------*/    
    290   PROCEDURE PRC_单线调用接口(PRM_线程号     IN VARCHAR2,
    291                             PRM_APPCODE    OUT NUMBER,
    292                             PRM_ERRMESG    OUT VARCHAR2) IS
    293   RID                   ROWID; 
    294   REC_PROCESS_GROUPS    PROCESS_GROUPS%ROWTYPE;
    295   N_COUNT               NUMBER(10);
    296   BEGIN
    297     PRM_APPCODE   := PAK_多线程同步数据.DFF_OK;
    298     LOOP
    299        PRC_读线程分组表数据(PRM_线程号, RID, PRM_APPCODE, PRM_ERRMESG);
    300        IF PRM_APPCODE = PAK_多线程同步数据.DFF_ERR THEN
    301          --日志记录开始同步数据
    302           PRC_多线程_日志记录('PRC_单线调用接口',
    303                          '读取线程分组表ROWID出错',
    304                          '100002',
    305                          PRM_ERRMESG,
    306                          PRM_APPCODE,
    307                          PRM_ERRMESG);
    308            RETURN;
    309        END IF;
    310        
    311        IF RID IS NULL THEN
    312           SELECT COUNT(1)
    313             INTO N_COUNT
    314             FROM PROCESS_GROUPS A
    315            WHERE A.SIGN_CODE = '0'
    316              AND A.TABLE_NAME = 'WSFMDJ';
    317           IF N_COUNT > 0 THEN
    318             GOTO NEXTOPTION;
    319           END IF;
    320        END IF; 
    321       -- 未取得有效的数据,退出循环 
    322       EXIT WHEN RID IS NULL;
    323       SELECT * INTO REC_PROCESS_GROUPS FROM PROCESS_GROUPS WHERE ROWID = RID;   --行ID
    324       --取到线程分组表中的XH 即是被处理表的主键,传入函数进行数据同步处理
    325       PRC_数据同步(REC_PROCESS_GROUPS.XH, PRM_APPCODE, PRM_ERRMESG);
    326       
    327       BEGIN
    328         UPDATE PROCESS_GROUPS A
    329            SET A.SIGN_CODE = DECODE(PRM_APPCODE, '0', '2', '3'), --执行标志
    330                A.END_TIME = SYSDATE,                             --终止时间
    331                A.ERR_MESG = SUBSTR(PRM_ERRMESG, 1, 200)          --错误信息
    332          WHERE ROWID = RID; --行ID
    333       EXCEPTION
    334         WHEN NO_DATA_FOUND THEN
    335           GOTO NEXTOPTION;
    336       END;
    337       
    338        <<NEXTOPTION>>
    339        -- 提交
    340         COMMIT;
    341     END LOOP;
    342     
    343     UPDATE PROCESS_GROUPS A
    344        SET A.SIGN_CODE = '3',                     --执行标志
    345            A.END_TIME = SYSDATE,                    --终止时间
    346            A.ERR_MESG = '系统错误,暂时无法执行'     --错误信息
    347      WHERE A.TABLE_NAME = 'WSFMDJ' --表序号
    348        AND A.SIGN_CODE = '1'
    349        AND A.THREAD_NUM = PRM_线程号; --执行标志
    350        
    351     EXCEPTION
    352       WHEN OTHERS THEN
    353        PRM_APPCODE := PAK_多线程同步数据.DFF_ERR;
    354       UPDATE PROCESS_GROUPS A
    355          SET A.SIGN_CODE = '3', --执行标志
    356              A.END_TIME = SYSDATE, --终止时间
    357              A.ERR_MESG = SUBSTR(PRM_ERRMESG, 1, 200) --错误信息
    358        WHERE ROWID = RID;
    359   END PRC_单线调用接口;
    360 
    361 /*-------------------------------------------------------------------------------------
    362 ** 过程名称 :PRC_数据同步
    363 ** 功能描述 :进行具体的数据同步处理
    364 ** 参数描述 :参数标识             名称                             输入输出         类型
    365 ** --------------------------------------------------------------------------------
    366 **            NEWID             被处理表的主键                     输入        VARCHAR2
    367 **            PRM_APPCODE      执行返回代码                        输出        NUMBER
    368 **            PRM_ERRMSG      出错信息                             输出        VARCHAR2
    369 ||-----------------------------------------------------------------------------------*/   
    370   PROCEDURE PRC_数据同步(PRM_NEWID         IN VARCHAR2, 
    371                         PRM_APPCODE       OUT NUMBER, 
    372                         PRM_ERRMESG       OUT VARCHAR2) IS
    373    REC_FMDJ        WSFMDJ%ROWTYPE; 
    374     BEGIN
    375       PRM_APPCODE   := PAK_多线程同步数据.DFF_OK;
    376       BEGIN
    377         SELECT WS.* INTO REC_FMDJ FROM WSFMDJ WS WHERE WS.NEWID = PRM_NEWID;
    378         UPDATE WSFMDJBAK A
    379          SET A.REGHOSPITAL   = REC_FMDJ.REGHOSPITAL,
    380              A.HOSPITALID    = REC_FMDJ.HOSPITALID,
    381              A.REGNAME       = REC_FMDJ.REGNAME,
    382              A.REGAAC002     = REC_FMDJ.REGAAC002,
    383              A.REGMZ         = REC_FMDJ.REGMZ,
    384              A.REGBLOOD      = REC_FMDJ.REGBLOOD,
    385              A.REGAGE        = REC_FMDJ.REGAGE,
    386              A.REGSPOUSENAME = REC_FMDJ.REGSPOUSENAME,
    387              A.REGPHONE      = REC_FMDJ.REGPHONE,
    388              A.REGJSJH       = REC_FMDJ.REGJSJH,
    389              A.REGCSJH       = REC_FMDJ.REGCSJH,
    390              A.REGADDRES     = REC_FMDJ.REGADDRES,
    391              A.REGYUNCI      = REC_FMDJ.REGYUNCI,
    392              A.REGYUNZHOU    = REC_FMDJ.REGYUNZHOU,
    393              A.REDEVERYDATE  = REC_FMDJ.REDEVERYDATE,
    394              A.REGCHECKCOUNT = REC_FMDJ.REGCHECKCOUNT,
    395              A.REGTAIERSHU   = REC_FMDJ.REGTAIERSHU,
    396              A.REGTAIFANGW   = REC_FMDJ.REGTAIFANGW,
    397              A.REGTAIFANGWS  = REC_FMDJ.REGTAIFANGWS,
    398              A.YANGSHUIQKXZ  = REC_FMDJ.YANGSHUIQKXZ,
    399              A.YANGSHUIQKL   = REC_FMDJ.YANGSHUIQKL,
    400              A.YANGSHUIQK    = REC_FMDJ.YANGSHUIQK,
    401              A.REGJDQKMS     = REC_FMDJ.REGJDQKMS,
    402              A.REGJDRJZS     = REC_FMDJ.REGJDRJZS,
    403              A.REGJDLONG     = REC_FMDJ.REGJDLONG,
    404              A.REGPOMO       = REC_FMDJ.REGPOMO,
    405              A.REGPOMODES    = REC_FMDJ.REGPOMODES,
    406              A.REGFMFS       = REC_FMDJ.REGFMFS,
    407              A.REGCCFIRSTD   = REC_FMDJ.REGCCFIRSTD,
    408              A.REGCCFIRSTM   = REC_FMDJ.REGCCFIRSTM,
    409              A.REGCCSECONDD  = REC_FMDJ.REGCCSECONDD,
    410              A.REGCCSECONDM  = REC_FMDJ.REGCCSECONDM,
    411              A.REGCCTHREED   = REC_FMDJ.REGCCTHREED,
    412              A.REGCCTHREEM   = REC_FMDJ.REGCCTHREEM,
    413              A.REGCHANCHEN   = REC_FMDJ.REGCHANCHEN,
    414              A.REGCHANCHENM  = REC_FMDJ.REGCHANCHENM,
    415              A.REGHYQK       = REC_FMDJ.REGHYQK,
    416              A.REGHYQKDES    = REC_FMDJ.REGHYQKDES,
    417              A.REGGJQK       = REC_FMDJ.REGGJQK,
    418              A.REGTAIPAN     = REC_FMDJ.REGTAIPAN,
    419              A.REGTAIPANWZQK = REC_FMDJ.REGTAIPANWZQK,
    420              A.REGTAIPANXZ   = REC_FMDJ.REGTAIPANXZ,
    421              A.REGTAIPANQT   = REC_FMDJ.REGTAIPANQT,
    422              A.REGCSCXL      = REC_FMDJ.REGCSCXL,
    423              A.REGCHCXL      = REC_FMDJ.REGCHCXL,
    424              A.REGLCGWPD     = REC_FMDJ.REGLCGWPD,
    425              A.REGCHANSFMYS  = REC_FMDJ.REGCHANSFMYS,
    426              A.REGYUNCQBFZ   = REC_FMDJ.REGYUNCQBFZ,
    427              A.BIRTHDATE     = REC_FMDJ.BIRTHDATE,
    428              A.REGYEQKSEX    = REC_FMDJ.REGYEQKSEX,
    429              A.REGYEQKBODY   = REC_FMDJ.REGYEQKBODY,
    430              A.REGYEQKHEIGHT = REC_FMDJ.REGYEQKHEIGHT,
    431              A.REGYEQKPF     = REC_FMDJ.REGYEQKPF,
    432              A.REGYEQKPFS    = REC_FMDJ.REGYEQKPFS,
    433              A.REGYEQKPFT    = REC_FMDJ.REGYEQKPFT,
    434              A.REGYEQKFMJG   = REC_FMDJ.REGYEQKFMJG,
    435              A.REGJKZK       = REC_FMDJ.REGJKZK,
    436              A.REGYEQKCSQX   = REC_FMDJ.REGYEQKCSQX,
    437              A.REGYEQKFMSW   = REC_FMDJ.REGYEQKFMSW,
    438              A.REGYEQKSWYY   = REC_FMDJ.REGYEQKSWYY,
    439              A.REGDEATHTIME  = REC_FMDJ.REGDEATHTIME,
    440              A.REGYEQKFMQJ   = REC_FMDJ.REGYEQKFMQJ,
    441              A.REGYEQKBFZ    = REC_FMDJ.REGYEQKBFZ,
    442              A.REGZJC        = REC_FMDJ.REGZJC,
    443              A.REGZJCSJ      = REC_FMDJ.REGZJCSJ,
    444              A.REGZYSJ       = REC_FMDJ.REGZYSJ,
    445              A.REGZYSJDATE   = REC_FMDJ.REGZYSJDATE,
    446              A.REGQYDSS      = REC_FMDJ.REGQYDSS,
    447              A.REGQYDSSSJ    = REC_FMDJ.REGQYDSSSJ,
    448              A.REGSFCJDX     = REC_FMDJ.REGSFCJDX,
    449              A.REGCOMPJYS    = REC_FMDJ.REGCOMPJYS,
    450              A.REGCFJYS      = REC_FMDJ.REGCFJYS,
    451              A.REGJSFF       = REC_FMDJ.REGJSFF,
    452              A.REGJSYS       = REC_FMDJ.REGJSYS,
    453              A.REGSYZ        = REC_FMDJ.REGSYZ,
    454              A.REGREMARK     = REC_FMDJ.REGREMARK,
    455              A.REGTIME       = REC_FMDJ.REGTIME,
    456              A.REGAUTHOR     = REC_FMDJ.REGAUTHOR,
    457              A.ALTERTIME     = REC_FMDJ.ALTERTIME,
    458              A.ALTERAUTHOR   = REC_FMDJ.ALTERAUTHOR,
    459              A.OPTIONS       = '0'
    460         WHERE A.NEWID = REC_FMDJ.NEWID;
    461       EXCEPTION
    462         WHEN NO_DATA_FOUND THEN
    463           NULL;
    464       END;
    465       EXCEPTION
    466         WHEN OTHERS THEN
    467           PRM_APPCODE  := PAK_多线程同步数据.DFF_ERR;
    468           PRM_ERRMESG  := 'PAK_多线程同步数据.PRC_数据同步,更新分娩登记信息备份表出错' || SQLERRM;
    469           RETURN;
    470   END PRC_数据同步;
    471 
    472 /*-------------------------------------------------------------------------------------
    473 ** 过程名称 :PRC_读线程分组表数据
    474 ** 功能描述 :读取线程分组表中的ROWID值,并返回
    475 ** 参数描述 :参数标识             名称                             输入输出         类型
    476 ** --------------------------------------------------------------------------------
    477 **            PRM_线程号        线程号                             输入        VARCHAR2
    478 **            RID               ROWID值                           输出        ROWID
    479 **            PRM_APPCODE      执行返回代码                       输出        NUMBER
    480 **            PRM_ERRMSG      出错信息                           输出        VARCHAR2
    481 ||-----------------------------------------------------------------------------------*/    
    482   PROCEDURE PRC_读线程分组表数据(PRM_线程号    IN VARCHAR2, 
    483                                 RID           OUT ROWID, 
    484                                 PRM_APPCODE   OUT NUMBER, 
    485                                 PRM_ERRMESG   OUT VARCHAR2) IS
    486     BEGIN
    487       PRM_APPCODE   := PAK_多线程同步数据.DFF_OK;
    488       -- 行ID
    489       RID := NULL;
    490       
    491         BEGIN
    492           SELECT ROWID --行ID
    493             INTO RID
    494             FROM PROCESS_GROUPS A
    495            WHERE A.SIGN_CODE = '0'         --执行标志(0-未执行)             
    496              AND ROWNUM < 2
    497              AND A.TABLE_NAME = 'WSFMDJ'   --执行表名
    498              FOR UPDATE SKIP LOCKED;       --锁定记录
    499         EXCEPTION
    500           WHEN NO_DATA_FOUND THEN
    501             GOTO ENDS;
    502         END;
    503   
    504         BEGIN
    505           UPDATE PROCESS_GROUPS A
    506              SET A.SIGN_CODE  = '1', --执行标志(1-正在执行)
    507                  A.START_TIME = SYSDATE, --开始时间
    508                  A.THREAD_NUM = PRM_线程号 --线程号
    509            WHERE ROWID = RID; --行ID
    510           -- 提交
    511           COMMIT;
    512         EXCEPTION
    513           WHEN NO_DATA_FOUND THEN
    514             GOTO ENDS;
    515         END;
    516       
    517        <<ENDS>>
    518        NULL;
    519       EXCEPTION
    520         WHEN OTHERS THEN
    521           PRM_APPCODE  := PAK_多线程同步数据.DFF_ERR;
    522           PRM_ERRMESG  := '取线程分组表中的rowid错误' || SQLERRM;
    523           RETURN;
    524     END PRC_读线程分组表数据;
    525     
    526   /*-------------------------------------------------------------------------------------
    527 ** 过程名称 :GET_CURSOR_WSFMDJ
    528 ** 功能描述 :拿到分娩登记信息表的游标
    529 ** 参数描述 :参数标识             名称                       输入输出         类型
    530 ** --------------------------------------------------------------------------------
    531 **            PARAMETERS_ID   需要同步的主键NEWID字符串         输入        VARCHAR2
    532 **            CURSOR_WSFMDJ   返回的游标                       输出        MY_CURSOR
    533 ||-----------------------------------------------------------------------------------*/
    534   PROCEDURE GET_CURSOR_WSFMDJ(PARAMETERS_ID    IN VARCHAR2,
    535                               CURSOR_WSFMDJ    OUT MY_CURSOR) IS
    536     SQLSTR VARCHAR2(8000);
    537   BEGIN
    538     SQLSTR := ' SELECT A.* FROM WSFMDJ A WHERE A.NEWID IN( ';
    539     FOR PARAMETERS_REC IN(SELECT TO_CHAR(strvalue) CODE
    540                  FROM TABLE(FN_SPLIT(PARAMETERS_ID, ','))) LOOP
    541       SQLSTR := SQLSTR||''''||PARAMETERS_REC.CODE||''''||',';
    542     END LOOP;
    543     SQLSTR := SUBSTR(SQLSTR,0,(LENGTH(SQLSTR) - 1))||')';
    544     OPEN CURSOR_WSFMDJ FOR SQLSTR;
    545   END GET_CURSOR_WSFMDJ;
    546   
    547 END PAK_多线程同步数据;

    经过上述内容,基本使用了多线程的PLSQL来处理大数据表,以提升处理效率!

    简单的记录!

  • 相关阅读:
    南邮OJA题
    Executors工厂类创建线程池的底层实现
    Linux kernel 中的per_cpu宏
    [置顶] 高并发服务器的设计内存池的设计
    数据列表DataList模板之实例
    软件开发无敌心得篇
    嵌入式学习笔记之UART通信协议
    正则表达式 进阶(二)
    11687 Digits
    DELPHI接口转化为COM接口
  • 原文地址:https://www.cnblogs.com/yinfengjiujian/p/8707574.html
Copyright © 2020-2023  润新知