函数创建:
CREATE [OR REPLACE] FUNCTION [schema.] function_name [parameter_list] {AS | IS} declaration_section BEGIN executable_section EXCEPTION exceptioon_section END [function_name];
创建一个函数:
1 CREATE OR REPLACE FUNCTION f1(par1 IN NUMBER DEFAULT 500) 2 RETURN NUMBER 3 IS 4 V1 NUMBER; 5 BEGIN 6 SELECT 1 INTO V1 FROM DUAL; 7 RETURN(V1); 8 END;
函数的调用:
可以在SQL语句中调用:SELECT f1(2) FROM dual;
可以在表达式中调用函数:IF f1(1)+7>10 THEN ..
函数的编译
alter function f1 COMPIL;
--1.用函数返回一个结果集--
1 CREATE OR REPLACE FUNCTION fun_getresult 2 RETURN pack_return_result.type_cursor IS 3 p pack_return_result.type_cursor; 4 BEGIN 5 OPEN p FOR 6 SELECT name,producer,price FROM phone_info 7 WHERE price > 900; 8 RETURN(p); 9 END; 10 SQL> var var_bind_ref REFCURSOR; 11 SQL> execute :var_bind_ref := fun_getresult(); 12 13 PL/SQL 过程已成功完成。 14 15 已用时间: 00: 00: 00.00 16 SQL> PRINT var_bind_ref; 17 18 NAME PRODUCER PRICE 19 -------------------- ------------------------------ ---------- 20 iphone APPLE 3999 21 C510c 爱立信 1000 22 23 已选择2行。
--2.在函数中执行DDL--
1 CREATE OR REPLACE FUNCTION f2(tablename IN VARCHAR2) 2 RETURN NUMBER 3 IS 4 PRAGMA AUTONOMOUS_TRANSACTION;--自治事务, 5 V1 NUMBER; 6 BEGIN 7 EXECUTE IMMEDIATE 'CREATE TABLE '|| tablename ||'(name VARCHAR2(20))'; 8 RETURN(V1); 9 END;
--运行f2(),创建一个新的table bb。
DECLARE
v_r NUMBER;
BEGIN
v_r :=f2('bb');
END;
(自治事务机制允许用户在事务中建立一个新的事务,也就是事务中嵌套一个新事务
把这个新事务叫做自治事务,把原来的事务叫主事务,或父事务。自治事务的提交和回滚
不会影响到父事务的状态。自治事务由主事务调用,但是独立于主事务,在自治事务被调
用执行的时候,主事务被挂起,在自治事务内部,可以执行一系列的DML语句,并且可以提交
或回滚,使用PRAGMA AUTONOMOUS_TRANSACTION指定自治事务。)
--3在函数中执行DML---
1 CREATE OR REPLACE FUNCTION f_phone RETURN VARCHAR2 IS 2 BEGIN 3 INSERT INTO phone_info VALUES('iphone5c','apple',2890);--插入数据 4 COMMIT; 5 RETURN 'ok'; 6 END; 7 --在块中调用函数f_phone:--- 8 DECLARE 9 v_r VARCHAR2(100); 10 BEGIN 11 v_r :=f_phone; 12 dbms_output.put_line(v_r); 13 END;
各种常用函数 略。