近日接手乙個分析類老專案改造工作,使用者要求使用oracle資料庫(原先版本為sql server2005),由於原專案中大量使用儲存過程實現複雜的業務資料查詢,在sql server中由於使用錶值函式、臨時表等非常方便,所以當時實現起來並不費事,而現在轉為oracle就不一樣了,限制太多(說實話:甲骨文的東西實在沒有微軟的用起來舒服)。
比如儲存過程吧,直接建臨時表,再往裡面塞加工後資料,oracle裡不允許,非要用動態查詢語句,如:
strsql := 'create global temporary table tmp_test(...)';
execute immediate strsql;
strsql := 'insert into tmp_test ....';
execute immediate strsql;
很麻煩,在拼接動態語句時很容易出錯,往往執行後才知道有沒有問題。
查閱了很多資料也沒有使用臨時表的好辦法。
後來想到用集合變數來代替臨時表,並使用游標返回資料。具體方法如下:
1、先建物件型別
create type testrecord is object(id int,name varchar2(20));
2、再建乙個集合型別
create type testtable is table of testrecord;
3、儲存過程中使用方法如下:
create procedure p_test(p_type int,retcur out
sys_refcursor)
isrec1 testrecord;
rec2 testrecord;
datatab testtable;
begin
--例項化一條記錄
rec1:=testrecord(1,'test01');
--用此方法擴充套件表集合
datatab.extend;
--往集合中插入資料
datatab(1):=rec;
--例項化另一條記錄再插入
rec2:=testrecord(2,'test02');
datatab.extend;
datatab(2):=rec;
--可以使用以上方法往表集合動態插入資料行
--下面是批量插入資料的方法
--假設存在表 t_test 幷包含sid,sname和stype欄位
select testrecord(sid,sname) --注意這裡的方式
bulk collect into datatab
from t_test
where stype=p_type;
--開啟游標返回資料
open retcur for
select * from
table(datatab);
end;
4、說明:上面兩個型別必須在表空間中先建好,oracle中不允許使用游標方式開啟本地集合,使用table(datatab)方式可以在儲存過程中象訪問普通表一樣訪問表集合型別例項裡的資料。
儲存過程示例 在儲存過程中使用臨時表
create or replace procedure product temp update prc aspc delestr varchar2 50 刪除臨時表記錄語句 pc createstr varchar2 500 建立臨時表 tabext varchar2 10 用於判斷臨時表是否存在中...
SQL在儲存過程中使用臨時表
1 create or replace procedure product temp update prc as 2 pc delestr varchar2 50 刪除臨時表記錄語句 3 pc createstr varchar2 500 建立臨時表 4 tabext varchar2 10 用於判...
Mysql儲存過程中使用臨時表和游標
1。臨時表 1 drop procedure2if exists p getmonitorpeople 3create procedure p getmonitorpeople in fgid int,in mins int,in lens int 4 begin 5if fgid 0 mins 0...