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.



posted on 2022-12-12 10:30  我是一只胖子  阅读(1609)  评论(0编辑  收藏  举报