Oracle上線包裡的@和@@有什麼區別?
阿新 • • 發佈:2022-12-12
Oracle儲存過程的釋出方式比較古老, 使用sqlplus工具,執行一個入口檔案,檔案內通過@符號的方式呼叫其他檔案或執行入口檔案中的sql,而呼叫其他檔案的方法有@、@@、start 他們分別有什麼區別呢?
@跟start 功能相同,至少釋出這一塊功能是相同的。 剩下是@和@@
-
區別體現在Linux中,在Windows PLSQL工具中無區別。
- 雙@符號,認為被呼叫指令碼與入口檔案同目錄,實際工作中使用較多;
- 單@符號,認為被呼叫指令碼在當前工作目錄,實際工作中使用較少,因為你不知道dba究竟在什麼目錄下執行。
-
下面準備了一個簡單的測試,測試內容如下:
- 上線包中包含三個.sql 指令碼,其中update_main.sql是入口檔案, 它分別呼叫了hello.sql 和 world.sql
測試指令碼內容
- update_main.sql
set serveroutput on
@hello.sql
@world.sql
- hello.sql
exec dbms_output.put_line('hello');
- world.sql
exec dbms_output.put_line('world');
當呼叫者使用sqlplus 呼叫update_main.sql時,當前目錄跟update_main.sql所在目錄不是同一個目錄時,則使用單個@符號的呼叫會報錯。 會報找不到hello.sql 和world.sql 。
當前目錄受到 ORACLE_PATH或SQLPATH環境變數控制,這裡不做討論。
SQL> !pwd
/home/oracle
SQL> @/home/oracle/plsqltest/update_main.sql
SP2-0310: unable to open file "hello.sql"
SP2-0310: unable to open file "world.sql"
調整update_main.sql中的單個@變成雙@
SQL> !cat ./plsqltest/update_main.sql set serveroutput on @@hello.sql @@world.sql SQL> @/home/oracle/plsqltest/update_main.sql hello PL/SQL procedure successfully completed. world PL/SQL procedure successfully completed.