--######################################--
/*
(1)DETERMINISTIC字句:用于保证函数对于任何输入总是以相同的方式工作,这一类型的保证要求函数不从外数据源(如包或者数据库)
读或者写数据。只有确定性函数(DETERMINISTIC function)工作在物化视图和基于函数的索引中。对于用于SQL语句字句(如WHERE、
ORDER BY或GROUP BY)中的用户定义的函数,或者SQL对象类型方法(MAP或ORDER)来说,他们是被推荐的方法。
确定性函数通常用完全相同的方式处理参数。这意味着不管你提交什么值,函数都以相同的方式工作,不应对包变量或来自数据库的数据有内部依赖性*/
--Demo1:计算投资的现值:
CREATE OR REPLACE FUNCTION pv
( future_value NUMBER
, periods NUMBER
, interest NUMBER )
RETURN NUMBER DETERMINISTIC
IS
BEGIN
RETURN future_value/((1+interest)**periods);
END pv;
--SQL Command->编译->执行:
var res NUMBER
call pv(10000,5,6) into :res;
--结果:
Method called
res
---------
0.594990182661986
--Demo3:
CREATE OR REPLACE FUNCTION get_user
RETURN VARCHAR2
IS
v_user VARCHAR2 (20);
BEGIN
SELECT a.username
INTO v_user
FROM user_users a
WHERE ROWNUM < 2;
RETURN v_user;
END get_user;
--######################
--调用函数时有形参的时候要括号,没有形参的时候不要括号
--函数用于返回特定数据。执行时的找一个变量接收函数的返回值
--调用方法1:SQL窗口
SELECT get_user FROM dual;
--调用方法2:命令窗口
var v_name varchar2(50)
exec :v_name := get_user;
--调用方法3:SQL窗口
exec dbms_output.put_line('The user is:'||get_user);
--Demo4:
CREATE OR REPLACE FUNCTION pv(v_id IN NUMBER)
RETURN VARCHAR2
AS
v_name VARCHAR2 (50);
BEGIN
SELECT a.ename INTO v_name
FROM scott.emp a
WHERE a.empno = v_id;
RETURN v_name;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20001, ' ID is wrong');
END pv;
--调用方法1:SQL窗口
SELECT pv(7536) FROM dual;
--调用方法2:命令窗口
exec dbms_output.put_line(pv(7536));
--Demo5:
CREATE OR REPLACE FUNCTION get_info
( e_name VARCHAR2
, job OUT VARCHAR2 )
RETURN NUMBER
IS
res NUMBER;
BEGIN
SELECT a.sal
, a.job
INTO res
, job
FROM scott.emp a
WHERE a.ename = e_name;
RETURN (res);
END get_info;
--SQL Command窗口->编译->执行:
var job varchar2(20)
var dname varchar2(20)
exec :dname := get_info('SCOTT',:job)
--Demo6:
CREATE OR REPLACE FUNCTION demo
( num1 NUMBER
, num2 IN OUT NUMBER )
RETURN NUMBER
IS
v_result NUMBER (6);
v_remainder NUMBER;
BEGIN
v_result := num1 / num2;
v_remainder := MOD (num1 , num2);
num2 := v_remainder;
RETURN (v_result);
EXCEPTION
WHEN zero_divide THEN
raise_application_error (-20000 , 'you have made one 0' );
END demo;
--SQL Command->编译->执行:
var result1 NUMBER;
var result2 NUMBER;
exec :result2 :=30
--执行结果:
PL/SQL procedure successfully completed
result2
---------
30
--继续->执行:
SQL> EXEC :result1 := demo (100 , :result2);
--执行结果:
PL/SQL procedure successfully completed
result1
---------
3
result2
---------
10