1、函數
函數適用於複雜的統計和計算,最終將結果返回;而存儲過程則更適合執行對數據庫的更新,尤其是大量數據的更新。存儲過程中可以實現數據庫的增、刪、改、查等操作。
CREATE OR REPLACE FUNCTION get_hello_msg
RETURN VARCHAR2 AS
BEGIN
RETURN 'Hello World';
END get_hello_msg;
SELECT get_hello_msg() AS aa FROM dual;
SELECT object_name,object_type,status FROM user_objects t WHERE t.OBJECT_NAME='GET_HELLO_MSG';
SELECT NAME,TYPE,line,text FROM user_source t WHERE t.name='GET_HELLO_MSG';
set serveroutput on
DECLARE
msg VARCHAR2(20);
BEGIN
msg := get_hello_msg();
dbms_output.put_line(msg);
END;
CREATE OR REPLACE FUNCTION TEST04.get_name_string(p_deptno NUMBER)
RETURN VARCHAR2 AS
CURSOR cu_emp IS SELECT * FROM emp WHERE deptno=TRIM(p_deptno);
v_emp_rec emp%ROWTYPE;
v_name_str VARCHAR2(500);
BEGIN
OPEN cu_emp;
LOOP
FETCH cu_emp INTO v_emp_rec;
EXIT WHEN cu_emp%NOTFOUND;
v_name_str := v_name_str||v_emp_rec.ename||',';
END LOOP;
CLOSE cu_emp;
RETURN SUBSTR(v_name_str,1,LENGTH(v_name_str)-1);
END get_name_string;
CREATE OR REPLACE FUNCTION TEST04.get_emp_string
RETURN VARCHAR2
AS
BEGIN
DECLARE CURSOR cu_emp IS SELECT ename FROM emp;
v_name VARCHAR2(20);
v_name_str VARCHAR2(500);
BEGIN
OPEN cu_emp;
FETCH cu_emp INTO v_name;
WHILE cu_emp%FOUND LOOP
v_name_str := v_name_str||v_name||',';
FETCH cu_emp INTO v_name;
END LOOP;
CLOSE cu_emp;
RETURN substr(v_name_str,1,length(v_name_str)-1);
END;
END get_emp_string;
drop function get_emp_string;
2、存儲過程
CREATE OR REPLACE PROCEDURE prc_update_emp1(p_deptno IN NUMBER)
AS
BEGIN
UPDATE emp1 SET comm=NVL(comm,0)+100
WHERE deptno=p_deptno;
COMMIT;
END;
DECLARE
p_deptno NUMBER := 10;
BEGIN
prc_update_emp1(p_deptno);
END;
drop procedure prc_update_emp1;
3、包
包頭、包體
程序包可以包含多個函數和存儲過程,從而更好的管理這些函數和存儲過程。並且,可以在程序包中定義變量,包中的所有函數和存儲過程可以共享這些變量。
create or replace package pkg_xxx as
create or replace package body pkg_xxx as