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

Posted

技术标签:

【中文标题】如何解决 SP2-0552:未声明绑定变量?【英文标题】:How to solve SP2-0552: Bind variable not declared? 【发布时间】:2016-03-20 13:24:39 【问题描述】:

当我运行这个 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.我错过了什么或做错了什么?

【问题讨论】:

这并不能解决我的问题。 我认为您在声明块后缺少分号。不应该是v_max_sal NUMBER(20);吗? 不。像这样都行不通。 :) 【参考方案1】:

如果你确实想要一个绑定变量,那么你需要在块之外声明它

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 代码之外引用。

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

【讨论】:

【参考方案2】:

另请注意,绑定变量的典型用法包括 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

【讨论】:

我必须使用绑定变量,所以不能替换“:”。 请重新表述问题;你的目标是什么。【参考方案3】:

在您的select ... into 声明中,将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 emp e, dept d
  6  where e.deptno=d.deptno
  7  and d.dname='SALES';
  8  END;
  9  /

【讨论】:

以上是关于如何解决 SP2-0552:未声明绑定变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥会显示“SP2-0552:未声明绑定变量“SEL”。”在 sql 加?

SP2-0552:未声明绑定变量“N3”

SP2-0552:未声明绑定变量“NEW”并且 END 错误报告 - 未知命令

sqlplus pl/sql Date/Time 用户输入理解为绑定变量

这个程序有啥错误?

用于在表上自动生成 ID 的序列和触发 PL/SQL 脚本