當 DBA 匯出數千個資料庫物件(預存程序、函數、視圖等)的建立腳本為獨立檔案時,逐一手動執行顯然不切實際。本文提供一個 Windows 批次檔,可自動掃描指定目錄下所有腳本檔,彙整成單一 list.sql,再透過 SQL*Plus 的 @ 指令一次匯入目標資料庫,大幅簡化部署流程。
.PRC、.FNC、.VW 等腳本檔,可能分佈於子目錄。@echo off
if exist list.sql del list.sql /q
:input
cls
set input=
set /p input= 請輸入要掃描的腳本目錄路徑:
set "input=%input:"=%"
if "%input%"=="" goto input
if not exist "%input%" goto input
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do echo @@%%~fnxi>>list.sql
if not exist list.sql goto no_file
start list.sql
exit
:no_file
cls
echo %cd% 發生錯誤,未成功生成 list.sql 腳本!
pause
gen_sql_list.bat。E:\CRY)。list.sql,內容格式如:@@E:\CRY\TEST.PRC@@E:\CRY\123\TEST1.FNC@@E:\CRY\TEST2.VW
list.sql 供確認。@D:\list.sql(假設檔案在 D 槽)。
物件建立順序問題: 此法僅按檔名排序執行,未考慮物件相依性(如視圖依賴表、函數被預存程序呼叫)。匯入後大量物件可能處於 INVALID 狀態,務必於匯入完成後重新編譯所有無效物件:
-- Oracle 重新編譯無效物件範例
BEGIN
FOR cur IN (SELECT object_name, object_type FROM user_objects WHERE status = 'INVALID') LOOP
EXECUTE IMMEDIATE 'ALTER ' || cur.object_type || ' ' || cur.object_name || ' COMPILE';
END LOOP;
END;
/
01_TABLE.sql, 02_VIEW.sql),可自然滿足相依順序。sqlplus -L user/pwd@db @list.sql 實現全自動無人值守部署。sqlcmd -i list.sql 並將 @@ 改為 :r。這個簡單的批次檔解決了大量腳本檔手動部署的痛點,配合後續的無效物件重編譯,即可快速完成跨資料庫的物件遷移與同步。