如何解决SP2-0552:绑定变量未声明?

时间:2016-03-20 13:24:39

标签: oracle variables plsql

当我运行这个PL / SQL块时:

SQL> set serveroutput on
SQL> declare
  2  v_max_sal NUMBER(20)
  3  begin
  4  select max(sal) INTO :v_max_sal
  5  from emp e, dept d
  6  where e.deptno=d.deptno
  7  and d.dname='SALES';
  8  END;
  9  /

它向我抛出了下一个错误:SP2-0552: Bind variable "V_MAX_SAL" not declared.我错过了什么或做错了什么?

3 个答案:

答案 0 :(得分:1)

MaxValue声明中丢失:前面的v_max_sal

select ... into

答案 1 :(得分:0)

另请注意,绑定变量的典型用法涵盖WHERE谓词中的文字字符串,因此您可以另外用它替换部门名称(以便能够对所有部门使用相同的查询)。

VARIABLE v_max_sal NUMBER;
VARIABLE v_dname VARCHAR2(14);

begin
:v_dname := 'SALES';

select max(sal) INTO :v_max_sal
from scott.emp e, scott.dept d
where e.deptno=d.deptno
and d.dname = :v_dname;
END;
/

print v_max_sal;

您也可以在变量之前简单地删除冒号,它也会起作用:

SQL> set serveroutput on
SQL> declare
  2  v_max_sal NUMBER(20);
  3  begin
  4  select max(sal) INTO v_max_sal
  5  from scott.emp e, scott.dept d
  6  where e.deptno=d.deptno
  7  and d.dname='SALES';
  8  dbms_output.put_line(v_max_sal);
  9  END;
 10  /
2850

请注意,此变体和@Alex提出的解决方案会在数据库中导致相同的查询:

 SELECT MAX(SAL) FROM SCOTT.EMP E, SCOTT.DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='SALES'

所以在数据库中没有使用绑定变量

此答案开头的扩展选项会导致在WHERE子句中使用BV进行查询:

 SELECT MAX(SAL) FROM SCOTT.EMP E, SCOTT.DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.DNAME = :B1

答案 2 :(得分:0)

如果你肯定想要一个绑定变量,那么你需要在外面块声明它:

variable v_max_sal number;

begin
  select max(sal)
  into :v_max_sal
  from dept d
  join emp e
  on e.deptno=d.deptno
  where d.dname='SALES';
end;
/

print v_max_sal

注意SQL*Plus client variableprint命令,并且块中不再有declare部分,因为您现在没有或不需要本地PL / SQL变量。当一个局部变量在查询中使用时,它可以充当绑定变量 - 解析器就会看到它,并且你会在查询的计划中看到一个占位符 - 但它并不完全相同,因为你通常需要绑定变量可以在Pl / SQL代码之外进行引用。

我也使用了现代连接语法,但这与问题无关。