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