--游标 --函数
--1.取出emp表中的所有人的名字
DECLARE
CURSOR C IS SELECT * FROM EMP;
V_EMP C%ROWTYPE; --V_EMP;带游标的emp中的数据
BEGIN
OPEN C; --打开游标
FETCH C INTO V_EMP; --把当前游标指向的数据拿出来
DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
CLOSE C;
END;
--循环输出
DECLARE
CURSOR C IS --声明游标
SELECT * FROM EMP;
V_EMP C%ROWTYPE;
BEGIN
OPEN C; --打开游标
LOOP
FETCH C INTO V_EMP; --把当前的游标指定的数据拿出来
EXIT WHEN (C%NOTFOUND);
DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
END LOOP;
CLOSE C;
END;
--2.带参数的游标
DECLARE
CURSOR C(V_DEPTNO EMP.DEPTNO%TYPE,V_JOB EMP.JOB%TYPE)
IS
SELECT ENAME,SAL FROM EMP WHERE DEPTNO =V_DEPTNO AND JOB =V_JOB;
BEGIN
FOR V_TEMP IN C(30,'CLERK')
LOOP
DBMS_OUTPUT.PUT_LINE(V_TEMP.ENAME);
END LOOP;
END;
SELECT * FROM EMP WHERE DEPTNO =30 AND JOB ='CLERK';
--3.可更新的游标
--创建一张表
CREATE TABLE EMP2
AS
SELECT * FROM EMP; --11
SELECT * FROM EMP2;
--需求是小于于2000的*2,大于等于3000的删掉
DECLARE
CURSOR C
IS
SELECT * FROM EMP2 FOR UPDATE; --只要写for update:为了更新才使用的游标
BEGIN
FOR V_TEMP IN C
LOOP
IF(V_TEMP.SAL<2000)THEN
UPDATE EMP2 SET SAL = SAL*2 WHERE CURRENT OF C; --当前游标
ELSIF(V_TEMP.SAL >3000)THEN
DELETE FROM EMP2 WHERE CURRENT OF C;
END IF;
END LOOP;
END;
--函数
CREATE OR REPLACE FUNCTION SAL_TAX --方法 计算薪资的个人所得税
(V_SAL NUMBER) --形参number类型
RETURN NUMBER
IS
BEGIN
IF(V_SAL<2000)THEN
RETURN 0.10;
ELSIF(V_SAL <2750)THEN
RETURN 0.15;
ELSE
RETURN 0.20;
END IF;
END;
--1.取出emp表中的所有人的名字
DECLARE
CURSOR C IS SELECT * FROM EMP;
V_EMP C%ROWTYPE; --V_EMP;带游标的emp中的数据
BEGIN
OPEN C; --打开游标
FETCH C INTO V_EMP; --把当前游标指向的数据拿出来
DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
CLOSE C;
END;
--循环输出
DECLARE
CURSOR C IS --声明游标
SELECT * FROM EMP;
V_EMP C%ROWTYPE;
BEGIN
OPEN C; --打开游标
LOOP
FETCH C INTO V_EMP; --把当前的游标指定的数据拿出来
EXIT WHEN (C%NOTFOUND);
DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
END LOOP;
CLOSE C;
END;
--2.带参数的游标
DECLARE
CURSOR C(V_DEPTNO EMP.DEPTNO%TYPE,V_JOB EMP.JOB%TYPE)
IS
SELECT ENAME,SAL FROM EMP WHERE DEPTNO =V_DEPTNO AND JOB =V_JOB;
BEGIN
FOR V_TEMP IN C(30,'CLERK')
LOOP
DBMS_OUTPUT.PUT_LINE(V_TEMP.ENAME);
END LOOP;
END;
SELECT * FROM EMP WHERE DEPTNO =30 AND JOB ='CLERK';
--3.可更新的游标
--创建一张表
CREATE TABLE EMP2
AS
SELECT * FROM EMP; --11
SELECT * FROM EMP2;
--需求是小于于2000的*2,大于等于3000的删掉
DECLARE
CURSOR C
IS
SELECT * FROM EMP2 FOR UPDATE; --只要写for update:为了更新才使用的游标
BEGIN
FOR V_TEMP IN C
LOOP
IF(V_TEMP.SAL<2000)THEN
UPDATE EMP2 SET SAL = SAL*2 WHERE CURRENT OF C; --当前游标
ELSIF(V_TEMP.SAL >3000)THEN
DELETE FROM EMP2 WHERE CURRENT OF C;
END IF;
END LOOP;
END;
--函数
CREATE OR REPLACE FUNCTION SAL_TAX --方法 计算薪资的个人所得税
(V_SAL NUMBER) --形参number类型
RETURN NUMBER
IS
BEGIN
IF(V_SAL<2000)THEN
RETURN 0.10;
ELSIF(V_SAL <2750)THEN
RETURN 0.15;
ELSE
RETURN 0.20;
END IF;
END;