PL / SQL没有找到数据

时间:2015-11-26 22:47:59

标签: oracle plsql

我似乎无法弄清楚为什么它没有找到数据。这个表是填充的,所以当我拉它时为什么不找到数据呢?我尝试了几种不同的方法,但不断提出相同的错误。

这是newemp表:

SQL> select *
  2  from newemp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM
---------- ---------- --------- ---------- --------- ---------- ----------
    DEPTNO
----------
      7369 SMITH      CLERK           7902 17-DEC-80        800
        20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300
        30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500
        30

      7566 JONES      MANAGER         7839 02-APR-81       2975
        20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400
        30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850
        30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450
        10

      7788 SCOTT      ANALYST         7566 19-APR-87       3000
        20

      7839 KING       PRESIDENT            17-NOV-81       5000
        10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0
        30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100
        20

      7900 JAMES      CLERK           7698 03-DEC-81        950
        30

     7902 FORD       ANALYST         7566 03-DEC-81       3000
        20

      7934 MILLER     CLERK           7782 23-JAN-82       1300
        10

这是我的PL / SQL代码,不断出现这个错误:

SET VERIFY OFF
DECLARE
   v_ename    newemp.ename%TYPE; 
   v_sal      newemp.sal%TYPE;
   v_newgoal  newemp.deptno%TYPE;
   v_deptno   newemp.deptno%TYPE;
BEGIN
   SELECT ename, sal, deptno INTO v_ename, v_sal, v_deptno
   FROM newemp
   WHERE ename = v_ename;
   IF v_deptno = 10 then 
           v_newgoal := v_sal * 1.05;
         else  
          if v_deptno = 20 then 
          v_newgoal := v_sal * 1.075;
        else 
         v_newgoal := v_sal * 1.1;
 END IF;
END IF;
   UPDATE newemp
   SET sal = v_newgoal
   WHERE ename = v_ename;
COMMIT;
END;
/
SET VERIFY ON

错误是:

SQL> @ loop1
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 7

当我添加异常时,它表示PL / SQL过程已完成,但未更新表

更新的新代码仍未更新:

SET VERIFY OFF
DECLARE
   v_ename    newemp.ename%TYPE; 
   v_sal      newemp.sal%TYPE;
   v_newgoal  newemp.deptno%TYPE;
   v_deptno   newemp.deptno%TYPE;
BEGIN
   v_ename := 'NULL';

   begin
     SELECT ename, sal, deptno INTO v_ename, v_sal, v_deptno
     FROM newemp
     WHERE ename = v_ename;
   exception when no_data_found then 
          return;
   end;

   IF v_deptno = 10 then 
           v_newgoal := v_sal * 1.05;
         else  
          if v_deptno = 20 then 
          v_newgoal := v_sal * 1.075;
        else 
         v_newgoal := v_sal * 1.1;
 END IF;
END IF;
   UPDATE newemp
   SET sal = v_newgoal
   WHERE ename = v_ename;
COMMIT;
END;
/
SET VERIFY ON

2 个答案:

答案 0 :(得分:1)

您在代码中

未向变量v_ename分配任何值 你需要的是添加一些逻辑来分配它。

另外,您需要检查表中是否存在值,或者检查check catch异常。

以下修改后的示例:

SET VERIFY OFF
DECLARE
   v_ename    newemp.ename%TYPE; 
   v_sal      newemp.sal%TYPE;
   v_newgoal  newemp.sal%TYPE;
   v_deptno   newemp.deptno%TYPE;
BEGIN
   --assign some value
   v_ename := null; --if null - it updates all records in table

   for rc in (SELECT ename, sal, deptno
     FROM newemp
     WHERE ename = nvl(v_ename, ename)) loop

   IF rc.deptno = 10 then 
           v_newgoal := rc.sal * 1.05;
         else  
          if rc.deptno = 20 then 
             v_newgoal := rc.sal * 1.075;
           else 
             v_newgoal := rc.sal * 1.1;
           END IF;
   END IF;

   UPDATE newemp
     SET sal = v_newgoal
   WHERE ename = rc.ename;

   end loop;

COMMIT;
END;
/
SET VERIFY ON

相同的逻辑但更简单的代码

declare
  v_ename    newemp.ename%TYPE;
begin
  v_ename := 'employee_name'; --use null if you need update all employees
UPDATE newemp
   SET sal = 
     case 
       when v_deptno = 10 then sal * 1.05
       when v_deptno = 20 then sal * 1.075
       else sal * 1.1     
     end          
   WHERE ename = nvl(v_ename,ename);
end;   

答案 1 :(得分:0)

那么,为什么要使用PL / SQL并只使用一个SQL查询?

UPDATE newemp
SET    sal   = CASE DEPTNO
               WHEN 10 THEN sal * 1.05
               WHEN 20 THEN sal * 1.075
                       ELSE sal * 1.1
               END;

如果这是用于某种评估,您必须使用PL / SQL:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE NEWEMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) AS
          SELECT 7369, 'SMITH', 'CLERK', 7902, DATE '1980-12-17', 800, NULL, 20 FROM DUAL
UNION ALL SELECT 7499, 'ALLEN', 'SALESMAN', 7698, DATE '1981-02-20', 1600, 300, 30 FROM DUAL
/

DECLARE
  CURSOR c_employees
  IS  SELECT   EMPNO, DEPTNO, SAL
      FROM     newemp
      FOR UPDATE OF SAL;
BEGIN
   FOR v_row IN c_employees
   LOOP
    IF    v_row.DEPTNO = 10 THEN v_row.SAL := v_row.SAL * 1.05;
    ELSIF v_row.DEPTNO = 20 THEN v_row.SAL := v_row.SAL * 1.075;
                            ELSE v_row.SAL := v_row.SAL * 1.1;
    END IF;

    UPDATE NEWEMP
    SET    SAL   = v_row.SAL
    WHERE  EMPNO = v_row.EMPNO;
   END LOOP;
END;
/

查询1

SELECT *
FROM   NEWEMP

<强> Results

| EMPNO | ENAME |      JOB |  MGR |                   HIREDATE |  SAL |   COMM | DEPTNO |
|-------|-------|----------|------|----------------------------|------|--------|--------|
|  7369 | SMITH |    CLERK | 7902 | December, 17 1980 00:00:00 |  860 | (null) |     20 |
|  7499 | ALLEN | SALESMAN | 7698 | February, 20 1981 00:00:00 | 1760 |    300 |     30 |