oracle之儲存過程,臨時表,游標示例

2021-06-22 01:20:37 字數 2604 閱讀 1398

總結如下:

ddl是一種消耗資源非常大的操作,執行時盡量不要使用ddl語句,應用程式需要的臨時表應在執行之前就開始建立。不必在每個儲存過程中建立一次。臨時表總是存在的,他們作為物件存在於資料字典中,並且總是保持為空,直到有會話在其中放入資料

1 建立臨時表

sql**

create global temporary table 表名

( id varchar2(100 char),

name varchar2(100 char)

) on commit preserve rows;

2 建立儲存過程

sql**

create or replace procedure proc_***(

mycur out sys_refcursor

as type my_curtype is ref cursor;

cur_1 my_curtype;

tempa varchar2;

tempb varchar2;

--此處可宣告更多變更^_^

begin

open cur_1 for select * from 表名;

--使用前先清空

execute immediate 'truncate table 臨時表表名';

loop

fetch cur_1 into tempa;

exit when cur_1%notfound;

--進行相關的業務查詢,將結果返回於更多變數上,插入臨時表資料

tempa:='1';

tempb:='jack';

insert into 臨時表表名(id,name)values(tempa,tempb);

commit;

end loop;

open mycur for select * from 臨時表表名;

close cur_1;

message :='查詢臨時表成功';

exception

when others then

message :='查詢臨時表失敗';

end proc_***;

參考更多

1 建立臨時表,插入資料,返回結果集

sql**

create or replace procedure report_month_responsibility(

o_cur out sys_refcursor

) is

str varchar2(200);

tb_count int;

begin

--先判斷全域性臨時表是否存在,沒存在則重新建立:

select count(*) into tb_count from dba_tables where table_name='reprottest';

if tb_count=0 then

str:=' create global temporary table reprottest(

id int,

aname varchar2(20)

) on commit preserve rows';

execute immediate str;

end if;

str:='insert into reprottest(id,aname) values(1,''1'')';

execute immediate str;

commit;

str:='select * from reprottest';

open o_cur for str; -- 給游標變數賦值

end report_month_responsibility;

2 呼叫儲存過程

sql**

create or replace procedure proc_x()

is v_id int;

v_aname varchar2(20);

--定義游標:

v_account_cur sys_refcursor;

begin

--呼叫儲存過程:

report_month_responsibility(v_account_cur);

fetch v_account_cur into v_id,v_aname;

--用迴圈顯示游標中的記錄:

while v_account_cur%found loop

dbms_output.put_line('the value of column id is: '||v_id);--打引列id

dbms_output.put_line('the value of column aname is: '||v_aname);

--打引列aname

fetch v_account_cur into v_id,v_aname;

end loop;

close v_account_cur;

execute immediate 'truncate table reprottest';

end proc_x;

在ORACLE儲存過程中建立臨時表

create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on mit preserve rows execute im...

在ORACLE儲存過程中建立臨時表

create procedure pro asstr varchar2 100 begin str create global temporary table tablename col1 varchar2 10 col2 number on commit preserve rows execute...

在ORACLE儲存過程中建立臨時表

在oracle儲存過程中建立臨時表 儲存過程裡不能直接使用ddl語句,所以只能使用動態sql語句來執行 on commit delete rows 說明臨時表是事務指定,每次提交後oracle將截斷表 刪除全部行 on commit preserve rows 說明臨時表是會話指定,當中斷會話時or...