|
||',他的薪水是:'||v_sal);
--异常处理
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('输入有误,请重新输入!');
END;
/
案例
CREATE PROCEDURE a1(a1name VARCHAR2,a1sal NUMBER) IS
BEGIN
--执行,根据故原名修改工资
UPDATE EMP SET sal=a1sal WHERE ename=a1name;
END;
/
EXEC a1('SCOTT',150);--这样SCOTT的工资就被修改成了150
--采用function来查询某个雇员的工资
CREATE FUNCTION fj_fun1(fjname VARCHAR2)
RETURN NUMBER IS yearsal NUMBER(7,2);
BEGIN
--执行部分
SELECT sal*12+NVL(comm,0)*12 INTO yearsal FROM EMP WHERE ename=fjname;
RETURN yearsal;
END;
/
--调用
VAR abc NUMBER;
CALL fj_fun1('SCOTT') INTO:abc;
--创建包。声明该包有一个过程update_sal,声明该包有一个函数annual_income:
CREATE PACKAGE fj_package IS
PROCEDURE update_sal(name VARCHAR2,newsal NUMBER);
FUNCTION annual_income(name VARCHAR2) return NUMBER;
END;
/
--给包sp_package实现包体 ,来修改某个雇员的工资或者查询某个雇员的工资
CREATE OR REPLACE PACKAGE BODY fj_package IS
PROCEDURE update_sal(name VARCHAR2, newsal NUMBER) IS
BEGIN
UPDATE EMP SET sal = newsal WHERE ename = name;
END;
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER IS
annual_salary NUMBER;
BEGIN
SELECT sal * 12 + NVL(comm, 0) INTO annual_salary FROM EMP WHERE ename = name;
RETURN annual_salary;
END;
END;
/
--调用
CALL fj_package.update_sal('SCOTT', 1400);
--输入员工号,显示雇员姓名、工资、个人所得税,税率为0.03为例
DECLARE
c_tax_rate NUMBER(3,2):=0.03;
v_name VARCHAR2(5);--EMP.ename%TYPE
v_sal NUMBER(7,2);--EMP.sal%TYPE
v_tax_sal NUMBER(7,2);
BEGIN
--执行
SELECT ename,sal INTO v_name,v_sal FROM EMP WHERE EMPno=&no;
--计算个人所得税
v_tax_sal:=v_sal*c_tax_rate;--注意冒号
--输出
DBMS_OUTPUT.PUT_LINE('雇员是:'||v_name||',工资是:'||v_sal||',需要交的个人所得税是:'||v_tax_sal);
END;
/
--类似于高级语言中的结构体
--PL/SQL记录实例
DECLARE
--表示要定义一个PL/SQL记录类型 EMP_record_type,类型包含name,salary,title
TYPE EMP_record_type IS RECORD(
name EMP.ename%TYPE,
salary EMP.sal%TYPE,
title EMP.job%TYPE
);
--定义了一个变量,这个变量的类型是EMP_record_type
fj_record EMP_record_type;--v_name VARCHAR2(45);
BEGIN
SELECT ename,sal,job INTO fj_record FROM EMP WHERE EMPno=7788;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_record.name||',工资是:'||fj_record.salary);
END;
/
--相当于高级语言中的数组
DECLARE
--定义了一个PL/SLQL表类型,该类型是用于存放EMP.ename%TYPE
TYPE fj_TABLE_type IS TABLE OF EMP.ename%TYPE
INDEX BY BINARY_INTEGER;--代表下标是按整数排序的,可以为负数
fj_TABLE fj_TABLE_type;
BEGIN
SELECT ename INTO fj_TABLE(0) FROM EMP WHERE EMPno=7788;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_TABLE(0));--下标跟上面的下标一样
END;
/
DECLARE
--定义了一个PL/SLQL表类型,该类型是用于存放EMP.ename%TYPE
TYPE fj_TABLE_type IS TABLE OF EMP.ename%TYPE
INDEX BY BINARY_INTEGER;--代表下标是按整数排序的,可以为负数
fj_TABLE fj_TABLE_type;
BEGIN
SELECT ename INTO fj_TABLE(0) FROM EMP;
DBMS_OUTPUT.PUT_LINE('员工名:'||fj_TABLE(0));--下标跟上面的下标一样
END;
/
--输入部门号,显示该部门所有员工姓名和他的工资
DECLARE
--定义游标类型fj_EMP_cursor
TYPE fj_EMP_cursor IS REF CURSOR;
--定义游标变量
test_cursor fj_EMP_cursor;
--定义变量
v_ename EMP.ename%TYPE;
v_sal EMP.sal%TYPE;
BEGIN
--执行
--把test_cursor和一个SELECT结合
OPEN test_cursor FOR SELECT ename,sal FROM EMP WHERE deptno=&no;
--循环取出
LOOP
FETCH test_cursor INTO v_ename,v_sal;
--判断是否test_cursor是否为空
EXIT WHEN test_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('雇员名是:'||v_ename||',薪水'||v_sal);
END LOOP;
END;
/
--在上面的基础上,如果某个雇员的工资低于200元,就增加100元
DECLARE
--定义游标类型fj_EMP_cursor
TYPE fj_EMP_cursor IS REF CURSOR;
--定义游标变量
test_cursor fj_EMP_cursor;
--定义变量
v_ename EMP.ename%TYP |