日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

oracle中packages使用,oracle中packages的使用

發布時間:2025/3/11 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle中packages使用,oracle中packages的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近,由于開發的功能較多,對于編寫的很多過程,看著英文名字覺得挺熟悉,但要看功能,則需要每個點開去開備注或者代碼,覺得很是郁悶。突見packages,想將所有寫的過程放到一起,這樣下次點開一個,就能看到所有功能的過程,很是方便。趁著下午偶閑一會,將packages小做研究。

包的作用 : 包可以將任何出現在塊聲明的語句 ( 過程 , 函數 , 游標 ,? 變量 ) 放于包中 , 相當于一個容器 。 將聲明語句放入包中的好處是 : 用戶可以從其他 PL/SQL 塊中對其進行引用 , 因此包為 PL/SQL 提供了全程變量 。

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

如何創建包

1) 包頭 :

語法格式 :

CREATE OR REPLACE PACKAGE package_name /* 包頭名稱 */

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

定義包頭應當遵循以下原則 :

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

2) 包頭可以不對任何類型的元素進行說明 。 例如 , 包頭可以只帶過程和函數說明語句 , 而不聲明任何異常和類型 。

3) 對過程和函數的任何聲明都必須只對子程序和其參數進行描述 , 不能有任何代碼的說明 , 代碼的實現只能在包體中出現 。 它不同于塊聲明 , 在塊聲明中 , 過程和函數的代碼可同時出現在聲明部分 。

2. 包體 :

語法格式 :

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

IS | AS pl/sql_package_body??????????????????? /* 游標 , 函數 , 過程的具體定義 */

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

EG: 定義一個包頭

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 RETURN tab_02;

TYPE cur_03 IS REF CURSOR RETURN tab_03;

TYPE cur_04 IS REF CURSOR RETURN tab_04;

TYPE cur_05 IS REF CURSOR RETURN tab_05;

TYPE cur_06 IS REF CURSOR RETURN tab_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 的數據類型是 select_table 包中 cur_o4

END test_package;

包體 :

CREATE OR REPLACE PACKAGE BODY test_package

IS

/* 函數實現開始 */

FUNCTION average

(cnum IN char)

RETURN NUMBER;

AS

avger NUMBER;

BEGIN

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

RETURN(avger);

END average;

/* 函數實現結束 */

/* 過程實現開始 */

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;

/* 過程實現結束 */

END test_package;

重載 : 包中的函數和過程可以重載

以下條件不能重載 :

1. 如果兩個子程序的參數僅在名稱和類型上不同 , 這兩個程序不能重載。

PROCEDURE overloadME(p_theparameter IN number);

PROCEDURE overloadME(p_theparameter OUT number);

IN ,OUT 為參數類型 ,number 為數據類型。兩個過程僅在類型上不同時不能重載 。

2. 不能根據兩個函數的返回類型對其重載

如 :

FUNCTION overloadMeEToo RETURN DATE;

FUNCTION overloadMeEToo RETURN NUMER;

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

PROCEDURE overloadME(p_theparameter IN char);

PROCEDURE overloadME(p_theparameter IN varchar2);

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

5. 包的初始化 。

當第一次調用打包子程序時 , 該包將進行初始化 。 也就是說 , 將該包從硬盤中讀入到內存 , 并啟用調用的子程序的編譯代碼 。 這時 , 系統為該包中定義的所有變量分配內存單元 。 每個會話都有打其打開包變量的副本 , 以確保執行同一個包子程序的兩個會話使用不同的內存單元 。

在大多數情況下 , 初始化代碼要在包第一次初始化時運行 。 為了實現這一功能 , 可以在包體中的所有對象之后加入一個初始化代碼 .

語法格式 :

CREATE OR REPLACE PACKAGE BODY package_name

IS|AS

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

BEGIN

Initialization_code;-- 要運行的初始化代碼

END ;

ORACLE 內置包

1.DBMS_ALERT 包 : 用于數據庫報警 , 允許會話間通信

2.DBMS_JOB: 用于任務調度服務

3.DBMS_LOB: 用于處理大對象操作

4.DBMS_PIPE 包 : 用于數據庫管道 , 允許會話間通信

5.DBMS_SQL 包 : 用于執行動態 SQL

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

除了 UTL_FILE 包存儲在服務器和客戶端外 , 其他的包均存儲在服務器中 。

在編譯包的過程中,出現了如下的錯誤:

1、Error:PLS-00323: 子程序或游標 已在程序包說明中聲明, 必須在程序包體中對其進行定義。

錯誤原因:包頭里面定義的函數和包體里面函數的參數不同,出現的錯誤。

2、如果編譯完成,在執行時,包是不會提示錯誤的,此時就需要自己來查找錯誤。我使用的方法是在過程中將sql調好之后再放到包中運行

總結

以上是生活随笔為你收集整理的oracle中packages使用,oracle中packages的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。