我创建一个PL / SQL过程我想简单显示两条消息?

时间:2016-09-12 17:15:39

标签: plsql plsqldeveloper

下面的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

2 个答案:

答案 0 :(得分:1)

FOR I IN C1 LOOP

已经隐式打开c1并处理提取,因此在显式获取后无效。

btw i通常用于数字索引而不是记录。

当您编写该代码时,您的大写锁定也已启用;)

答案 1 :(得分:0)

我认为您的代码存在一些问题。

  1. C1不限制员工编号(意味着循环会 从表emp返回一个单独的,大部分随机的行
  2. 您正在混合FOR LOOP和FETCH语法
  3. 变量v_empno是一个NUMBER,你需要在检查长度时要小心 - 你需要明确地TO_CHAR并控制格式 - 通常TO_CHAR最终会包含空格字符(另一种方法是检查一个数字的值是< 10000)
  4. 我没有测试过这段代码,但这可能更接近您所追求的内容:

    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 ;