說明:使用此過程可任意執行批量DDL語句,調用DDL查詢語句時,注意轉義字符,使用 ' 轉義!
需求:批量刪除以CUR_TEST開頭的表,且有日志記錄。
環境准備:建幾張以CUR_TEST開頭測試表。
CREATE TABLE CUR_TEST_1(ID INT); CREATE TABLE CUR_TEST_2(ID INT); CREATE TABLE CUR_TEST_3(ID INT);
創建日志表:
CREATE TABLE PRO_BATCH_DDL_LOG(OP_TIME DATE,DDL_INFO VARCHAR2(100));
創建批量執行DDL操作存儲過程:
CREATE OR REPLACE PROCEDURE PRO_BATCH_DDL(SQL_CODE VARCHAR2) AS TYPE CUR_TYPE IS REF CURSOR; --定義動態游標類型 CUR_BATCH_DDL CUR_TYPE; --定義動態游標參數 DDL_CODE VARCHAR2(100); --定義接收值參數 BEGIN OPEN CUR_BATCH_DDL FOR SQL_CODE; --打開游標,並賦值。 LOOP --開始循環 FETCH CUR_BATCH_DDL INTO DDL_CODE; --將游標內的值,賦值給DDL_CODE EXIT WHEN CUR_BATCH_DDL%NOTFOUND; --當游標中無值時退出循環 EXECUTE IMMEDIATE DDL_CODE; --動態執行DDL COMMIT; --多使用commit是個好習慣 INSERT INTO PRO_BATCH_DDL_LOG VALUES(SYSDATE,DDL_CODE); --將DDL語句插入日志表 COMMIT; --多使用commit是個好習慣 END LOOP; --結束循環 CLOSE CUR_BATCH_DDL; --關閉游標 END;
編寫批量執行的SQL語句,並檢查SQL查詢結果是否有誤:
SELECT 'DROP TABLE '||TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE'CUR_TEST_%';
調用過程(PRO_BATCH_DDL):
CALL PRO_BATCH_DDL('SELECT ''DROP TABLE ''||TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE''CUR_TEST_%''');