CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | OUT | IN OUT } ] Type , argment [ { IN | OUT | IN OUT } ] Type ] RETURN return_type { IS | AS } <类型.变量的说明> BEGIN FUNCTION_body EXCEPTION 其它语句 END; --注: OR REPLACE有无的区别。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
--例:获取某部门员工数和工资总和 CREATE OR REPLACE FUNCTION get_salary( Dept_no NUMBER, Emp_count OUT NUMBER) RETURN NUMBER IS V_sum NUMBER; BEGIN SELECT SUM(sal), count(*) INTO V_sum, emp_count FROM emp WHERE deptno=dept_no; --emp表中dept_no是唯一Key RETURN v_sum; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END get_salary;
--例: DECLARE Var VARCHAR2(32); BEGIN Var := demo_fun('user1', 30, sex => '男'); DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user2', age => 40, sex => '男'); DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user3', sex => '女', age => 20); DBMS_OUTPUT.PUT_LINE(var); END;
参数默认值
在CREATE OR REPLACE FUNCTION 语句中声明函数参数时可以使用DEFAULT关键字为输入参数指定默认值。
1 2 3 4 5 6 7 8 9 10 11
--定义示例: CREATE OR REPLACE FUNCTION demo_fun( Name VARCHAR2,Age INTEGER, Sex VARCHAR2 DEFAULT '男') RETURN VARCHAR2 IS V_var VARCHAR2(32); BEGIN V_var := name||':'||TO_CHAR(age)||'岁,'||sex; RETURN v_var; END;
--调用示例: DECLARE Var VARCHAR(32); BEGIN Var := demo_fun('user1', 30); DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user2', age => 40); DBMS_OUTPUT.PUT_LINE(var); Var := demo_fun('user3', sex => '女', age => 20); DBMS_OUTPUT.PUT_LINE(var); END;
存储过程
创建存储过程
语法
1 2 3 4 5 6 7 8 9 10
CREATE [OR REPLACE] PROCEDURE Procedure_name [ (argment [ { IN | OUT | IN OUT } ] Type, argment [ { IN | OUT | IN OUT } ] Type ] { IS | AS } <类型.变量的说明> BEGIN <执行部分> EXCEPTION <可选的异常错误处理程序> END;
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
--例 :删除指定员工记录 CREATE OR REPLACE PROCEDURE DelEmp (v_empno IN emp.empno%TYPE) AS No_result EXCEPTION; BEGIN DELETE FROM emp WHERE empno=v_empno; IF SQL%NOTFOUND THEN RAISE no_result; END IF; DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'的员工已被除名!'); EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END DelEmp;
--sqlplus调用示例 SQL> EXECUTE DelEmp(10); SQL> EXECUTE DelEmp(:a); SQL> variable a varchar2(20) SQL> execute :a:=fun_stu('BA'); --例:计算指定部门的工资总和,并统计其中的职工数量。 --创建存储过程 CREATE OR REPLACE PROCEDURE proc_demo (Dept_no NUMBER DEFAULT 10 , Sal_sum OUT NUMBER, Emp_count OUT NUMBER) IS BEGIN SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count FROM emp WHERE deptno=dept_no; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END proc_demo; --调用存储过程: DECLARE V_num NUMBER; V_sum NUMBER(8, 2); BEGIN Proc_demo(30, v_sum, v_num); DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人数:'||v_num); Proc_demo(sal_sum => v_sum, emp_count => v_num); DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||',人数:'||v_num); END;
--例 GRANT EXECUTE ON Proc_demo TO user| role | PUBLIC [WITH GRANT OPTION]
与过程相关的内置数据字典
名称
描述
USER_PROCEDURES
查询用户所有的子程序信息
USER_SOURCE
查看用户所有对象的源代码
USER_OBJECTS
查看用户创建的过程对象
USER_ERRORS
查看用户所有的子程序错误信息
1 2 3 4 5 6 7 8 9
SELECT object_name,authid,object_type FROM user_procedures; --AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式 --AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式
SELECT * FROM user_source WHERE name='MLDN_PROC' ;
SELECT object_name,created,timestamp,status FROM user_objects WHERE object_type='PROCEDURE' OR object_type='FUNCTION'; --status:该字段有两个取值:VALID(有效),INVALID(无效)