三、刪除儲存過程
四、pl/sql語言
五、應用經驗
六、oracle的包
儲存過程(stored procedure)是oracle資料庫中為了完成某功能的pl/sql**集,就像沒有返回值的自定義函式。
create or replace procedure 儲存過程名(引數1 模式 資料型別,..
....
)as/is
-- 定義區域性變數
變數1 資料型別;..
....
begin
-- 實現儲存過程功能的pl/sql**。
....
..exception
-- 異常處理的pl/sql**。
....
..end;
/
1)引數的模式有三種:
in:唯讀模式,在函式中,引數只能被引用/讀取,不能改變它的值。
out:只寫模式,引數只能被賦值,不能被引用/讀取。
in out:可讀可寫。
引數的模式可以不寫,預設為in,out和in out兩種模式極少使用。
2)as/is二選一,在這裡沒有區別。
3)可以不定義區域性變數。
4)可以沒有異常(exception)處理**段。
示例:1)生成測試資料,指令碼如下:
create table t_girl
( id char(4
)not null,
-- 編號
name varchar2(30
)not null,
-- 姓名
yz varchar2(20
) null,
-- 顏值
sc varchar2(20
) null,
-- 身材
weight number(4
,1)not null,
-- 體重
height number(3
)not null,
-- 身高
birthday date not null,
-- 出生時間
memo varchar2
(1000
) null -- 備註);
insert into t_girl
(id,name,yz,birthday,sc,weight,height,memo)
values
('0101'
,'西施'
,'漂亮'
,to_date
('2000-01-01 01:12:35'
,'yyyy-mm-dd hh24:mi:ss'),
'火辣'
,48.5
,170
,'這是乙個非常漂亮姑娘,老公是夫差,男朋友是范蠡。');
insert into t_girl
(id,name,yz,birthday,sc,weight,height,memo)
values
('0102'
,'貂禪'
,'漂亮'
,to_date
('1997-08-02 12:20:38'
,'yyyy-mm-dd hh24:mi:ss'),
'苗條'
,45.2
,168
,'王允真不是男人,幹不過董卓就把美人往火坑裡推,千古罪人啊。');
insert into t_girl
(id,name,yz,birthday,sc,weight,height,memo)
values
('0103'
,'妲已'
,'漂亮'
,to_date
('1998-03-03 10:50:33'
,'yyyy-mm-dd hh24:mi:ss'),
'火辣'
,53.6
,172
,'如果商真的因我而亡,您們男人做什麼去了?'
);
2)建立儲存過程girlinfo,傳入超女id引數,顯示超女的基本資訊。
create or replace procedure girlinfo
(in_id varchar2)
is s_name varchar2(30
);-- 姓名
s_yz varchar2(20
);-- 顏值
s_height number(3
);-- 身高
begin
select name,yz,height into s_name,s_yz,s_height from t_girl where id=in_id;
dbms_output.
put_line
('姓名:'
||s_name||
'顏值:'
||s_yz||
'身高:'
||s_height)
; exception
when others then
dbms_output.
put_line
('輸入的id('
||in_id||
')不正確,查詢無結果。');
1)直接執行
exec 儲存過程名(引數,……)
;execute 儲存過程名(引數,……)
;
例如:
在上面建立的儲存過程中用到了dbms_output,在sqlplus中要先執行set serveroutput on;才能輸出內容。
2)在pl/sql過程中呼叫
儲存過程是資料庫物件,oracle對它許可權管理方式與其它資料庫物件相同。
如果getinfo函式是用scott使用者建立的,其它使用者呼叫時需要加scott使用者名稱字首,並且具備相應的許可權,否則會出現「pls-00201:必須宣告識別符號 'girlinfo'
」的錯誤。
drop procedure 儲存過程名;
例如:
drop procedure girlinfo;
pl/sql是一種程式語言,叫做過程化sql語言(procedural language/sql)包括一整套的資料型別、條件結構、迴圈結構和異常處理結構,pl/sql可以執行sql語句,sql語句中也可以使用pl/sql函式。
pl/sql是oracle資料庫對sql語句的擴充套件,在普通sql語句的使用上增加了程式語言的特點,所以pl/sql把資料操作和查詢語句組織在pl/sql**的過程性單元中,通過邏輯判斷、迴圈等操作實現複雜的功能或者計算。
1)重複使用:儲存過程可以重複使用,從而可以減少資料庫開發人員的工作量。
2)儲存過程位於伺服器上,呼叫的時候只需要傳遞儲存過程的名稱以及引數就可以了,因此降低了網路傳輸的資料量。
3)引數化的儲存過程可以防止sql注入式攻擊,而且可以將grant、deny以及revoke許可權應用於儲存過程,提高了安全性。
4)儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般sql語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。
1)除錯麻煩,但是用 pl/sql developer 除錯很方便!彌補這個缺點。
2)移植問題,資料庫端**當然是與資料庫相關的。但是如果是做工程型專案,基本不存在移植問題。
3)重新編譯問題,因為後端**是執行前編譯的,如果帶有引用關係的物件發生改變時,受影響的儲存過程、包將需要重新編譯(不過也可以設定成執行時刻自動編譯)。
4)如果在乙個程式系統中大量的使用儲存過程,到程式交付使用的時候隨著使用者需求的增加會導致資料結構的變化,接著就是系統的相關問題了,最後如果使用者想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。
1)儲存過程不會有任何效能的優勢。
2)呼叫遠端儲存過程減少網路流量的說活太牽強,並且,呼叫遠端儲存過程的風險很大。
3)儲存過程不能減少開發的工作量,pl/sql也是一種開發語言,對開發者來說,要付出學習成本。
4)儲存過程的除錯、重新編譯、相容、維護等問題,任何一項都是很麻煩。
儲存過程沒有任何優點,作為乙個程式設計師,我從來不用儲存過程,大家對於這方面的知識了解即可,不必深入學習。
pl/sql為了滿足程式模組化的需要,引入了包的構造,把儲存過程、函式組合起來就成了包,通過使用包就可以分類管理儲存過程和函式。有點類似c++中的命名空間。儲存過程的應用場景已經很少,包就更少了。
Oracle儲存過程呼叫儲存過程
oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...
ORACLE儲存過程
自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...
Oracle 儲存過程
create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...