1. 程式人生 > 其它 >Oracle上線包裡的@和@@有什麼區別?

Oracle上線包裡的@和@@有什麼區別?

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.