当我运行这个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.
我错过了什么或做错了什么?
答案 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 variable
和print
命令,并且块中不再有declare
部分,因为您现在没有或不需要本地PL / SQL变量。当一个局部变量在查询中使用时,它可以充当绑定变量 - 解析器就会看到它,并且你会在查询的计划中看到一个占位符 - 但它并不完全相同,因为你通常需要绑定变量可以在Pl / SQL代码之外进行引用。
我也使用了现代连接语法,但这与问题无关。