0

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;

よろしくお願いします!!!

4

3 に答える 3

0

バインド変数に値が正しく割り当てられていない可能性があります。次のコードを試してください:-

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で上記を試してください。

于 2013-02-25T04:54:02.323 に答える
0

これは、最近の回答で気付いた SQL Developer の問題のようです。作成したコードは 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なぜこのようにして、最初に明示的なバインド変数を使用するのかによって異なります。

于 2013-02-25T10:19:50.980 に答える
0

「ORA-01403: データが見つかりません」は、SELECT が行を返さなかったことを意味します。ほとんどの場合、EMPLOYEE_ID 110 はテーブルに存在しません。これを試して:

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

おそらくゼロを返します。

于 2013-02-25T00:51:29.863 に答える