2016-09-12 4 views
-1

PL/SQL 프로 시저 :이 절차에서하나의 PL/SQL 프로 시저를 만들면 간단하게 두 개의 메시지를 표시 할 수 있습니까? 아래

'DECLARE 

V_EMPNO NUMBER(10):=&EMPNO; 

V_EMPNO2 NUMBER(10):= 0; 

CURSOR C1 IS SELECT EMPNO FROM EMP; 

BEGIN 

FOR I IN C1 LOOP 

FETCH C1 INTO V_EMPNO2; 

EXIT WHEN C1%FOUND; 

END LOOP; 

IF (LENGTH(V_EMPNO)) > 4 THEN 

DBMS_OUTPUT.PUT_LINE ('LENGTH OF EMPNO GREATER THAN 4 NUMBER'); 

ELSIF (V_EMPNO = V_EMPNO2) THEN 

DBMS_OUTPUT.PUT_LINE ('THIS EMPLOYEE NUMBER ALREADY EXIST'); 

END IF; 

END; 

/' 

나는 두 개의 메시지 를 표시 할 하나의 쇼 메시지 수보다 4보다 더 극한 상황을 제외한 모든 상황에서 접힘 및 v_empno = v_empno2 후 두 번째 메시지를 표시하는 경우 두 번째 경우입니다

EMPNO = v_empno 후 보여 메시지 :

DBMS_OUTPUT.PUT_LINE ('THIS EMPLOYEE NUMBER ALREADY EXIST') 

this is error 

Enter value for empno: 4444 

DECLARE 

* 

ERROR at line 1: 

ORA-01001: invalid cursor 

ORA-06512: at line 7 
+0

btw 프로 시저가 아니라 블록입니다. 그리고 왜 따옴표 안에 들어 있습니까? –

답변

0

난 당신의 코드에 문제가 몇 가지 있다고 생각)

또한 캡은 당신이 그 코드를 작성하는 경우에 있던 잠급니다.

  1. C1은 구문에게 당신은 LOOP위한 혼합되어
  2. 테이블 EMP에서 단일 크게 임의의 행을 반환하고 가져옵니다 루프를 의미 사원 번호 (에 제한하지 않습니다
  3. 변수 v_empno 당신은 번호이며, 길이를 검사 할 때주의해야 - 명시 적 TO_CHAR 필요하고 형식을 제어 - 자주 TO_CHAR 공백 문자를 포함하여 종료됩니다

I (대안 숫자의 값을 확인하는 것입니다 것은 < 10000) 이 코드를 테스트하지는 않았지만이 코드는 사용자가 수행 한 작업에 더 가깝습니다.

DECLARE 

    l_empno  NUMBER := &empno ; 

    CURSOR C_get_emp 
    IS 
    SELECT e.empno 
    FROM emp   e 
    WHERE e.empno = l_empno 
    ; 
    R_emp   C_get_emp%ROWTYPE ; 

BEGIN 

    IF LENGTH(TRIM(TO_CHAR(l_empno))) > 4 THEN 

    DBMS_OUTPUT.put_line('Length of empno > 4') ; 

    ELSE 

    OPEN C_get_emp ; 
    FETCH C_get_emp INTO R_emp ; 
    IF C_get_emp%FOUND THEN 
     DBMS_OUTPUT.put_line('Employee number already exists') ; 
    END IF ; 
    CLOSE C_get_emp ; 


    END IF ; 

END ; 
+0

귀하의 예제는 아마 가상이지만, 이런 식으로 숫자 ID 필드의 길이를 제한하는 좋은 이유를 생각할 수 없습니다 - ID는 시퀀스에서 생성되고 왜 9999 ID로 제한됩니까? –

1
FOR I IN C1 LOOP 

을 벌써 y는 암시 적으로 c1을 열고 가져 오기를 처리하므로 명시 적 가져 오기가 유효하지 않은 후에 가져올 수 있습니다.

btw i은 일반적으로 레코드가 아닌 숫자 인덱스에 사용됩니다.