真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

oracle如何搭建存儲,oracle 建立存儲過程

ORACLE如何創(chuàng)建存儲過程,詳細(xì)例子。

--創(chuàng)建存儲過程 IN_SHEETID 為輸入?yún)?shù)CREATE OR REPLACE a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"PROCEDURE/a ST_RECEIPT(IN_SHEETID VARCHAR2) ISBEGIN--將 receipt0表中數(shù)據(jù)插入 receiptINSERT INTO RECEIPTSELECT * FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;--更新receipt表中Flag值UPDATE RECEIPT SET FLAG = 100 WHERE SHEETID = IN_SHEETID;--INSERT INTO RECEIPTITEMSELECT * FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--刪除ReceiptItem0表數(shù)據(jù)DELETE FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--刪除 receipt0表數(shù)據(jù)DELETE FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"END/a;--調(diào)用存儲過程BEGINST_RECEIPT('ys141128');a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"END/a;--或者EXEC ST_RECEIPT('ys141128');

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了南充免費(fèi)建站歡迎大家使用!

oracle存儲過程基本語法

一:存儲過程

創(chuàng)建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限? ?

刪除存儲過程,是過程的創(chuàng)建者或者擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限?

修改存儲過程,則只能是過程的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人

執(zhí)行(或調(diào)用)存儲過程,是過程的創(chuàng)建者或是擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人或是被擁有者授予EXECUTE權(quán)限的人

1:語法

1)創(chuàng)建

CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數(shù)[IN|OUT|INOUT] 數(shù)據(jù)類型...)]

{AS|IS}

[說明部分]

BEGIN

可執(zhí)行部分

[EXCEPTION

錯(cuò)誤處理部分]

END[過程名];

說明:

OR REPLACE?表示如果存在就覆蓋存儲過程

參數(shù)有三種形式:IN、OUT和IN OUT。則默認(rèn)為IN。

關(guān)鍵字AS也可以寫成IS,后跟過程的說明部分,可以在此定義過程的局部變量。

2)刪除存儲過程:

DROP PROCEDURE 存儲過程名;

3)修改存儲過程:

? ALTER PROCEDURE 存儲過程名 COMPILE;?

4)執(zhí)行存儲過程

??EXECUTE 模式名.存儲過程名[(參數(shù)...)];?

?或

? ?BEGIN?

模式名.存儲過程名[(參數(shù)...)];

END;

另外:參數(shù)可以是變量、常量或表達(dá)式

要其它用戶執(zhí)行存儲過程須要給其它用戶授權(quán)

GRANT EXECUTE ON 存儲過程名 TO 用戶名

2:參數(shù)說明

IN 定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲過程

OUT 定義一個(gè)輸出參數(shù)變量,用于從存儲過程獲取數(shù)據(jù)

IN OUT 定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能

1)參數(shù)名 IN 數(shù)據(jù)類型 DEFAULT 值;

? ? ??定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲過程。

? ? ??可以是常量、有值變量或表達(dá)式

? ? ??DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。如果在調(diào)用存儲過程時(shí)不指明參數(shù),則參數(shù)變量取默認(rèn)值

? ? ??在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進(jìn)行賦值。

2)參數(shù)名 OUT 數(shù)據(jù)類型;

? ? ??定義一個(gè)輸出參數(shù)變量,用于從存儲過程獲取數(shù)據(jù),即變量從存儲過程中返回值給主程序。

? ? ? 在調(diào)用存儲過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。

? ? ??在存儲過程中,參數(shù)變量只能被賦值而不能將其用于賦值,而且必須給輸出變量至少賦值一次。

3)參數(shù)名 IN OUT 數(shù)據(jù)類型 DEFAULT 值;?

? ? ??定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能。

? ? ??在調(diào)用存儲過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。

? ? ??DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。

? ? ??在存儲過程中,變量接收主程序傳遞的值,同時(shí)可以參加賦值運(yùn)算,也可以對其進(jìn)行賦值。在存儲過程中必須給變量至少賦值一次。

補(bǔ)充:如果省略IN、OUT或IN OUT,則默認(rèn)模式是IN。?

? ? ? 調(diào)用它時(shí)參數(shù)個(gè)數(shù)與位置可以不一致,用以下形式調(diào)用:

EXECUTE CHANGE_SALARY(P_RAISE=80,P_EMPNO=7788); ?//=運(yùn)算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達(dá)式

二:函數(shù)

創(chuàng)建函數(shù),需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統(tǒng)權(quán)限

刪除函數(shù),需要是函數(shù)的創(chuàng)建者或者是擁有DROP ANY PROCEDURE系統(tǒng)權(quán)限的人

修改函數(shù),需要是函數(shù)的創(chuàng)建者或者擁有ALTER ANY PROCEDURE系統(tǒng)權(quán)限的人

執(zhí)行函數(shù),需要是函數(shù)的創(chuàng)建者或擁有EXECUTE ANY PROCEDURE系統(tǒng)權(quán)限的人

1:語法

1)創(chuàng)建:

CREATE[ORREPLACE]FUNCTION函數(shù)名[(參數(shù)[IN] 數(shù)據(jù)類型...)]

RETURN數(shù)據(jù)類型

{AS|IS}

[說明部分]

BEGIN

可執(zhí)行部分

RETURN(表達(dá)式)

[EXCEPTION

錯(cuò)誤處理部分]

END[函數(shù)名];

說明:

?參數(shù)是可選的,但只能是IN類型(IN關(guān)鍵字可以省略)。

?在定義部分的RETURN 數(shù)據(jù)類型,用來表示函數(shù)的數(shù)據(jù)類型,也就是返回值的類型,不可省略。

?在可執(zhí)行部分的RETURN(表達(dá)式),用來生成函數(shù)的返回值,其表達(dá)式的類型應(yīng)該和定義部分說明的函數(shù)返回值的數(shù)據(jù)類型一致。在函數(shù)的執(zhí)行部分可以有多個(gè)RETURN語句,但只有一個(gè)RETURN語句會(huì)被執(zhí)行,一旦執(zhí)行了RETURN語句,則函數(shù)結(jié)束并返回調(diào)用環(huán)境。?

2)刪除

??DROP FUNCTION 函數(shù)名;

3)修改

??ALTER PROCEDURE 函數(shù)名 COMPILE;

4)執(zhí)行

??變量名:=函數(shù)名(...)?

三:對存儲過程 和 函數(shù)的查看(可以通過對數(shù)據(jù)字典【USER_SOURCE】的訪問來查詢存儲過程或函數(shù)的有關(guān)信息)

1:查詢某個(gè)存儲過程序內(nèi)容

select TEXT from user_source WHERE NAME='存儲過程名';

2:查看數(shù)據(jù)字殿

DESCRIBE USER_SOURCE ; //命令行中

3:查看存儲過程的參數(shù)

DESCRIBE say_hello; //后面是過程名

4:查看發(fā)生編輯錯(cuò)誤

SHOW ERRORS ;

5:查詢一個(gè)存儲過程或函數(shù)是否是有效狀態(tài)(即編譯成功)

SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫

VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態(tài)會(huì)改變,這與它依賴外部表(表刪除修改等操作)有關(guān)系

6:查看存儲過程與表的依賴關(guān)系

SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';

說明

NAME為實(shí)體名,TYPE為實(shí)體類型,REFERENCED_OWNER為涉及到的實(shí)體擁有者賬戶,REFERENCED_NAME為涉及到的實(shí)體名,REFERENCED_TYPE 為涉及到的實(shí)體類型。

問題:

如果一個(gè)用戶A被授予執(zhí)行屬于用戶B的一個(gè)存儲過程的權(quán)限,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的權(quán)限,但用戶A沒有被授予訪問用戶C表的權(quán)限,那么用戶A調(diào)用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。

Oracle如何創(chuàng)建存儲過程和如何調(diào)用存儲過程

【delphi+oracle報(bào)表解決方案(一)】delphi中調(diào)用oracle的存儲過程(分帶返回游標(biāo),不返回值兩種)

關(guān)鍵字: delphi ,oracle存儲過程,游標(biāo),返回?cái)?shù)據(jù)集,報(bào)表注:delphi 6+ oracle 8.1.6一.創(chuàng)建包與包體1.附:建表aaclass為下面作測試用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values('c1', 'cn1', 10 ) ;

INSERT INTO aaclass values('c2', 'cn2', 40 ) ;

INSERT INTO aaclass values('c1', 'cn3', 30 ) ;

commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1

AS type rc_class is ref cursor;

--求p1,p2的和與差,返回的多個(gè)值通過游標(biāo)返回

procedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class);

--查詢滿足條件的數(shù)據(jù)集,返回?cái)?shù)據(jù)集通過游標(biāo)返回

procedure GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一條記錄,不返回結(jié)果集時(shí),本人用AdoQuery調(diào)用(adodataset好象要求必須返回結(jié)果集)

procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,

p_pnumber number) ;

end PKG_JCCTEST1; 3.建包體CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1

ASprocedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class)

IS

BEGIN

open ResultCursor for

select p1-p2 as "sum", p1+p2 as "sub" from dual;

END ;

procedure GetClass2(a in number,ResultCursor out rc_class )

is

begin open ResultCursor for

select aaclass.* from aaclass where pnumber a;end ;procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,

p_pnumber number)

is

begin

insert into aaclass values(p_cid,p_cname,p_pnumber) ;

-- commit;

end ; 二.在delphi中利用AdoDataSet調(diào)用上述第一個(gè)存儲過程

1.利用AdoConnection1連接數(shù)據(jù)庫(驅(qū)動(dòng)為 oracle Provider for OLE DB),

**并在連接字符串中加入這一節(jié): PLSQLRSet=1; 如下所示:

Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗體上加AdoDataSet1 指明連接為上述AdoConnection1,下面可以放一個(gè)按鈕,單擊按鈕就能調(diào)用第一步中創(chuàng)建的包過程,并返回?cái)?shù)據(jù)集。代碼如下所示:

procedure TForm1.Button1Click(Sender: TObject);

var

AResult , BResult : integer;

begin

ADODataSet1.Close ;

ADODataSet1.CommandType := cmdText ;

ADODataSet1.Parameters.Clear ; //***利用call方法調(diào)用oracle過程時(shí),參數(shù)必須由?來傳, 即使你要傳的參數(shù)為常理

//輸出游標(biāo)的參數(shù)不需要指定!!!!!!,本來此函數(shù)帶三個(gè)參數(shù),我們這里只需要傳兩個(gè)參數(shù).

ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ; //***C 順序有關(guān),createparam必須放在commandtext賦值語句之后. // 創(chuàng)建第一個(gè)參數(shù),對應(yīng)call中的第一個(gè)?,ftinteger為類型,10為長度,45為傳入的實(shí)參值

ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);

//創(chuàng)建第二個(gè)參數(shù),根據(jù)createparameter的順序 自動(dòng)與call中的第二個(gè)參數(shù)對應(yīng)

ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4); //下面調(diào)用ADODataSet1 的open方法,返回?cái)?shù)據(jù)集(對應(yīng)包過程的游標(biāo))

ADODataSet1.Open ; //根據(jù)存儲過程,數(shù)據(jù)集只有一條記錄,所以不需要用while do 來遍歷數(shù)據(jù)集,直接取數(shù)據(jù)了 //此處的字段名根據(jù)包過程中的返回游標(biāo) 對應(yīng)的字段名來取

//定義的存儲過程返回游標(biāo)如: open ResultCursor for

// select p1-p2 as "sum", p1+p2 as "sub" from dual;

//把對應(yīng)的字段值取出來即可

AResult := ADODataSet1.Fields.FieldByName('sub').Value ;

BResult := ADODataSet1.Fields.FieldByName('sum').Value ; //顯示結(jié)果

showmessage(inttostr(AResult)) ;

showmessage(inttostr(BResult)) ;end;

三.在delphi中利用AdoDataSet調(diào)用上述第二個(gè)存儲過程

還是利用上述的AdoDataSet1來調(diào)用第二個(gè)存儲過程,無需任何改動(dòng),加第二個(gè)按鈕,單擊時(shí)代碼如下:procedure TForm1.Button2Click(Sender: TObject);

begin

ADODataSet1.Close ;

ADODataSet1.CommandType := cmdText ;

ADODataSet1.Parameters.Clear ; //***利用call方法調(diào)用oracle過程時(shí),參數(shù)必須由?來傳, 即使你要傳的參數(shù)為常理

//輸出游標(biāo)的參數(shù)不需要指定!!!!!!,本來此函數(shù)帶兩個(gè)參數(shù),我們這里只需要傳一個(gè)參數(shù).

ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ; //***C 順序有關(guān),createparam必須放在commandtext賦值語句之后. // 創(chuàng)建第一個(gè)參數(shù),對應(yīng)call中的第一個(gè)?,ftinteger為類型,10為長度,20為傳入的實(shí)參值

ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);

//下面調(diào)用ADODataSet1 的open方法,返回?cái)?shù)據(jù)集(對應(yīng)包過程的游標(biāo))

ADODataSet1.Open ; while not ADODataSet1.Eof do

begin

showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +

'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +

'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)

) ;

ADODataSet1.Next ;

end ;

end; 四 利用adoquery調(diào)用第三個(gè)過程,不返回?cái)?shù)據(jù)集的procedure TForm1.Button3Click(Sender: TObject);

begin

AdoQuery1.Close ;

AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;

AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;

AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;

AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;

end;

五 利用adoquery調(diào)用第一個(gè)過程,返回?cái)?shù)據(jù)集的.

procedure TForm1.Button4Click(Sender: TObject);

begin

AdoQuery1.Close ;

AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;

AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;

AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+

string( AdoQuery1.FieldByName('sum').Value));

end;六.關(guān)于三層體系的此類問題兩層的解決了,三層類似.

中間層用tadodataset 或tadoquery (+tdatasetprovider),中間層的adoconnection的連接字符串加上plsqlRset=1;

客戶端用clientdataset ,大同小異,舉例如下: begin

//調(diào)用相應(yīng)的過程

ClientDataSet1.Close ;

ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := '{call PackageName.ProcedureName(?,?)}' ;

ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;

ClientDataSet1.Open ;

end ;

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:


文章標(biāo)題:oracle如何搭建存儲,oracle 建立存儲過程
文章起源:http://weahome.cn/article/hsiogh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部