考慮下面的 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 宣告乙個查詢出來...