问题:
一次设置什么操作,在什么情况下应用程序需要处理一组数据?
干杯。
如果所有相关数据都在 Oracle 数据库中,则处理永远不需要过程代码。
Oracle SQL 有许多处理数据的方法,例如内联视图、解析函数、MODEL
子句、WITH
子句等。将它们结合起来可以解决任何编程问题。这并不一定意味着所有事情都应该在一条 SQL 语句中完成。随着您对这些功能感到满意,您的 SQL 语句将变得更大更快,并且总代码量将变得更小。但总有一点,常规的旧程序代码更有意义。
您的原始陈述部分正确:“游标在 DBMS 的“一次设置过程”中工作。” 使用游标的逐行处理通常与基于集合的处理相反。但是 Oracle 仍然可以做一些事情来使部分流程集为基础。
例如,查看这个简单的代码来连接 EMPLOYEE 和 DEPARTMENT 表并打印结果。
begin
for employee_and_departments in
(
select employee.employee_name, department.department_name
from employee
join department
on employee.department_id = department.department_id
order by employee_name
) loop
dbms_output.put_line(employee.employee_name||', '||
department.department_name);
end loop;
end;
/
这不是匿名块的处理方式:
For each row:
1) Use index to retrieve one employee record, in order
2) Use index to lookup relevant row in department record
3) return one row
4) print one result
详细信息因执行计划而异,但这是处理匿名块的更可能的方式:
1) Hash the department table and store it in memory
2) Join it with employee table
3) Order results
4) Retrieve 100 rows at a time, and for each row:
4a) Print one result
即使没有请求,SQL 操作和数据检索也经常批量完成。部分语句仍然逐行完成,但大部分繁重的工作是自动分批完成的。当过程式 PL/SQL 转换为声明式 SQL 时,仍有很大的改进空间。但是很多代码在不知不觉中受益于基于集合的处理。