避免在 PL SQL 中使用巢狀游標查詢

2021-09-06 02:02:53 字數 3183 閱讀 2393

考慮下面的 pl/sql **,這段**生成乙個 xml 格式的矩陣樣式的報表:

declare

l_count   

integer

;begin

dbms_output.put_line(''

);--

generate matrix of parts by country

forpart in(

select

id,description 

from

parts 

order

bydescription) loop

dbms_output.put_line(''

);dbms_output.put_line(''

||part.description||'

');for

country in(

select

code 

from

countries 

order

byname) loop

select

sum(cnt) 

into

l_count 

from

orders

where

part_id 

=part.id 

andcc 

=country.code;

dbms_output.put_line(''

||nvl(l_count,0)

||''

);end

loop;

dbms_output.put_line(

' '

);end

loop;

dbms_output.put_line(

' '

);end;

如果在這個例子中 parts 和 countries 有很多行資料,那麼效能就會趨於下降。這是因為,在 pl/sql 中,每次遇到乙個游標 for 迴圈,在重新查詢並獲得資料時,都會有乙個切換到 sql 的上下文切換。

以一些伺服器端記憶體為代價,提高這種構造的速度是有可能做到的——如果動態構建 pl/sql 資料表和矩陣單元格條目就可以提高速度。例如:

declare

type part_tbl_type 

istable

ofparts

%rowtype 

index

bybinary_integer;

part_tbl   part_tbl_type;

--type country_tbl_type 

istable

ofcountries

%rowtype 

index

bybinary_integer;

country_tbl   country_tbl_type;

--type cell_rec 

isrecord

(part_id     orders.part_id

%type,

cc        orders.cc

%type,

cnt        orders.cnt

%type

);type cell_tbl_type 

istable

ofcell_rec 

index

bybinary_integer;

cell_tbl cell_tbl_type;

--i pls_integer;

begin

--build rows

forrow in(

select

*from

parts 

order

bydescription) loop

part_tbl(part_tbl.

count+1

) :=

row;

endloop;

--build columns

forcol in(

select

*from

countries 

order

byname) loop

country_tbl(country_tbl.

count+1

) :=

col;

endloop;

--build cells

forcell in(

select

part_id,cc,

sum(cnt) 

from

orders 

group

bypart_id,cc) loop

cell_tbl(cell_tbl.

count+1

) :=

cell;

endloop;

dbms_output.put_line(''

);--

generate matrix of parts by country

i :=

cell_tbl.first;

forrow 

inpart_tbl.first .. part_tbl.last loop

dbms_output.put_line(''

);dbms_output.put_line(''

||part_tbl(row).description||'

');for

col 

incountry_tbl.first .. country_tbl.last loop

ifcell_tbl(i).part_id 

=part_tbl(row).id

andcell_tbl(i).cc 

=country_tbl(col).code

then

dbms_output.put_line(''

||cell_tbl(i).cnt||'

');i :=i 

+1;else

dbms_output.put_line('0

');endif;

endloop;

dbms_output.put_line(

' '

);end

loop;

dbms_output.put_line(

' '

);end;

PL SQL中使用DML 游標 動態SQL

先申明我不是牛x,所有有錯的地方,希望廣大讀友能提醒俺一下!1.兩個常用異常處理 declare v empno emp.empno type v ename emp.ename type begin v empno 請輸入工號 select ename into v ename from emp ...

PL SQL 游標使用

set serveroutput on declare 定義游標,預設輸入引數值為4000 cursor cur emp var sal in varchar2 4000 is select empno,ename,job from emp where sal var sal 定義record變數,...

plsql游標使用學習

設定伺服器端輸出plsql執行結果 set serveroutput on 宣告乙個顯式游標 宣告游標,開啟游標,讀取游標,關閉游標 declare 宣告部分 cursor myfirstcursor is select from emp myrowtype emp rowtype 宣告乙個查詢出來...