SHOW ERROR;
DECLARE 
CURSOR cur_pay IS SELECT * FROM PAY_TABLE WHERE MONTHS_BETWEEN(SYSDATE, EFF_DATE) > 6
FOR UPDATE NOWAIT;
BEGIN
FOR row IN cur_pay LOOP
IF row.PAY_TYPE = 'HOURLY' THEN
UPDATE PAY_TABLE SET PAY_RATE = row.PAY_TYPE
 WHERE CURRENT OF cur_pay;
ELSIF row.PAY_TYPE = 'SALARY' THEN
UPDATE PAY_TABLE SET PAY_RATE = row.PAY_TYPE*1.05
 WHERE CURRENT OF cur_pay;
END IF;
END LOOP;
END;
/错误如下:SQL> @E:\orcl_lab\payIncrease1.sql
没有错误。
DECLARE
*
第 1 行出现错误:
ORA-01722: 无效数字
ORA-06512: 在 line 7

解决方案 »

  1.   

    row.PAY_TYPE = 'HOURLY'这个PAY_TYPE是数字型的吧,你给它赋值为字符串,就出错了。
      

  2.   

    DECLARE  
    CURSOR cur_pay IS SELECT * FROM PAY_TABLE WHERE MONTHS_BETWEEN(SYSDATE, EFF_DATE) > 6
    FOR UPDATE NOWAIT;
    BEGIN
    FOR row IN cur_pay LOOP
    IF row.PAY_TYPE = 'HOURLY' THEN
    UPDATE PAY_TABLE SET PAY_RATE = row.PAY_TYPE
    WHERE CURRENT OF cur_pay;
    ELSIF row.PAY_TYPE = 'SALARY' THEN
    UPDATE PAY_TABLE SET PAY_RATE = row.PAY_TYPE*1.05
    WHERE CURRENT OF cur_pay;
    END IF;
    END LOOP;
    END;
    搞不清什么类型
      

  3.   

    改好了,谢谢,他又说这个错了
    SQL> @E:\orcl_lab\payIncrease1.sql
    PROCEDURE PRINT_ROWS 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    1/30     PLS-00103: 出现符号 "TABLE"在需要下列之一时:
             out <an identifier>
             <a double-quoted delimited-identifier> long double ref char
             time timestamp interval date binary national character nchar
             符号 "<an identifier>在 "TABLE" 继续之前已插入。5/2      PLS-00103: 出现符号 "END"在需要下列之一时:
             := . ( % ;
             符号 ";" 被替换为 "END" 后继续。
    PL/SQL 过程已成功完成。SHOW ERROR;
    DECLARE 
    CURSOR cur_pay IS SELECT * FROM PAY_TABLE 
    WHERE MONTHS_BETWEEN(SYSDATE, EFF_DATE) > 6 
    FOR UPDATE NOWAIT;
    BEGIN
    FOR row IN cur_pay LOOP
    IF row.PAY_TYPE = 'HOURLY' THEN
    UPDATE PAY_TABLE SET PAY_RATE = row.PAY_RATE*1.04
     WHERE CURRENT OF cur_pay;
    ELSIF row.PAY_TYPE = 'SALARY' THEN
    UPDATE PAY_TABLE SET PAY_RATE = row.PAY_RATE*1.05
     WHERE CURRENT OF cur_pay;
    END IF;
    END LOOP;
    END;
    /
      

  4.   


    SHOW ERROR;
    DECLARE 
        CURSOR cur_pay IS SELECT * FROM PAY_TABLE 
            WHERE MONTHS_BETWEEN(SYSDATE, EFF_DATE) > 6 
            FOR UPDATE NOWAIT;
    BEGIN
        FOR row IN cur_pay LOOP
            IF row.PAY_TYPE = 'HOURLY' THEN
                UPDATE PAY_TABLE SET PAY_RATE = row.PAY_RATE*1.04
                     WHERE CURRENT OF cur_pay;
            ELSIF row.PAY_TYPE = 'SALARY' THEN
                UPDATE PAY_TABLE SET PAY_RATE = row.PAY_RATE*1.05
                     WHERE CURRENT OF cur_pay;
            END IF;
        END LOOP;
    END;
    /
    --这两块能过去吗?类型不对吧
      

  5.   

    忘了回了,这个用show error;  就有错  但是不加就可以通过。   结贴了