存储过程:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
本人使用场景
在linux下使用存储过程全量导入A表内容到B表,或者(更新,删除),而不借助java程序那些,效率快
#! /bin/ksh
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sqlplus scmgt/scmgt@testdb<<!
TRUNCATE TABLE CH_T_ALBUM_INFO_0326;
DECLARE
i number:=0;
j number:=0;
CURSOR MYCUR IS SELECT
A.ALBUMID ,
A.ALBUMNAME ,
A.STATUS ,
A.SONGIDS ,
A.SINGERID ,
A.TRACKCOUNT ,
A.PRODUCTIONCOMPANY ,
A.PUBLISHCOMPANY ,
A.PUBLISHDATE ,
A.PUBLISHAREA ,
A.LANGUAGE ,
A.ALBUMLENGTH ,
A.ALBUMPICS ,
A.ALBUMPICM ,
A.ALBUMPICL ,
A.SALESVOLUME ,
A.AWARDS ,
A.ALBUMNAMEPINYIN ,
A.ALBUMNAMEFIRSTLETTER ,
A.ALBUMINTRO
FROM SYNCMATERIAL_ALBUM A;
BEGIN
DBMS_OUTPUT.PUT_LINE('Start At ' || TO_CHAR(SYSDATE, 'yyyymmdd HH24:mi:ss'));
FOR VROW IN MYCUR LOOP
i:=i+1;
j:=j+1;
INSERT INTO CH_T_ALBUM_INFO_0326
(
ALBUM_ID ,
ALBUM_NAME ,
STATUS ,
SONG_ID ,
SINGGER_ID ,
TRACK_COUNT ,
PRODUCTION_COMPANY ,
PUBLISH_COMPANY ,
PUBLISH_DATE ,
PUBLISH_AREA ,
LANGUAGE ,
ALBUM_LENGTH ,
ALBUM_PIC_S ,
ALBUM_PIC_M ,
ALBUM_PIC_L ,
SALES_VOLUME ,
AWARDS ,
ALBUM_NAME_PINYIN ,
ALBUM_INI ,
INTRO ,
CREATE_TIME
--ALBUM_PIC_S_DIR ,
--ALBUM_PIC_M_DIR ,
--ALBUM_PIC_L_DIR
)values(
VROW.ALBUMID ,
VROW.ALBUMNAME ,
DECODE(VROW.STATUS,'10','0',DECODE(VROW.STATUS,'20','2',DECODE(VROW.STATUS,'30','1','0'))),
VROW.SONGIDS ,
VROW.SINGERID ,
VROW.TRACKCOUNT ,
VROW.PRODUCTIONCOMPANY ,
VROW.PUBLISHCOMPANY ,
VROW.PUBLISHDATE ,
VROW.PUBLISHAREA ,
VROW.LANGUAGE ,
VROW.ALBUMLENGTH ,
DECODE(VROW.ALBUMPICS,null,'','http://218.200.230.40:18089/'||VROW.ALBUMPICS) ,
DECODE(VROW.ALBUMPICM,null,'','http://218.200.230.40:18089/'||VROW.ALBUMPICM) ,
DECODE(VROW.ALBUMPICL,null,'', DECODE(VROW.ALBUMPICL,'null','','http://218.200.230.40:18089/'||VROW.ALBUMPICL)) ,
VROW.SALESVOLUME ,
VROW.AWARDS ,
VROW.ALBUMNAMEPINYIN ,
VROW.ALBUMNAMEFIRSTLETTER ,
VROW.ALBUMINTRO ,
current_date
);
if j=10 then
COMMIT;
j:=0;
end if;
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Complete At ' || TO_CHAR(SYSDATE, 'yyyymmdd HH24:mi:ss'));
END;
/
exit ;
!
echo "`date` END"