oracle存儲過程函數
⑴ oracle中function和procere是什麼意思
oracle中function是函數,而procere是存儲過程。
函數:
函數用於返回特定數據。執行時得找一個變數接收函數的返回值。
語法如下:
create or replace function function_name
(
argu1 [mode1] datatype1,
argu2 [mode2] datatype2, ........
)
return datatype
is
begin
end;存儲過程:
存儲過程(Stored
Procere)是在大型資料庫系統中,一組為了完成特定功能的sql
語句集,存儲在資料庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。
語法如下:
CREATE OR REPLACE PROCEDURE 存儲過程名
IS
BEGIN
NULL;
END;
⑵ oracle中函數和存儲過程的區別和聯系
在oracle中,函數和存儲過程是經常使用到的,他們的語法中有很多相似的地方,但也有自己的特點。剛學完函數和存儲過程,下面來和大家分享一下自己總結的關於函數和存儲過程的區別。
一、存儲過程
1.定義
存儲過程是存儲在資料庫中提供所有用戶程序調用的子程序,定義存儲過程的關鍵字為procere。
2.創建存儲過程
create [or replace] procere 存儲過程名
[(參數1 類型,參數2 out 類型……)]
as
變數名類型;
begin
程序代碼體
end;
示例一:無參無返
create or replace procere p1
--or replace代表創建該存儲過程時,若存儲名存在,則替換原存儲過程,重新創建
--無參數列表時,不需要寫()
as
begin
dbms_output.put_line('hello world');
end;
--執行存儲過程方式1
set serveroutput on;
begin
p1();
end;
--執行存儲過程方式2
set serveroutput on;
execute p1();
示例二:有參有返
create or replace procere p2
(name in varchar2,age int,msg out varchar2)
--參數列表中,聲明變數類型時切記不能寫大小,只寫類型名即可,例如參數列表中的name變數的聲明
--參數列表中,輸入參數用in表示,輸出參數用out表示,不寫時默認為輸入參數。
------------輸入參數不能攜帶值出去,輸出參數不能攜帶值進來,當既想攜帶值進來,又想攜帶值出去,可以用in out
as
begin
msg:='姓名'||name||',年齡'||age;
--賦值時除了可以使用:=,還可以用into來實現
--上面子句等價於select '姓名'||name||',年齡'||age into msg from al;
end;
--執行存儲過程
set serveroutput on;
declare
msg varchar2(100);
begin
p2('張三',23,msg);
dbms_output.put_line(msg);
end;
示例三:參數列表中有in out參數
create or replace procere p3
(msg in out varchar2)
--當既想攜帶值進來,又想攜帶值出去,可以用in out
as
begin
dbms_output.put_line(msg); --輸出的為攜帶進來的值
msg:='我是從存儲過程中攜帶出來的值';
end;
--執行存儲過程
set serveroutput on;
declare
msg varchar2(100):='我是從攜帶進去的值';
begin
p3(msg);
dbms_output.put_line(msg);
end;
示例四:存儲過程中定義參數
create or replace procere p4
as
--存儲過程中定義的參數列表
name varchar(50);
begin
name := 'hello world';
dbms_output.put_line(name);
end;
---執行存儲過程
set serveroutput on;
execute p4();
總結:1.創建存儲過程的關鍵字為procere。
2.傳參列表中的參數可以用in,out,in out修飾,參數類型一定不能寫大小。列表中可以有多個輸入輸出參數。
3.存儲過程中定義的參數列表不需要用declare聲明,聲明參數類型時需要寫大小的一定要帶上大小。
4.as可以用is替換。
5.調用帶輸出參數的過程必須要聲明變數來接收輸出參數值。
6.執行存儲過程有兩種方式,一種是使用execute,另一種是用begin和end包住。
存儲過程雖然有很多優點,但是它卻不能使用return返回值。當需要使用return返回值時,我們可以使用函數。
二、存儲函數
1.函數與存儲過程的結構類似,但是函數必須有一個return子句,用於返回函數值。
create or replace function f1
return varchar--必須有返回值,且聲明返回值類型時不需要加大小
as
msg varchar(50);
begin
msg := 'hello world';
return msg;
end;
--執行函數方式1
select f1() from al;
--執行函數方式2
set serveroutput on;
begin
dbms_output.put_line(f1());
end;
三、存儲過程與存儲函數的區別和聯系
相同點:1.創建語法結構相似,都可以攜帶多個傳入參數和傳出參數。
2.都是一次編譯,多次執行。
不同點:1.存儲過程定義關鍵字用procere,函數定義用function。
2.存儲過程中不能用return返回值,但函數中可以,而且函數中必須有return子句。
3.執行方式略有不同,存儲過程的執行方式有兩種(1.使用execute2.使用begin和end),函數除了存儲過程的兩種方式外,還可以當做表達式使用,例如放在select中(select f1() form al;)。
總結:如果只有一個返回值,用存儲函數,否則,一般用存儲過程。
⑶ oracle 怎麼執行存儲過程跟函數
調用oracle存儲過程用begin...end的方式。
基本語法:
begin 存儲過程名(參數1,參數2……);--如果無參數則省略括弧及括弧內部分end;
如,有存儲過程:
create or replace procere p_testasv_begintime varchar2(20);v_endtime varchar2(20);v_str varchar2(10);begin v_begintime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'); select 'badkano' into v_str from al; v_endtime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'); dbms_output.put_line('開始時間為:'||v_begintime); dbms_output.put_line('結束時間為:'||v_endtime);end;
執行:begin p_test;end;
⑷ Oracle 存儲過程和函數的區別
Oracle中函數和存儲過程僅體現在一個地方:
函數有返回值,而存儲過程沒有返回值(當然,兩者都可以通過定義out參數來實現返回值)
其實,Oracle函數和存儲過程差別很小,對比其他資料庫,比如SqlServer:
sqlserver中,函數是不能存在非select的dml語句的,換句話說,函數中,sqlserver是不能出現update、delete、insert等語句的
而Oracle中,是十分自由和寬容的,update、delete、insert等語句都可以出現
但因為Oracle的自由度,會引起其它一些問題:如果使用C#來調用Oracle的函數時,會出現因函數含有update等語句而無法調用,只能換成存儲過程或者在函數外再加一層存儲過程來實現調用。
⑸ Oracle中 存儲過程,過程和函數有什麼區別和聯系
過程:函數和存儲過程的統稱。
函數:有且僅有一個返回值,可以用於SQL語句中。 如:x := get_X(),select get_X() from al,返回值為函數調用的結果。
存儲過程:無返回值。要返回結果,必須聲明為out參數。
如:sp_x(x,y,z),x和y為in類型參數,z為out/in out類型參數。
在oracle中,封裝工具還有自定義類型、包等。包可以封裝過程和函數,包頭類似JAVA中的介面,包體類似JAVA中實現介面的類。
⑹ oracle procere存儲過程
OR REPLACE PROCEDURE 存儲過程名字( 參數1 IN NUMBER, 參數2 IN NUMBER ) IS/AS變數1 INTEGER :=0;變數2 DATE;BEGIN.END 存儲過程名字2、SELECT INTO STATEMENT
將select查詢的結果存入到變數中,可以同時將多個列(欄位)存儲到多個變數中,必須有一條記錄,否則拋出異常(如果沒有記錄,拋出NO_DATA_FOUND)
例子:
BEGIN SELECT col1,col2 into 變數1,變數2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; RAISE; END;3、IF判斷
IF 條件1 THEN Do Someting ELSIF 條件2 THEN Do Someting ELSIF 條件3 THEN Do Someting ELSE Do SometingEND IF;4、while循環
WHILE V_TEST=1 LOOP BEGIN XXXX END; END LOOP; 5、變數賦值
V_TEST := 123; 6、用for in使用cursor(游標)
. IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP; END; 7、用pl/sql developer debug
連接資料庫後建立一個Test Window
在窗口輸入調用SP的代碼,F9開始Debug,CTRL+N單步調試
注意事項:
1)存儲過程參數不帶取值范圍,in表示傳入,out表示輸出;
2)變數可帶取值范圍,後面接分號;
3)在判斷語句前最好先用count(*)函數判斷是否存在該條操作記錄
4)用select.into.給變數賦值
5)在代碼中拋出異常用RAISE;通常的用法:
EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;/*異常分很多類,如NO_DATA_FOUND。OTHERS處本應該寫異常名稱,如果不想把異常分得那麼細,可以籠統一點用OTHERS來捕獲,即所有異常均用OTHERS來捕獲。WHEN OTHERS THEN 表示是其它異常。RAISE表示拋出異常,讓User可以看到。*/
6)AS/IS的區別
在試圖(VIEW)中只能用AS不能用IS
在游標(CURSOR)中只能用IS不能用AS
7)輸出變數賦值有兩種,一種是直接:=,還有一種就是SELECT INTO
8)顯示調試信息
a.存儲過程中在必要的位置添加
DBMS_OUTPUT.put_line(『HI『);
b.打開DBMS_OUTPUT
show serveroutput;set serveroutput on;
9)刪除PROCEDURE
DROP PROCEDURE procere_name;
oracle procere存儲過程