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.
标签:包里,上线,SQL,update,sql,Oracle,world,main,hello
From: https://www.cnblogs.com/fooobabar/p/16975428.html