避免在 PL/SQL 中使用嵌套游标查询
2008-12-17 13:06:14 来源:WEB开发网游标
游标的 FOR 循环现在是独立运行的,并且特定记录、特定字段、特定单元格的数据被拷贝到三个 PL/SQL 表中。然后利用记录和字段具有特定顺序这一事实,将结果构建到一个 PL/SQL 表的矩阵中。由于 GROUP BY 的隐式 SORT/MERGE 操作,单元格具有同样的顺序。单元格查询已经被减少到一个查询,替代了原来的矩阵每个单元格使用一个查询。
如果字段的数目相当小,那么我们可以使用 BULK COLLECT 构建表。BULK COLLECT 不允许表记录的填充,所以我们就需要为用于这个操作的每一列数据创建一个独立的表。前面的例子可以采用 BULK COLLECT 重写为另外一种形式。
declare
type part_id_tbl_type is table of parts.id%type;
type part_desc_tbl_type is table of parts.description%type;
part_id_tbl part_id_tbl_type;
part_desc_tbl part_desc_tbl_type;
--
type country_code_tbl_type is table of countries.code%type;
country_code_tbl country_code_tbl_type;
--
type cell_cnt_tbl_type is table of orders.cnt%type;
cell_part_id_tbl part_id_tbl_type;
cell_country_tbl country_code_tbl_type;
cell_cnt_tbl cell_cnt_tbl_type;
--
i pls_integer;
begin
-- gather rows
select id,description
bulk collect into part_id_tbl,part_desc_tbl
from parts
order by description;
-- gather columns
select code
bulk collect into country_code_tbl
from countries
order by name;
-- gather cells
select part_id,cc,sum(cnt)
bulk collect into cell_part_id_tbl,cell_country_tbl,cell_cnt_tbl
from orders
group by part_id,cc;
dbms_output.put_line('<matrix>');
-- generate matrix of parts by country
i := cell_cnt_tbl.first;
for row in part_id_tbl.first .. part_id_tbl.last loop
dbms_output.put_line('<row>');
dbms_output.put_line('<cell>'||part_desc_tbl(row)||'</cell>');
for col in country_code_tbl.first .. country_code_tbl.last loop
if cell_part_id_tbl(i) = part_id_tbl(row)
and cell_country_tbl(i) = country_code_tbl(col)
then
dbms_output.put_line('<cell>'||cell_cnt_tbl(i)||'</cell>');
i := i + 1;
else
dbms_output.put_line('<cell>0</cell>');
end if;
end loop;
dbms_output.put_line('</row>');
end loop;
dbms_output.put_line('</matrix>');
end;
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接