oracle 儲存過程和函式的呼叫方法

2021-07-26 19:23:01 字數 4968 閱讀 7339

一.儲存過程(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 命令建立儲存過程和儲存函...