1-- 19-1:建立无参数的函数 2CREATE OR REPLACE FUNCTION cur_datetime 3RETURN VARCHAR2 4IS 5BEGIN 6RETURN TO_CHAR(sysdate, 7'YYYY"年"MM"月"DD"日"HH24″时"MI"分"SS"秒"'); 8END; 9/ 10-- 19-2:建立带有输入参数的函数 11CREATE OR REPLACE FUNCTION get_sal(name VARCHAR2) 12RETURN NUMBER 13AS 14v_sal emp.sal%TYPE; 15BEGIN 16SELECT sal INTO v_sal FROM emp WHERE upper(ename)=upper(name); 17RETURN v_sal; 18END; 19/ 20-- 19-3:建立带有输出参数的函数 21CREATE OR REPLACE FUNCTION get_info 22(eno NUMBER,title OUT VARCHAR2) RETURN VARCHAR2 23AS 24name emp.ename%TYPE; 25BEGIN 26SELECT ename,job INTO name,title FROM emp 27WHERE empno=eno; 28RETURN name; 29END; 30/ 31-- 19-4:建立带有输入输出参数的函数 32CREATE OR REPLACE FUNCTION get_upd_info 33(eno NUMBER,sal_chg IN OUT NUMBER) RETURN VARCHAR2 34AS 35name emp.ename%TYPE; 36BEGIN 37UPDATE emp SET sal=sal+sal_chg WHERE empno=eno 38RETURNING ename,sal INTO name,sal_chg; 39RETURN name; 40END; 41/ 42 43-- 19-5:建立结果缓存函数 44CREATE OR REPLACE FUNCTION get_name(no VARCHAR2) 45RETURN NUMBER RESULT_CACHE RELIES_ON(emp) 46AS 47v_name emp.ename%TYPE; 48BEGIN 49SELECT ename INTO v_name FROM emp WHERE empno=no; 50RETURN v_name; 51END; 52/ 53 54-- 19-6:调用无参数的函数 55BEGIN 56dbms_output.put_line(cur_datetime); 57END; 58/ 59-- 19-7:调用带有输入参数的函数 60BEGIN 61dbms_output.put_line('工资:'||get_sal('&name')); 62END; 63/ 64-- 19-8:调用带有输出参数的函数 65DECLARE 66v_name emp.ename%TYPE; 67v_job emp.job%TYPE; 68BEGIN 69v_name:=get_info(&eno,v_job); 70dbms_output.put_line('姓名:'||v_name||',岗位:'||v_job); 71END; 72/ 73-- 19-9:调用带有输入输出参数的函数 74DECLARE 75v_empno emp.empno%TYPE; 76v_name emp.ename%TYPE; 77v_salchg emp.sal%TYPE; 78BEGIN 79v_empno:=&eno; 80v_salchg:=&incre; 81v_name:=get_upd_info(v_empno,v_salchg); 82dbms_output.put_line('姓名:'||v_name||',新工资:'||v_salchg); 83END; 84/ 85-- 19-10:使用位置传递为参数传递变量和数据 86SELECT get_sal('&name') 工资 FROM dual; 87-- 19-11:使用名称传递为参数传递变量和数据 88VAR salary NUMBER 89EXEC :salary:=get_sal(name=>'&name') 90-- 19-12:使用组合传递为参数传递变量和数据 91VAR name VARCHAR2(10) 92VAR sal_chg NUMBER 93EXEC :sal_chg:=200 94EXEC :name:=get_upd_info(&eno,:sal_chg) 95PRINT name sal_chg 96-- 19-13:在sql语句中调用pl/sql函数 97SELECT get_sal(name=>'scott') salary FROM dual; 98-- 19-14:使用异常处理 99CREATE OR REPLACE FUNCTION get_sal(name VARCHAR2) 100RETURN NUMBER 101AS 102v_sal emp.sal%TYPE; 103BEGIN 104SELECT sal INTO v_sal FROM emp 105WHERE upper(ename)=upper(name); 106RETURN v_sal; 107EXCEPTION 108WHEN NO_DATA_FOUND THEN 109RAISE_APPLICATION_ERROR(-20000,'该雇员不存在'); 110END; 111/ 112-- 19-15:使用纪录类型作为返回类型 113CREATE OR REPLACE FUNCTION get_info 114(eno NUMBER) RETURN emp%ROWTYPE 115IS 116emp_record emp%ROWTYPE; 117BEGIN 118SELECT * INTO emp_record FROM emp WHERE empno=eno; 119RETURN emp_record; 120EXCEPTION 121WHEN NO_DATA_FOUND THEN 122RAISE_APPLICATION_ERROR(-20000,'该雇员不存在'); 123END; 124/ 125DECLARE 126emp_record emp%ROWTYPE; 127BEGIN 128emp_record:=get_info(&eno); 129dbms_output.put_line('姓名:'||emp_record.ename||',部门号:'||emp_record.deptno); 130END; 131/ 132-- 19-16:使用集合类型作为返回类型 133CREATE OR REPLACE TYPE ename_table_type IS TABLE OF VARCHAR2(10); 134/ 135CREATE OR REPLACE FUNCTION get_name 136(dno NUMBER) RETURN ename_table_type IS 137ename_table ename_table_type; 138BEGIN 139SELECT ename BULK COLLECT INTO ename_table FROM emp WHERE deptno=dno; 140RETURN ename_table; 141EXCEPTION 142WHEN NO_DATA_FOUND THEN 143RAISE_APPLICATION_ERROR(-20099,'该部门不存在'); 144END; 145/ 146DECLARE 147ename_table ename_table_type; 148BEGIN 149ename_table:=get_name(&dno); 150FOR i IN 1..ename_table.COUNT LOOP 151dbms_output.put_line('姓名:'||ename_table(i)); 152END LOOP; 153END; 154/ 155-- 19-17:删除函数 156DROP FUNCTION get_name; 157-- 19-18:显示编译错误 158SHOW ERRORS 159-- 19-19:确定函数状态 160SELECT object_name FROM user_objects WHERE status='INVALID' AND object_type='FUNCTION'; 161-- 19-20:编译函数 162ALTER FUNCTION get_info COMPILE; 163-- 19-21:查看函数代码 164SELECT text FROM user_source WHERE name='GET_INFO';
Oracle中自定义函数 无参数 输入参数 输出参数等各种用法
Wesley13
2021-10-11
1372 0 0
点赞
收藏
评论区
加载中...