日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

oracle的package是什么意思,Oracle的Package的作用及用法

發(fā)布時(shí)間:2023/12/14 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle的package是什么意思,Oracle的Package的作用及用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡化應(yīng)用設(shè)計(jì)、提高應(yīng)用性能、實(shí)現(xiàn)信息隱藏、子程序重載。

1、Oracle的Package除 了把存儲(chǔ)過程放到一堆兒以外還有沒有其他的作用(好處)?

你不覺得把存儲(chǔ)過程分門別類是很重要的么,而且不同的package的存儲(chǔ)過程可以重 名。

用package不僅能把存儲(chǔ)過程分門別類,而且在package里可以定義公共的變量/類型,既方便了編程,又減少了服務(wù)器的編譯開銷。

2、如何把現(xiàn)有的存儲(chǔ)過程加入到Package中?

copy and pasty,不過調(diào)用的時(shí)候要帶包名了。

3、除了使用SQL Plus,還有沒有什么工具做Package?

也有方便的第三方工具了,不過得自己找了。

用第三方工具吧,比如sql navigator。www.quest.com

4、使用SQL Plus編譯Package,是否每次都是編譯Package中所有的存儲(chǔ)過程?

包也是一種命名pl/sql塊,和存儲(chǔ)過程、函數(shù)一下,都是在數(shù)據(jù)庫啟動(dòng)的時(shí)候就載入內(nèi)存的。開銷的大小很難判斷,因?yàn)槟悴挥冒?#xff0c;但是要完成包的功能的話,還是要用PL/SQL來完成的,服務(wù)器一樣有開銷。相對(duì)來說,用包少了SQL的語法分析、解釋過程,開銷還少一點(diǎn)。

“過程一般都不超過20行”那我倒很少遇到。用不用子過程關(guān)鍵要看是不是能定義可重用的子過程,用子過程效率不會(huì)低。

包的作用:包可以將任何出現(xiàn)在塊聲明的語句(過程,函數(shù),游標(biāo),游標(biāo),類型,變量)放于包中,相當(dāng)于一個(gè)容器.將聲明語句放入包中的好處是:用戶可以從其他PL/SQL塊中對(duì)其進(jìn)行引用,因此包為PL/SQL提供了全程變量.

包分為兩部分:包頭和包體.

如何創(chuàng)建包?

1)包頭:

語法格式:

CREATE OR REPLACE PACKAGEpackage_name /*包頭名稱*/

IS|AS pl/sql_package_spec???????????????????? /*定義過程,函數(shù)以及返回類型,變量,常量及數(shù)據(jù)類型定義*/

定義包頭應(yīng)當(dāng)遵循以下原則:

1)包元素位置可以任意安排.然而在聲明部分,對(duì)象必須在引用前進(jìn)行聲明.

2)包頭可以不對(duì)任何類型的元素進(jìn)行說明.例如,包頭可以只帶過程和函數(shù)說明語句,而不聲明任何異常和類型.

3)對(duì)過程和函數(shù)的任何聲明都必須只對(duì)子程序和其參數(shù)進(jìn)行描述,不能有任何代碼的說明,代碼的實(shí)現(xiàn)只能在包體中出現(xiàn).它不同于塊聲明,在塊聲明中,過程和函數(shù)的代碼可同時(shí)出現(xiàn)在聲明部分.

2.包體:

語法格式:

CREATE OR REPLACE PACKAGE BODY package_name/*包名必須與包頭的包名一致*/

IS | AS pl/sql_package_body??????????????????? /*游標(biāo),函數(shù),過程的具體定義*/

包體是與包頭相互獨(dú)立的,包體只能在包頭完成編譯后才能進(jìn)行編譯.包體中帶有包頭中描述的子程序的具體實(shí)現(xiàn)的代碼段.除此之外,包體還可以包括具有包體人全句屬性的附加聲明部分,但這些附加聲明對(duì)于包頭是不見的.

EG:定義一個(gè)包頭

CREATE OR REPLACE PACKAGE select_table

IS

TYPE tab_02 IS RECORD

(

itnum_1 varchar2(1),

itnum_2 varchar2(1)

);

TYPE tab_03 IS RECORD

(

itnum_1 varchar2(1),

itnum_2 varchar2(1),

itnum_3 varchar2(1)

);

TYPE tab_04 IS RECORD

(

itnum_1 varchar2(1),

itnum_2 varchar2(1),

itnum_3 varchar2(1),

itnum_4 varchar2(1)

);

TYPE tab_05 IS RECORD

(

itnum_1 varchar2(1),

itnum_2 varchar2(1),

itnum_3 varchar2(1),

itnum_4 varchar2(1),

itnum_5 varchar2(1)

);

TYPE tab_06 IS RECORD

(

itnum_1 varchar2(1),

itnum_2 varchar2(1),

itnum_3 varchar2(1),

itnum_4 varchar2(1),

itnum_5 varchar2(1),

itnum_6 varchar2(1)

);

TYPE cur_02 IS REF CURSOR RETURNtab_02;

TYPE cur_03 IS REF CURSOR RETURNtab_03;

TYPE cur_04 IS REF CURSOR RETURNtab_04;

TYPE cur_05 IS REF CURSOR RETURNtab_05;

TYPE cur_06 IS REF CURSOR RETURNtab_06;

END select_tab;

EG:

CREATE OR REPLACE PACKAGE test_package

IS

FUNCTION average

(cnum IN char)

RETURN NUMBER;

PRODURE student_grade

(CUR OUT select_table.cur_04);--CUR的數(shù)據(jù)類型是select_table包中cur_o4

END test_package;

包體:

CREATE OR REPLACE PACKAGE BODY test_package

IS

/*函數(shù)實(shí)現(xiàn)開始*/

FUNCTION average

(cnum IN char)

RETURN NUMBER;

AS

avger NUMBER;

BEGIN

SELECT AVG(CJ) INTO avger FROM XS_KC WHERE KCH=cnum GROUP BYKCH;

RETURN(avger);

END average;

/*函數(shù)實(shí)現(xiàn)結(jié)束*/

/*過程實(shí)現(xiàn)開始*/

PRODURE student_grade

(CUR OUT select_table.cur_04);

AS

OPEN CUR FOR

SELECT XS.XH ,XS.XM,KC.KCM,XS_KC.CJ

FROM XS ,XS_KC,KC

WHERE XS.XH =XS_KC.XH AND XS_KC.KCH=KC.KCH;

END student_grade;

/*過程實(shí)現(xiàn)結(jié)束*/

END test_package;

重載:包中的函數(shù)和過程可以重載

以下條件不能重載:

1.如果兩個(gè)子程序的參數(shù)僅在名稱和類型上不同,這兩個(gè)程序不能重載.

PROCEDURE overloadME(p_theparameterIN number);

PROCEDURE overloadME(p_theparameterOUT number);

IN ,OUT為參數(shù)類型,number為數(shù)據(jù)類型.兩個(gè)過程僅在類型上不同時(shí)不能重載.

2.不能根據(jù)兩個(gè)函數(shù)的返回類型對(duì)其重載

如:

FUNCTION overloadMeETooRETURN DATE;

FUNCTION overloadMeETooRETURN NUMER;

3.重載子程序的參數(shù)的類族必須不同,例如,由于CHAR和VARCHAR2屬性同一類族,所以不能重載.

PROCEDURE overloadME(p_theparameterIN char);

PROCEDURE overloadME(p_theparameterIN varchar2);

4.打包子程序也可以重載

5.包的初始化.

當(dāng)?shù)谝淮握{(diào)用打包子程序時(shí),該包將進(jìn)行初始化.也就是說,將該包從硬盤中讀入到內(nèi)存,并啟用調(diào)用的子程序的編譯代碼.這時(shí),系統(tǒng)為該包中定義的所有變量分配內(nèi)存單元.每個(gè)會(huì)話都有打其打開包變量的副本,以確保執(zhí)行同一個(gè)包子程序的兩個(gè)會(huì)話使用不同的內(nèi)存單元.

在大多數(shù)情況下,初始化代碼要在包第一次初始化時(shí)運(yùn)行.為了實(shí)現(xiàn)這一功能,可以在包體中的所有對(duì)象之后加入一個(gè)初始化代碼.

語法格式:

CREATE OR REPLACE PACKAGE BODYpackage_name

IS|AS

............

BEGIN

Initialization_code;--要運(yùn)行的初始化代碼

END ;

ORACLE內(nèi)置包

1.DBMS_ALERT包:用于數(shù)據(jù)庫報(bào)警,允許會(huì)話間通信

2.DBMS_JOB:用于任務(wù)調(diào)度服務(wù)

3.DBMS_LOB:用于處理大對(duì)象操作

4.DBMS_PIPE包:用于數(shù)據(jù)庫管道,允許會(huì)話間通信

5.DBMS_SQL包:用于執(zhí)行動(dòng)態(tài)SQL

6.UTL_FILE包:用于文件的輸入輸出

除了UTL_FILE包存儲(chǔ)在服務(wù)器和客戶端外,其他的包均存儲(chǔ)在服務(wù)器中

總結(jié)

以上是生活随笔為你收集整理的oracle的package是什么意思,Oracle的Package的作用及用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。