oracle存储过程insert
⑴ oracle存储过程怎样批量插入新数据
需要生成的SQL
insert into TMP_UPSTATE_CASEKEY values('TMP0000001', 1, sysdate);
存储过程实现
create or replace procere proc_casekey_upstate
as
casekey char(14);
begin
for i in 1..10000000 loop
casekey := 'TMP'||lpad(i,7,0); -- TMP0000001
insert into TMP_UPSTATE_CASEKEY values(casekey, 1, sysdate);
end loop;
commit;
end;
begin
proc_casekey_upstate();
end;
测试发现生成一千万条数据用了14分钟左右,性能还是可以了,如果先去掉TMP_NUM_STATUS_ID的外键估计更快。
或者:
insert into TMP_UPSTATE_CASEKEY select 'TMP'||LPAD(rownum,7,0),1,sysdate from al connect by level <= 1000000;
⑵ 在oracle存储过程时,出现错误:pls-00103:出现符号"insert"在需要下列之一时
as 后要写begin
CREATE OR REPLACE PROCEDURE Bom(Oldid VARCHAR2,
Newid VARCHAR2,
USER VARCHAR2,
Company VARCHAR2) AS
begin
INSERT Cc_Record_Bom
SELECT Sys_Guid(),
Item,
Item_Class,
Item_d,
Item_d_Class,
Net_Qty,
Waste_Qty,
Total_Qty,
Bom_Ver,
Start_Date,
End_Date,
Newid,
Remark,
USER,
SYSDATE,
USER,
SYSDATE,
Company
FROM Cc_Record_Bom
WHERE Code = Oldid;
INSERT Cc_Stand_Bom
SELECT Sys_Guid(),
Item,
Item_d,
Net_Qty,
Waste_Qty,
Total_Qty,
Bom_Ver,
Start_Date,
End_Date,
Newid,
Remark,
USER,
SYSDATE,
USER,
SYSDATE,
Company,
Item_Class,
Item_d_Class
FROM Cc_Stand_Bom
WHERE Code = Oldid;
INSERT Cc_Wo_Bom
SELECT Item,
Item_d,
Net_Qty,
Waste_Qty,
Total_Qty,
Bom_Ver,
Start_Date,
End_Date,
Newid,
Remark,
USER,
SYSDATE,
USER,
SYSDATE,
Company,
Item_Class,
Item_d_Class
FROM Cc_Wo_Bom
WHERE Code = Oldid;
END Bom;
⑶ Oracle 并行循环执行存储过程语句
在处理大数据量的插入操作时,直接使用存储过程进行逐条插入效率较低。为提高性能,可以利用Oracle的并行执行特性。具体方法是将需要插入的数据通过UNION ALL进行合并,然后使用带有并行指示的INSERT语句一次性插入。例如:
插入语句可以写成:
insert /*+ parallel(tablename, 3) */ into tablename select * from table1 union all select * from table2 union all select * from table3
这里的parallel(tablename, 3)表示将tablename表的插入操作并行执行,同时执行的线程数为3。通过这种方式,可以显着提升数据插入的速度。
需要注意的是,并行执行并非适用于所有场景。在某些情况下,如表结构复杂、索引较多或数据量较小的情况下,使用并行执行可能并不会带来明显的性能提升,甚至可能降低效率。
此外,合理设置并行度也很重要。过高的并行度可能导致资源竞争加剧,反而影响性能。因此,在实际应用中,需要根据具体情况进行测试和调整。
总之,通过合理利用Oracle的并行执行特性,可以有效提升存储过程中的数据插入效率,特别是在处理大数据量场景时。
⑷ oracle存储过程中Insert表名(字段名)values(字段名)
insert into 表名 values后面括号里应该是值,而不是字段名;
如果是从另外一个表里插入到当前表,应该是这样写:
Insert Into TI_AIS_ADDRLINE
(
ADDR_ID --地址标识
,DIST_CD --行政区划代码
,POST_CD --邮政编码
,POST_CD1 --邮政编码1
,POST_CD2 --邮政编码2
,ADDR_NAME --地址名称
,RELA_ADDR_ID --关联地址标识
,RELA_ADDR_NAME --关联地址名称
,DATA_SRC_CD --数据来源代码
,LAST_UPD_DATE --最后更新日期
)
SELECT
ADDR_ID
,DIST_CD
,POST_CD
,POST_CD1
,POST_CD2
,ADDR_NAME
,RELA_ADDR_ID
,RELA_ADDR_NAME
,DATA_SRC_CD
,to_date(LAST_UPD_DATE, 'yyyy-mm-dd hh24:mi:ss')
FROM 表名
;