儲存過程和函式並不能直接返回查詢結果集

2021-09-01 07:26:57 字數 1469 閱讀 6518

oracle的儲存過程和函式並不能直接返回查詢結果集。也就是說在oracle儲存過程或函式中直接寫查詢返回結果集是非法的(在sql server是可以的)。

與sql server的儲存過程和函式均可以返回結果集不同的是,pl/sql的儲存過程和函式均不直接提供返回資料集的方法,但可以通過返回型別物件來實現返回資料集的效果。具體思路為:

(1)建立包頭,在其中宣告型別和儲存過程,型別應該引用游標;

(2)建立包體,定義儲存過程,執行查詢,將查詢得到的結果集以游標控制代碼的形式返回。

說明:游標分為顯示游標和隱式游標,任何查詢結果預設都提供隱式游標,當前方案的重點在於使用游標取得查詢結果的控制代碼,由於游標被引用為型別,通過返回型別,即等效於(並不等同)返回資料集。

具體的案例如下:

--建立包頭

create or replace package testpackage

as--宣告型別,並引用游標

type cursortype is ref cursor;

--宣告儲存過程,兩個輸入引數,乙個輸出引數,輸出游標型別資料

procedure prcgetglobaladdress

(pos1 integer, --分頁查詢的下限

pos2 integer, --分頁查詢的上限

cur in out testpackage.cursortype --輸出引數,資料型別為引用游標的型別

);end mypackage1;

--建立包體

create or replace package body testpackage

as --定義儲存過程

procedure prcgetglobaladdress

(pos1 integer,

pos2 integer,

cur in out testpackage.cursortype)as

begin

--返回得到分頁查詢結果集的游標控制代碼

open cur for

select *

from ( select a.*,rownum rn

from ( select *

from tblsys_globaladdress) a

where rownum<=pos2)

where rn > =pos1;

end prcgetglobaladdress;

end testpackage;

上面兩句話,又想起來oracle分頁的東東了,

select * from ( select a.*, rownum rn from (select count(*) over() cnt,

ta.ca,ta.cb,ta.cc,... from ta order by ta.ca

) a where rownum <= 10 ) where rn >= 1

還有把*號換裝你想要欄位名稱效率還會繼續提高 特別是大資料量的時候。

儲存過程和儲存函式

1 mysql 在操作子程式時,由於需要使用分號 所以要使用delimiter先重新定義分界符為 以下 包含的內容表示注釋 delimiter 使用delimiter 把定界符由 設定為 注意 delimiter 和 之間的空格。1 建立子程式 儲存過程和儲存函式的統稱 create procedu...

儲存過程和儲存函式

儲存過程 stored procedure 是一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫。中使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它 優點 1.儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而 一般sql 語句每執行一次就編譯一次,...

儲存過程和函式

子程式 命名的pl sql塊 的各個部分 申明部分,可執行部分,異常部分 可選 子程式的分類 過程 執行某些操作 函式 執行操作並返回結果 過程引數的三種模式 in,out,in out 建立過程的語法 create or replace procedure param list is as beg...