如何解决 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 variable
和print
命令,并且块中不再有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:未声明绑定变量“NEW”并且 END 错误报告 - 未知命令