如何讓 SQL Developer 編譯包含 DDL 中的程式碼的程式碼?
我正在準備 SQL 腳本,它可以將一組程式碼部署到目標環境中,而無需大驚小怪。我希望執行 DBA 只需登錄到目標數據庫並執行“install_release.sql”。該文件“包含”(通過SQL Developer 支持的“@”命令)其他腳本:
PROMPT Compile package specs... PROMPT ...package A @../../../path/to/packageA/spec.sql PROMPT ...package B @../../../path/to/packageB/spec.sql PROMPT Compile package bodies... PROMPT ...package A @../../../path/to/packageA/body.sql PROMPT ...package B @../../../path/to/packageB/body.sql
該過程的這一部分似乎效果很好。
但是,每個包主體都試圖包含要包含在包定義中的常見、重複的 SQL 片段(例如,標準
EXCEPTION
聲明)。例如,“exception_declarations.sql”包含如下程式碼:EMPTY_PARAMTER EXCEPTION INSUFFICIENT_ACCESS EXCEPTION
而“packageA/body.sql”包含如下程式碼:
CREATE OR REPLACE PACKAGE BODY My_Schema.PackageA AS @../../../path/to/exception_declarations.sql FUNCTION ETC(...etc...
當我嘗試從 SQL Developer 作為腳本執行“install_release.sql”時,我可以從生成的日誌中看到編譯器遵循編譯規範的路徑(沒問題),並進入包體……但一旦進入包體,它在嘗試執行時拋出此錯誤
@../../../path/to/exception_declarations.sql
:在預期以下內容時遇到符號“@”:begin end function pragma procedure subtype type current cursor delete exists prior
更神秘的是,當通過 SQL Plus 執行時,這個完全相同的程式碼可以按預期編譯(沒有錯誤)(我只是使用 SQL Plus,但我正在通過一個相當鎖定的虛擬機遠端工作,它不會讓我安裝 SQL另外……但確實讓我“安裝”SQL Developer……它很複雜……我不喜歡談論它,因為那時惡魔開始嘲笑我)。
我在這裡做錯了什麼?為什麼編譯器會遵循一組腳本中的路徑,而不是包體程式碼中的路徑?我認為這是因為
@
命令嵌入在 DDL 中……所以……我怎樣才能讓 SQL Developer 編譯包含 DDL 中的程式碼的程式碼?
@ != #include @ == START
START 命令及其“@”等效項將呼叫完整的外部 PL/SQL 腳本。
“@”和 START不是Oracle PL/SQL 語法的一部分,因此您不能在其他 PL/SQL DDL 結構中使用它。
您應該以正確的順序建構包含所有內容的單個腳本或包含每個較低級別元素的頂級“控制器”腳本。
@ empty_parameter_exception.sql @ insufficient_access_exception.sql @ package_a.sql @ package_a.body.sql @ package_b.sql @ package_b.body.sql
無論如何,如果您的異常等是“標準的”,那麼它們是否應該不在自己的包中,而不是重複它們
$$ textual $$每個單獨編譯的包中的定義?