【问题标题】:How to solve SP2-0552: Bind variable not declared?如何解决 SP2-0552:未声明绑定变量?
【发布时间】: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);吗?
  • 不。像这样都行不通。 :)

标签: oracle variables plsql


【解决方案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  /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2021-12-11
      相关资源
      最近更新 更多