如何在同一个Oracle SQL脚本中声明变量并使用它?
如何在同一个Oracle SQL脚本中声明变量并使用它?
我想写可重用的代码,需要在脚本开头声明一些变量,并在随后的语句中重复使用它们,例如:
DEFINE stupidvar = 'stupidvarcontent'; SELECT stupiddata FROM stupidtable WHERE stupidcolumn = &stupidvar;
如何声明变量并在后续语句中重复使用,比如在使用 SQLDeveloper 中。
尝试
- 使用 DECLARE 部分,在 BEGIN 和 END 中插入以下 SELECT 语句。使用
&stupidvar
访问变量。 - 使用关键字 DEFINE 并访问变量。
- 使用关键字 VARIABLE 并访问变量。
但我尝试时遇到了各种各样的错误(未绑定变量、语法错误、期望 SELECT INTO...等)。
admin 更改状态以发布 2023年5月21日
如果它是一个字符变量,尝试使用双引号:
DEFINE stupidvar = "'stupidvarcontent'";
或者
DEFINE stupidvar = 'stupidvarcontent'; SELECT stupiddata FROM stupidtable WHERE stupidcolumn = '&stupidvar'
更新:
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 25 17:13:26 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn od/od@etalon Connected. SQL> define var = "'FL-208'"; SQL> select code from product where code = &var; old 1: select code from product where code = &var new 1: select code from product where code = 'FL-208' CODE --------------- FL-208 SQL> define var = 'FL-208'; SQL> select code from product where code = &var; old 1: select code from product where code = &var new 1: select code from product where code = FL-208 select code from product where code = FL-208 * ERROR at line 1: ORA-06553: PLS-221: 'FL' is not a procedure or is undefined
在SQL*Plus脚本中,有几种声明变量的方法。
第一种方法是使用VAR,声明一个绑定变量。通过 EXEC 调用分配值到 VAR 的机制如下:
SQL> var name varchar2(20) SQL> exec :name := 'SALES' PL/SQL procedure successfully completed. SQL> select * from dept 2 where dname = :name 3 / DEPTNO DNAME LOC ---------- -------------- ------------- 30 SALES CHICAGO SQL>
当我们想要调用带有 OUT 参数或函数的存储过程时,VAR 特别有用。
另一种方法是使用替换变量。这对于交互模式很有用:
SQL> accept p_dno prompt "Please enter Department number: " default 10 Please enter Department number: 20 SQL> select ename, sal 2 from emp 3 where deptno = &p_dno 4 / old 3: where deptno = &p_dno new 3: where deptno = 20 ENAME SAL ---------- ---------- CLARKE 800 ROBERTSON 2975 RIGBY 3000 KULASH 1100 GASPAROTTO 3000 SQL>
当我们编写调用其他脚本的脚本时,预定义变量可能很有用。以下代码段不需要提示我输入值即可运行:
SQL> def p_dno = 40 SQL> select ename, sal 2 from emp 3 where deptno = &p_dno 4 / old 3: where deptno = &p_dno new 3: where deptno = 40 no rows selected SQL>
最后是匿名PL/SQL块。如您所看到的,我们仍然可以交互式地分配值给已声明的变量:
SQL> set serveroutput on size unlimited SQL> declare 2 n pls_integer; 3 l_sal number := 3500; 4 l_dno number := &dno; 5 begin 6 select count(*) 7 into n 8 from emp 9 where sal > l_sal 10 and deptno = l_dno; 11 dbms_output.put_line('top earners = '||to_char(n)); 12 end; 13 / Enter value for dno: 10 old 4: l_dno number := &dno; new 4: l_dno number := 10; top earners = 1 PL/SQL procedure successfully completed. SQL>