在使用sqlplus執行sql指令碼時,經常碰到向指令碼傳遞參數的情形。類似於shell指令碼的參數傳遞,我們同樣可以向sql指令碼傳遞參數,其方法是指令碼後面直接跟多個連續的參數並以空格分開。本文描述該內容並給出樣本。
1、SQLPlus 的協助資訊
下面的協助資訊是關於sqlplus調用帶參指令碼的說明
sqlplus -H
<start> is: @<URL>|<filename>[.<ext>] [<parameter> ...]
Runs the specified SQL*Plus script from a web server (URL) or the
local file system (filename.ext) with specified parameters that
will be assigned to substitution variables in the script.
2、shell 提示符下sqlplus調用帶參指令碼
SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
SQL> insert into emp(empno,ename,job) select 8888,'Bob Cheng','DBA' from dual;
SQL> commit;
[oracle@linux1 ~]$ more test.sql
set linesize 160
select empno,ename,job from &1 where upper(ename)=upper('&2');
exit;
[oracle@linux1 ~]$ sqlplus scott/tiger@rac11g @test.sql emp scott
old 1: select empno,ename,job from &1 where upper(ename)=upper('&2')
new 1: select empno,ename,job from emp where upper(ename)=upper('scott')
EMPNO ENAME JOB
---------- ---------- ---------
7788 SCOTT ANALYST
--注意,對於含有空格的調用需要使用單引號或雙引號,如下樣本
[oracle@linux1 ~]$ sqlplus scott/tiger @test.sql emp 'bob cheng'
old 1: select empno,ename,job from &1 where upper(ename)=upper('&2')
new 1: select empno,ename,job from emp where upper(ename)=upper('bob cheng')
EMPNO ENAME JOB
---------- ---------- ---------
8888 Bob Cheng DBA
[oracle@linux1 ~]$ sqlplus scott/tiger @test.sql emp "bob cheng"