oracle儲存過程將某張表一個欄位的多值分開成多條資料插入到一張新表
阿新 • • 發佈:2019-02-05
create or replace PROCEDURE PRO_MANDATESCOPE (dataid in varchar2,tablename in varchar2 ) AS v_ID varchar2(1000); v_MANDATESCOPE clob; av_split varchar2(2) := ';'; v_length number; v_start NUMBER; v_index NUMBER; v_str varchar2(1000); v_MANDATETYPE varchar2(2); v_sql VARCHAR2(1000);--動態sql BEGIN v_sql:='DELETE FROM TLK_P_'||tablename||'_mds WHERE '||tablename||'ID ='''||dataid||''''; execute immediate(v_sql); v_sql:='SELECT ID ,ITEM_MANDATESCOPE FROM tlk_p_'||tablename|| ' WHERE ID ='''|| dataid||''''; execute immediate v_sql INTO v_ID, v_MANDATESCOPE; --執行SQL DBMS_OUTPUT.PUT_LINE('output:'||v_ID ); --監視SQL語句 v_MANDATESCOPE := replace(v_MANDATESCOPE,',',';'); v_length := LENGTH(v_MANDATESCOPE); --v_length number:=LENGTH(v_MANDATESCOPE); v_start :=1; v_index :=0; v_str :=''; IF INSTR(v_MANDATESCOPE ,av_split) >0 THEN WHILE(v_start <= v_length) LOOP v_index := INSTR(v_MANDATESCOPE, av_split, v_start); IF v_index = 0 THEN v_MANDATETYPE := SUBSTR(v_MANDATESCOPE, v_start,1); DBMS_OUTPUT.PUT_LINE('v_MANDATETYPE:'||v_MANDATETYPE ); --監視SQL語句 v_str :=SUBSTR(v_MANDATESCOPE, v_start+2); v_start := v_length + 1; ELSE v_MANDATETYPE := SUBSTR(v_MANDATESCOPE, v_start, 1); DBMS_OUTPUT.PUT_LINE('v_MANDATETYPE:'||v_MANDATETYPE ); --監視SQL語句 v_str :=SUBSTR(v_MANDATESCOPE, v_start+2, v_index - v_start); v_start := v_index + 1; END IF; v_sql:='INSERT INTO TLK_P_'||tablename||'_mds (ID,'||tablename||'ID,MANDATESCOPE,MANDATETYPE) VALUES('''||sys_guid()||''','''||v_ID||''','''||v_str||''','''||v_MANDATETYPE||''')'; DBMS_OUTPUT.PUT_LINE('INPUT:'||v_sql ); --監視SQL語句 execute immediate(v_sql); END LOOP; ELSE v_MANDATETYPE := SUBSTR(v_MANDATESCOPE, v_start,1); v_str :=SUBSTR(v_MANDATESCOPE, v_start+2); v_sql:='INSERT INTO TLK_P_'||tablename||'_mds (ID,'||tablename||'ID,MANDATESCOPE,MANDATETYPE) VALUES('''||sys_guid()||''','''||v_ID||''','''||v_str||''','''||v_MANDATETYPE||''')'; DBMS_OUTPUT.PUT_LINE('INPUT1:'||v_sql ); --監視SQL語句 --v_sql:='INSERT INTO TLK_MANDATESCOPE(ID,DATAID,AUTHORITYID) VALUES(sys_guid(),v_ID,v_MANDATESCOPE)'; execute immediate(v_sql); END IF; --提交 COMMIT; END PRO_MANDATESCOPE;
2.批量處理
create or replace PROCEDURE AUTHORIZESAVE (dataid in varchar2) AS v_ID varchar2(1000); v_MANDATESCOPE clob; av_split varchar2(2) := ';'; v_length number; v_start NUMBER; v_index NUMBER; v_str varchar2(1000); BEGIN DELETE FROM TLK_MANDATESCOPE WHERE DATAID = dataid; DECLARE CURSOR myCusor IS SELECT ID ,ITEM_MANDATESCOPE FROM tlk_P_Announcements WHERE ID = dataid; BEGIN OPEN myCusor; LOOP FETCH myCusor INTO v_ID,v_MANDATESCOPE; --遊標取不到資料則退出 EXIT WHEN myCusor%NOTFOUND; v_MANDATESCOPE := replace(v_MANDATESCOPE,',',';'); v_length := LENGTH(v_MANDATESCOPE); --v_length number:=LENGTH(v_MANDATESCOPE); v_start :=1; v_index :=0; v_str :=''; IF INSTR(v_MANDATESCOPE ,av_split) >0 THEN WHILE(v_start <= v_length) LOOP v_index := INSTR(v_MANDATESCOPE, av_split, v_start); IF v_index = 0 THEN v_str :=SUBSTR(v_MANDATESCOPE, v_start); v_start := v_length + 1; ELSE v_str :=SUBSTR(v_MANDATESCOPE, v_start, v_index - v_start); v_start := v_index + 1; END IF; INSERT INTO TLK_MANDATESCOPE(ID,DATAID,AUTHORITYID) VALUES(sys_guid(),v_ID,v_str); END LOOP; ELSE INSERT INTO TLK_MANDATESCOPE(ID,DATAID,AUTHORITYID) VALUES(sys_guid(),v_ID,v_MANDATESCOPE); END IF; END LOOP; CLOSE myCusor; END; --提交 COMMIT; END AUTHORIZESAVE;