【问题标题】:Assinging a number to binding variable pl/sql为绑定变量 pl/sql 赋值
【发布时间】:2013-02-10 02:21:46
【问题描述】:

我正在尝试为 pl/sql 分配的绑定变量分配一个数字值,它给了我错误:

Error report:  
ORA-01403: no data found
ORA-06512: at line 15
01403. 00000 -  "no data found"
Cause: 
Action:
b_emp_id
------
b_emp_id

还有代码

VARIABLE b_emp_id NUMBER

DECLARE

v_emp_id employees.employee_id%TYPE;
v_FIRST_NAME employees.first_name%TYPE;
v_LAST_NAME employees.last_name%TYPE;
v_JOB_ID employees.job_id%TYPE;
v_HIRE_DATE employees.hire_date%TYPE;
v_message VARCHAR2(30);
v_difference NUMBER(3);

BEGIN

:b_emp_id:=110;

 SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, job_id, HIRE_DATE 
 INTO v_emp_id, v_FIRST_NAME, v_LAST_NAME, v_JOB_ID, v_HIRE_DATE
 FROM employees
 WHERE EMPLOYEE_ID = :b_emp_id;

提前谢谢大家!!!

【问题讨论】:

    标签: oracle plsql plsqldeveloper


    【解决方案1】:

    这似乎是 SQL Developer 的一个问题,我在 recent answer 上注意到了这个问题。您拥有的代码将在 SQL*Plus 中运行。这也说明了问题:

    variable b_emp_id number
    set serveroutput on
    begin
        :b_emp_id := 110;
        if :b_emp_id is null then
            dbms_output.put_line('b_emp_id is null');
        else
            dbms_output.put_line('b_emp_id is not null: ' || :b_emp_id);
        end if;
    end;
    /
    print b_emp_id;
    
    anonymous block completed
    b_emp_id is null
    
    B_EMP_ID
    ---
    110
    

    在 SQL*Plus 中给出:

    b_emp_id is not null: 110
    
    PL/SQL procedure successfully completed.
    
    B_EMP_ID
    ---
    110
    

    ...如你所料。 select 110 into :b_emp_id from dual 技巧在这里也不起作用。无论哪种方式,分配给绑定变量的值都不能在块内部使用,但在外部可见,这很奇怪。我认为这是一个 SQL Developer 错误,但我猜它可能只是未定义的行为。

    看来您唯一的选择是使用单独的exec 块,因为当您点击真正的块时,其中设置的绑定值在范围内(如 Max 建议的那样);或改用替换变量;或使用局部变量(在declare 块中)而不是外部声明的variable - 取决于您为什么要这样做并首先使用显式绑定变量。

    【讨论】:

      【解决方案2】:

      您的绑定变量可能未正确分配值。试试下面的代码:-

      VARIABLE b_emp_id NUMBER;
      EXEC :b_emp_id := 110;
      
      DECLARE
      
      v_emp_id employees.employee_id%TYPE;
      v_FIRST_NAME employees.first_name%TYPE;
      v_LAST_NAME employees.last_name%TYPE;
      v_JOB_ID employees.job_id%TYPE;
      v_HIRE_DATE employees.hire_date%TYPE;
      v_message VARCHAR2(30);
      v_difference NUMBER(3);
      
      BEGIN
      
       SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, job_id, HIRE_DATE 
       INTO v_emp_id, v_FIRST_NAME, v_LAST_NAME, v_JOB_ID, v_HIRE_DATE
       FROM employees
       WHERE EMPLOYEE_ID = :b_emp_id;
      END;
      /
      
      print b_emp_id
      

      在 sqlplus 中尝试上述方法。

      【讨论】:

        【解决方案3】:

        “ORA-01403:未找到数据”表示您的 SELECT 未返回任何行。表中很可能不存在 EMPLOYEE_ID 110。试试这个:

        SELECT COUNT(*) FROM Employees WHERE Employee_ID = 110;
        

        它可能会返回零。

        【讨论】:

        • Employee_ID = 110 确实存在,因为如果我摆脱 :b_emp_id:110 并在 select 语句中放置employee_id = 110;它工作正常
        • 确实很奇怪。据我所知,ORA-01403 总是意味着 PL/SQL SELECT...INTO 没有找到任何行。几个问题:(1)Employees.Employee_ID 的数据类型是什么? (2) 当您在 SQL*Plus 中运行上述代码时会发生什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2011-04-06
        • 2021-09-16
        相关资源
        最近更新 更多