定義:存儲(chǔ)過(guò)程(Stored Procedure )是一組為了完成特定功能的SQL 語(yǔ)句 集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù) (如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。
存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)中的一個(gè)重要 對(duì)象,任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過(guò)程。
存儲(chǔ)過(guò)程是由流控制和SQL 語(yǔ)句書(shū)寫(xiě)的過(guò)程,這個(gè)過(guò)程經(jīng)編譯和優(yōu)化后 存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中,應(yīng)用程序使用時(shí)只要調(diào)用即可。在ORACLE 中, 若干個(gè)有聯(lián)系的過(guò)程可以組合在一起構(gòu)成程序包。
優(yōu)點(diǎn):存儲(chǔ)過(guò)程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而一般SQL語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過(guò)程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
2.當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update、Insert、Query、Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過(guò)程封裝起來(lái)與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。
3.存儲(chǔ)過(guò)程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
4.安全性高,可設(shè)定只有某用戶(hù)才具有對(duì)指定存儲(chǔ)過(guò)程的使用權(quán)。你還是給我點(diǎn)分啥,寫(xiě)得我手都酸痛了。
使用oracle的一般都裝了PL/SQL吧,對(duì)象窗口,找到對(duì)應(yīng)的函數(shù)或者存儲(chǔ)過(guò)程,右鍵查看或編輯。
一般單個(gè)我是這么用,如果很多的話可以參考一下網(wǎng)上提供的方法:
oracle 導(dǎo)出一個(gè)用戶(hù)下的所有存儲(chǔ)過(guò)程
方法一:
set echo off ;
set heading off ;
set feedback off ;
spool d:\tmp.txt
select text from user_source ;
spool off;
方法二:
使用PL/SQL 菜單 Tools --> Export user objects... ,對(duì)彈出的dialog中選擇user和output file,選中要導(dǎo)出的內(nèi)容,點(diǎn)擊export導(dǎo)出就行了
這個(gè)過(guò)程就行了。。
create or replace procedure wymauthid current_useris vn_ctn number(2)
;begin select count(*) into vn_ctn from user_all_tables a where a.table_name like upper('invbasdoc')
; if vn_ctn > 0 then execute immediate 'drop table invbasdoc'
; end if; execute immediate 'create table invbasdoc as select * from test_abcd'
;end ;原來(lái)的過(guò)程中:execute immediate 'drop table invbasdoc'; 當(dāng)如果數(shù)據(jù)庫(kù)中不存在這張表的時(shí)候就會(huì)報(bào)錯(cuò)的。。上面是對(duì)數(shù)據(jù)庫(kù)中是否存在表進(jìn)行了判斷,因此能夠避免“表不存在”這樣的錯(cuò)誤。。
不需要execute,直接寫(xiě)dbms_stats.gather_table_stats(就可以,而且專(zhuān)門(mén)寫(xiě)個(gè)存儲(chǔ)過(guò)程沒(méi)意義。
首先需要授權(quán)
sqlplus / as sysdba
grant create view to your_user;
然后創(chuàng)建表和存儲(chǔ)過(guò)程
drop table table1;create table TABLE1( user_id VARCHAR2(10), user_name VARCHAR2(10), user_mail VARCHAR2(10), user_mobile VARCHAR2(10), user_telephone VARCHAR2(10));CREATE OR REPLACE PROCEDURE CREATEVIEWS IS V_SQL VARCHAR2(10240);BEGIN V_SQL := 'CREATE OR REPLACE VIEW V_TEST AS SELECT T1.USER_ID, T1.USER_NAME, --用戶(hù)姓名 T1.USER_MAIL, --用戶(hù)MAIL T1.USER_MOBILE, --用戶(hù)手機(jī) T1.USER_TELEPHONE --用戶(hù)電話 FROM TABLE1 T1'; EXECUTE IMMEDIATE V_SQL;END CREATEVIEWS;/
執(zhí)行,OK
SQL> exec createviews;PL/SQL procedure successfully completed
可用語(yǔ)句查看或用第三方工具查看。
一、語(yǔ)句查看方法:
1、執(zhí)行語(yǔ)句:
SELECT text FROM user_source WHERE NAME = 'Procedure Name'ORDER BY line;--其中Procedure Name為存儲(chǔ)過(guò)程名字,需要全部用大寫(xiě)英文。
2、如要查P_TEST的存儲(chǔ)過(guò)程:
SELECT text FROM user_source WHERE NAME = 'P_TEST'ORDER BY line;
3、內(nèi)容如下:
二、工具查看:
1、登錄第三方工具(如pl/sql)登錄到指定數(shù)據(jù)庫(kù)。
2、左側(cè)樹(shù)中找到Procedures,然后找到相應(yīng)的存儲(chǔ)過(guò)程。
3、右鍵該存儲(chǔ)過(guò)程,選擇“查看”。
4、然后就可以看到了。
從參數(shù)的返回情況來(lái)看:
如果返回多個(gè)參數(shù)值最好使用存儲(chǔ)過(guò)程,如果只有一個(gè)返回值的話可以使用函數(shù);
從調(diào)用情況來(lái)看:
如果在SQL語(yǔ)句(DML或SELECT)中調(diào)用的話一定是存儲(chǔ)函數(shù)或存儲(chǔ)的封裝函數(shù)不可以是存儲(chǔ)過(guò)程,但調(diào)用存儲(chǔ)函數(shù)的時(shí)候還有好多限制以及函數(shù)的純度等級(jí)的問(wèn)題,你可以參考《ORACLE 9I PL\SQL程序設(shè)計(jì)》(機(jī)械工業(yè)出版社);
如果是在過(guò)程化語(yǔ)句中調(diào)用的話,就要看你要實(shí)現(xiàn)什么樣的功能。函數(shù)一般情況下是用來(lái)計(jì)算并返回一個(gè)計(jì)算結(jié)果而存儲(chǔ)過(guò)程一般是用來(lái)完成特定的數(shù)據(jù)操作(比如修改、插入數(shù)據(jù)庫(kù)表或執(zhí)行某些DDL語(yǔ)句等等),所以雖然他們的語(yǔ)法上很相似但用戶(hù)在使用他們的時(shí)候所需要完成的功能大部分情況下是不同的。
我的回答:oracle存儲(chǔ)過(guò)程是編譯好的并且存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中的程序代碼。存儲(chǔ)過(guò)程有名字及自己的參數(shù),但是存儲(chǔ)過(guò)程沒(méi)有返回值。一個(gè)存儲(chǔ)過(guò)程就是一組命名的PL/SQL語(yǔ)句。
這個(gè)存儲(chǔ)過(guò)程你可以在TEST的環(huán)境下查看結(jié)果,不過(guò)你需要隱式游標(biāo)來(lái)進(jìn)行操作,那樣才能看到,具體步驟如下:
1、首先我們要借助游標(biāo),因此需要先定義一個(gè)返回類(lèi)型的游標(biāo)createorreplacepackagetype_difinitionastypemycursorisrefcursor;endtype_difinition;
2、改寫(xiě)你的存儲(chǔ)過(guò)程,要想查看執(zhí)行SQL后結(jié)果需要一個(gè)返回參數(shù),這個(gè)參數(shù)即上面定義的游標(biāo)類(lèi)型createorreplaceprocedureselect_pro(p_resultouttype_difinition.mycursor--返回結(jié)果)issyn_sqlvarchar2(200)default'';beginsyn_sql:='select*fromemp';--此處打開(kāi)游標(biāo),并把需執(zhí)行的SQL賦值給游標(biāo)openp_resultforsyn_sql;endselect_pro;
3、執(zhí)行編譯通過(guò)后,右鍵點(diǎn)擊存儲(chǔ)過(guò)程的名字,跳出框,選擇Test一項(xiàng),進(jìn)入Test界面4、點(diǎn)擊編譯、再點(diǎn)擊執(zhí)行5、Test界面的底部界面,有個(gè)VariableTypevalue的列表,此時(shí)你可以點(diǎn)擊Value值里面的...按鈕,即可查看結(jié)果,由于不怎么會(huì)應(yīng)用這個(gè)編輯器,本想把圖片上傳給你,如有不解,再詳問(wèn),希望回答對(duì)樓主有幫助
建議使用PowerDesigner將ORACLE轉(zhuǎn)換為物理模型,再轉(zhuǎn)換為邏輯模型,然后通過(guò)這個(gè)邏輯模型重新選擇DBMS(MYSQL),將其轉(zhuǎn)換為MYSQL的物理邏輯模型,在物理邏輯模型上更新觸發(fā)器,過(guò)程等對(duì)象,然后生成MYSQL的物理文件,或直接導(dǎo)入到MYSQL數(shù)據(jù)庫(kù)實(shí)例中。