我正在编写一个 PL/SQL 存储过程,它将在 .NET 应用程序中调用。
我的存储过程必须返回
- 基于输入零件编号的零件修订表中的值计数,
- 当前在此表中为输入部件号捕获的最低修订级别的名称
数据库中与此部件号相关联的特定单元的修订级别的名称和输入单元 ID。
单元的修订级别名称在一个单独的表中捕获,与部件修订表没有直接关系。
相关数据结构:
Table Part has columns:
Part_ID int PK
Part_Number varchar2(30)
Table Part_Revisions:
Revision_ID int PK
Revision_Name varchar2(100)
Revision_Level int
Part_ID int FK
Table Unit:
Unit_ID int PK
Part_ID int FK
Table Unit_Revision:
Unit_ID int PK
Revision_Name varchar2(100)
话虽如此,我将这三个数据元素查询到引用游标中以进行输出的最有效方法是什么?我正在考虑以下选项1:
OPEN cursor o_Return_Cursor FOR
SELECT (SELECT COUNT (*)
FROM Part_Revisions pr
inner join PART pa on pa.part_id = pr.part_id
WHERE PA.PART_NO = :1 )
AS "Cnt_PN_Revisions",
(select pr1.Revision_Name from Part_Revisions pr1
inner join PART pa1 on pa1.part_id = pr1.part_id
WHERE PA.PART_NO = :1 and pr1.Revision_Level = 0)
AS "Input_Revison_Level",
(select ur.Revision_Name from Unit_Revision ur
WHERE ur.Unit_ID = :2) as "Unit_Revision"
FROM DUAL;
但是,Toad 的解释计划返回成本:2 基数:1,我怀疑这是由于我在主查询中使用了 DUAL。将其与选项 2 进行比较:
select pr.Revision_Name, (select count(*)
from Part_Revisions pr1
where pr1.part_id = pr.part_id) as "Count",
(select ur.Revision_Name
from Unit_Revision ur
where ur.Unit_ID = :2) as "Unit_Revision"
from Part_Revisions pr
inner join PART pa on pa.part_id = pr.part_id
WHERE PA.PART_NO = :1 and pr.Revision_Level = 0
本质上,我真的不知道如何比较我的执行计划的结果,以选择最佳设计。我还考虑了选项 1 的一个版本,我没有将两次加入 Part 表,而是将 Part_ID 选择到一个局部变量中,然后根据该值简单地查询 Part_Revisions 表。但是,这不是我可以使用解释计划来分析的。