1. 程式人生 > >oracle 函數的用法(三)

oracle 函數的用法(三)

order 全局 接收 報錯 sysdate times 變量 pda was

-- 函數

1.oracle自帶的標準函數 to_date,to_number
2.自定義函數

-- 自定義函數語法

1 CREATE OR REPLACE FUNCTION FUNCTION_name
2 [ (PARAMETERS [MODEL] datatype ... ) ]
3 RETURN datatype IS|AS
4 [local_variable_declarations ; ...]
5 BEGIN
6 -- action;
7 RETURN expression;
8 END [function_name];

-- 建立第一個函數 獲取給定員工id的薪水

 1 CREATE
OR REPLACE FUNCTION get_sal 2 ( 3 ID employees.employee_id%Type 4 ) 5 RETURN NUMBER IS 6 sal employees.salary%TYPE := 0; 7 BEGIN 8 SELECT salary INTO sal FROM employees WHERE employee_id = ID; 9 RETURN sal; 10 END get_sal;

-- 執行方式

 1 -- 全局變量的方式執行
 2 VARIABLE salary NUMBER
 3 EXECUTE :salary :=
get_sal(100); 4 -- 本地塊的方式執行 5 DECLARE sal employees.salary%TYPE; 6 BEGIN 7 sal := get_sal(100); 8 END; 9 --命令行執行 10 execute dbms_output.put_line(get_sal(100)); 11 -- SQL語句執行 12 SELECT get_sal(100) FROM dual;

-- 函數在SQL語句中的使用 類似於avg count 等函數

1 CREATE OR REPLACE FUNCTION tax(VALUE IN NUMBER)
2 RETURN
NUMBER IS 3 BEGIN 4 RETURN (VALUE * 0.08); 5 END; 6 7 SELECT tax(100) FROM dual;

函數的限制 : 只接收in 類型的參數

-- 函數會犯的錯誤

 1 CREATE OR REPLACE FUNCTION dml_call_sql
 2 (
 3 sal NUMBER
 4 )
 5 RETURN NUMBER IS
 6 BEGIN
 7 INSERT INTO employees
 8 (employee_id,last_name,email,hire_date,job_id,salary)
 9 VALUES
10 (1,forst,[email protected],SYSDATE,sa_man,sal);
11 RETURN (sal + 100);
12 END;
13 
14 UPDATE employees SET salary = dml_call_sql(2000) WHERE employee_id = 170;

報錯 : update,insert中不能調用 有insert 的函數

-- 刪除一個函數

1 drop function function_name

-- function 的數據字典

1 SELECT text FROM user_source WHERE TYPE=FUNCTION ORDER BY line; -- 顯示函數內容

2 SELECT object_name FROM user_objects WHERE object_type=FUNCTION; -- 顯示函數

-- user_objects對象的結構

 1 SQL> desc user_objects;
 2 Name           Type          Nullable Default Comments                                                                     
 3 -------------- ------------- -------- ------- ---------------------------------------------------------------------------- 
 4 OBJECT_NAME    VARCHAR2(128) Y                Name of the object                                                           
 5 SUBOBJECT_NAME VARCHAR2(30)  Y                Name of the sub-object (for example, partititon)                             
 6 OBJECT_ID      NUMBER        Y                Object number of the object                                                  
 7 DATA_OBJECT_ID NUMBER        Y                Object number of the segment which contains the object                       
 8 OBJECT_TYPE    VARCHAR2(19)  Y                Type of the object      -- 類型 function, procedure  等                                                   
 9 CREATED        DATE          Y                Timestamp for the creation of the object                                     
10 LAST_DDL_TIME  DATE          Y                Timestamp for the last DDL change (including GRANT and REVOKE) to the object 
11 TIMESTAMP      VARCHAR2(19)  Y                Timestamp for the specification of the object                                
12 STATUS         VARCHAR2(7)   Y                Status of the object    -- 無效狀態的在數據庫巡檢時抓出來 重新編譯                                                      
13 TEMPORARY      VARCHAR2(1)   Y                Can the current session only see data that it place in this object itself?   
14 GENERATED      VARCHAR2(1)   Y                Was the name of this object system generated?                                
15 SECONDARY      VARCHAR2(1)   Y                Is this a secondary object created as part of icreate for domain indexes?    
16 NAMESPACE      NUMBER        Y                Namespace for the object                                                     
17 EDITION_NAME   VARCHAR2(30)  Y                Name of the edition in which the object is actual                            

-- 無效對象重新編譯腳本 【擴展知識】

D:\oracle11g\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN

utlrp.sql腳本文件

函數和存儲過程的異同

技術分享

oracle 函數的用法(三)