2013-02-25 3 views
0

나는 PL/SQL 할당을위한 바인딩 변수에 숫자 값을 할당하려고하고 나에게 오류주고에 번호를 Assinging :바인딩 변수 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 

그리고 코드를

미리 감사드립니다.

답변

0

"ORA-01403 : 데이터 없음"은 SELECT가 행을 반환하지 않았 음을 의미합니다. EMPLOYEE_ID 110이 테이블에 존재하지 않을 가능성이 큽니다. 시도해보십시오.

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

아마도 0을 반환합니다.

+0

Employee_ID = 110은 존재하지 않습니다 : b_emp_id : 110을 제거하고 select 문에 employee_id = 110; 그것은 잘 작동 –

+0

참으로 이상한. 내가 아는 한, ORA-01403은 항상 PL/SQL SELECT ... INTO가 행을 찾지 못했음을 의미합니다. 몇 가지 질문 : (1) Employees.Employee_ID의 데이터 유형은 무엇입니까? (2) SQL * Plus에서 위 코드를 실행하면 어떻게됩니까? –

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를 시도하십시오.

0

이 부분은 recent answer에서 발견 된 SQL Developer의 문제인 것 같습니다. 가지고있는 코드는 SQL * Plus에서 작동합니다. 이 역시 문제를 보여줍니다 : SQL에서

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 

* 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 개발자 버그라고 가정합니다. 다만 정의되지 않은 동작 일 수 있습니다.

exec 블록을 사용하는 유일한 방법은 그 블록 내에 설정된 바인드 값이 실제 블록을 공격 할 때 범위에 있기 때문입니다 (최대 권장 값). 또는 대신 대체 변수를 사용하십시오. 또는 외부에서 선언 된 variable이 아닌 지역 변수 (declare 블록)를 사용하는 것이 가장 중요합니다. 이유는 왜 이렇게하고, 처음부터 명시 적 바인드 변수를 사용하는지에 달려 있습니다.