一.儲存過程(procedure)
使用過程, 不僅可以簡化客戶端應用程式的開發和維護,而且可以提高應用程式的執行效能.
create [or replace] procudure procedure_name
(arg1 [model1] datatype1, arg2[model2] datatype2)
is [as]
pl/sql block;
arg1,arg2用於指定過程的引數,is/as用於開始乙個pl/sql塊.當指定引數資料型別時,不能指定其長度.
在建立過程的時間,既可以指定輸入引數(in),也可以指定輸出引數(out)以及輸入輸出引數(in out).如果不定義引數模式,則預設為輸入引數,如果要定義輸出引數,則需要指定out關鍵字,如果定義輸入輸出引數,
要指定in out關鍵字.
一般使用execute(或exec) 過程名 或者 call 過程名來呼叫過程.
set serveroutput on開啟
oracle
的輸出.
(1)不帶引數的過程
create or replace procedure out_time
isbegin
dbms_output.put_line(systimestamp);
end;
call out_time();或者 exec out_time;
(2)帶in引數的過程
如果不指定引數模式,則預設的為in,也可以顯示的指定輸入模式in.
create or replace procedure add_employee
(eno number,name varchar2,sal number,job varchar2 default 'ccc', dno number)
isbegin
insert into emp(empno, ename,sal,job,deptno)
values(eno,ename,sal,job,dno);
exception
when dup_val_on_index then
end;
除了預設值的引數外,其餘的都要輸入.
(3)帶out的過程
在過程中輸出結果是使用out或者in out來完成的.
定義輸出引數的時間,必須要使用out來定義輸出.
create or replace procedure query_employee
(eno number,name out varchar2,sal out number)
isbegin
select ename, sal into name, sal from emp where empno=eno;
exception
when no_data_found then
end;
對於指定為out型別的引數,必須定義變數接收輸出引數的資料.呼叫例項:
sql> var name varchar2(10)
sql> var sal number
sql> exec query_employee(77,:name,:sal)
sql> print name sal
(4)帶in和out的過程
在呼叫前要通過變數給引數傳遞資料,在呼叫結束後,會通過此變數將值傳遞給應用程式
create or procedure compute
(num in out number, num2 in out number)
is v1 number;
v2 number;
begin
v1:=num1/num2;
v2:=mod(num1, num2);
num1 := v1;
num2 := v2;
end;
在應用程式呼叫in out的儲存過程時,必須提供兩個變數臨時存放數值,執行如下:
sql> var n1 number
sql> var n2 number
sql> exec :n1:=100
sql> exec :n2:=30
sql> exec compute(:n1, :n2)
sql> print n1 n2
(5)為引數傳遞變數和資料
[1]位置傳遞
如 sql> exec add_dept(50, 'sales', 'new york')
[2]名稱傳遞,使用=>符號來指定值
如 sql> exec add_dept(dno=>50)
[3]組合傳遞,以上兩種傳遞方法交替
(6)檢視過程的源**
過程名,源**,執行**放到了資料字典中,通過查詢資料字典user_source,可以顯示當前使用者定義的過程
select text from user_source where name='add_dept';
(7)刪除過程
drop procedure 過程名
二.函式(function)
create [or replace] function function_name
(arg1 [model1] datatype1,arg2 [model2] datatype2)
return datatype
is|as
pl/sql block;
arg1,arg2指定函式的引數,當不指定引數資料型別時,不能指定其長度
return 指定函式返回的資料型別.注意,函式前面必須要有return子句.在函式體內至少含有一條return子句.函式的引數model和過程的一樣
(1)不帶引數的函式
create or replace function get_user
return varchar2
isv_user varchar2(100);
begin
select username into v_user from user_users;
return v_user;
end;
呼叫方法
sql> var v1 varchar2(100)
sql> exec :v1:=get_user
sql> print v1
(2)帶in引數
create or replace function get_sal(name in varchar2)
return number
isv_sal emp.sal%type;
begin
select sal into v_sal from emp
where upper(ename)=upper(name);
return v_sal;
exception
when no_data_found then
end;
呼叫方法如下:
sql> var sal number
sql> exec :sal:=get_sal('scott')
sql> print sal
(3)帶out引數
一般情況下,函式只需要單個返回資料,如果希望使用函式同事返回多個資料,就需要用到輸出引數了.
create or replacr function get_info
(name varchar2, title out varchar2)
return varchar2
asdeptname dept.dname%type;
begin
select a.job,b.dname into title, deptname
from emp a, dept b
where a.deptno = b.deptno
and upper(a.ename) = upper(a.ename)
return deptname;
exception
when no_data_found then
end;
由於此函式帶有out引數,所以要定義變數接收out引數和函式的返回值
sql> var job varchar2(20)
sql> var dname varchar2920)
sql> exec :dname:=getinfo('scott',:job)
sql> print dname job
(4)帶in out引數
在呼叫函式之前需要通過變數給該種引數傳遞資料
create or replace function result
(num1 number, num2 in out number)
return number
asv_result number(6);
v_remain number;
begin
v_result:=num1/num2;
v_remain:=mod(num1, num2);
num2 := v_remain;
return v_result;
exception
when zero_divide then
end;
執行如下:
sql> var result1 number
sql> var result2 number
sql> exec :result2:=30
sql> exec :result1:=result(100, :result2)
sql> print result1 result2
(5)函式的刪除
drop function 函式名
三.子程式的管理
列出當前使用者的子程式
資料字典檢視user_objects顯示當前使用者所包含的所有物件.可以列出使用者的表,檢視,索引,也可以列出使用者的過程,函式等.
select object_name, created, status from user_object2 where object_type in ('procedure', 'function');
JDBC MYSQL 儲存函式和儲存過程的呼叫
最近要學習資料庫,在用jdbc呼叫儲存過程和儲存函式是出現了小麻煩。在mysql中,用jdbc呼叫儲存過程和儲存函式還是有一些不同的。一,用jdbc呼叫儲存過程一般過程如下 string sql call proc callablestatement cstmt con.preparecall sq...
Oracle儲存過程和儲存函式
參看 oracle儲存過程 儲存函式 說明 儲存過程 儲存函式都是物件。包括表 檢視 索引 序列 同義詞等也是物件。概念 指儲存在資料庫中供所有使用者程式呼叫的子程式叫儲存 過程 儲存函式。特點 完成特定功能的程式。區別 儲存函式可以通過return子句返回乙個值。建立和使用儲存過程 用create...
ORACLE的儲存過程和函式
儲存過程 儲存函式 指儲存在資料庫中供所有使用者程式呼叫的子程式 儲存過程和儲存函式的相同點 完成特定功能的程式 儲存過程和儲存函式的區別 是否用return語句返回值 儲存函式用return語句返回值,而儲存過程不能 建立和使用儲存過程 用create procedure 命令建立儲存過程和儲存函...