oracle 批量插入原理,请教有没有一种高效的plsql批量插入过程!多谢

这篇博客分享了一个用于批量处理的PL/SQL包,包含split_str函数和p_voucher_imp过程。split_str函数用于按指定分隔符拆分字符串,返回一个索引数组。p_voucher_imp过程则将多个字段的分隔值插入到数据库表中。博客探讨了如何使用这些工具进行数据处理,并在异常处理和日志记录方面做了考虑。
摘要由CSDN通过智能技术生成

多谢各位

看了网上一篇文章写了我的批量PL/SQL过程,大家看有没有更好的修改;

CREATE OR REPLACE PACKAGE qtone IS

TYPE SUBSTR_ARRAY IS TABLE OF VARCHAR2(100 CHAR) INDEX BY BINARY_INTEGER;

end;

CREATE OR REPLACE FUNCTION split_str(str in varchar2, delimiter in varchar2) RETURN qtone.SUBSTR_ARRAY is

src_str varchar2(300 char) := '';

prev_index integer := 1;

next_index integer := 1;

retval qtone.substr_array ;

cnt INTEGER := 1;

BEGIN

--去掉开头和结束的分隔符

src_str := trim(both delimiter from str);

while next_index != 0 loop

next_index := instr(src_str,delimiter,prev_index,1);

if(next_index = 0) then

retval(cnt) := substr(src_str,prev_index);

cnt := cnt + 1;

else

retval(cnt) := substr(src_str,prev_index,next_index - prev_index);

cnt := cnt + 1;

end if;

prev_index := next_index + 1;

end loop;

RETURN retval;

end;

CREATE OR REPLACE PROCEDURE p_voucher_imp(v_voucher_sn     VARCHAR2,

v_voucher_pass   VARCHAR2,

v_voucher_tag    VARCHAR2,

v_createtime     VARCHAR2,

v_creater        VARCHAR2,

v_expiretime     VARCHAR2,

v_balance        VARCHAR2,

v_agent_id       VARCHAR2,

v_tariffgroup_id VARCHAR2,

v_activated      VARCHAR2,

v_used           VARCHAR2,

v_account_name   VARCHAR2,

v_usetime        VARCHAR2,

v_discount       VARCHAR2,

v_retcode        OUT INTEGER,

v_retinfo        OUT VARCHAR2) IS

voucher_sn_arry     qtone.substr_array;

voucher_pass_arry   qtone.substr_array;

voucher_tag_arry    qtone.substr_array;

createtime_arry     qtone.substr_array;

creater_arry        qtone.substr_array;

expiretime_arry     qtone.substr_array;

balance_arry        qtone.substr_array;

agent_id_arry       qtone.substr_array;

tariffgroup_id_arry qtone.substr_array;

activated_arry      qtone.substr_array;

used_arry           qtone.substr_array;

account_name_arry   qtone.substr_array;

usetime_arry        qtone.substr_array;

discount_arry       qtone.substr_array;

v_sql               VARCHAR2(500);

v_pkg               VARCHAR2(30);

v_procname          VARCHAR2(30);

rowline             NUMBER;

BEGIN

v_pkg               := 'adm';

v_procname          := 'p_voucher_imp';

rowline             := 0;

voucher_sn_arry     := split_str(v_voucher_sn, '_');

voucher_pass_arry   := split_str(v_voucher_pass, '_');

voucher_tag_arry    := split_str(v_voucher_tag, '_');

createtime_arry     := split_str(v_createtime, '_');

creater_arry        := split_str(v_creater, '_');

expiretime_arry     := split_str(v_expiretime, '_');

balance_arry        := split_str(v_balance, '_');

agent_id_arry       := split_str(v_agent_id, '_');

tariffgroup_id_arry := split_str(v_tariffgroup_id, '_');

activated_arry      := split_str(v_activated, '_');

used_arry           := split_str(v_used, '_');

account_name_arry   := split_str(v_account_name, '_');

usetime_arry        := split_str(v_usetime, '_');

discount_arry       := split_str(v_discount, '_');

--插入日志

ods.p_insert_log(SYSDATE, v_pkg, v_procname, 'ALL', SYSDATE);

COMMIT;

v_sql := 'insert into adm_voucher(voucher_id,

voucher_sn,

voucher_pass,

voucher_tag,

createtime,

creater,

expiretime,

balance,

agent_id,

tariffgroup_id,

activated,

used,

account_name,

usetime,

discount)

valuse(seq_voucher_id.nextval,

:voucher_sn,

:voucher_pass,

:voucher_tag,

:createtime,

:creater,

:expiretime,

:balance,

:agent_id,

:tariffgroup_id,

:activated,

:used,

:account_name,

:usetime,

:discount)';

IF voucher_sn_arry.COUNT <> 0 THEN

FORALL i IN voucher_sn_arry.FIRST .. voucher_sn_arry.LAST EXECUTE

IMMEDIATE v_sql USING

voucher_sn_arry(i),

voucher_pass_arry(i),

voucher_tag_arry(i),

createtime_arry(i),

creater_arry(i),

expiretime_arry(i),

balance_arry(i), agent_id_arry(i),

tariffgroup_id_arry(i),

activated_arry(i), used_arry(i),

account_name_arry(i),

usetime_arry(i), discount_arry(i)

;

END IF;

rowline := SQL%ROWCOUNT;

COMMIT;

--过程执行成功,更新日志

v_retcode := 1;

ods.p_update_log(SYSDATE,

v_pkg,

v_procname,

'结束',

v_retcode,

SYSDATE,

rowline);

--过程执行异常,更新日志

EXCEPTION

WHEN OTHERS THEN

v_retinfo := SQLERRM;

v_retcode := 0;

ods.p_update_log(SYSDATE,

v_pkg,

v_procname,

v_retinfo,

v_retcode,

SYSDATE,

rowline);

COMMIT;

END p_voucher_imp;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值