【发布时间】:2016-05-30 20:27:04
【问题描述】:
我有一个存储过程,GetRegions,它将一些列提取到游标中,如下所示:
OPEN out_cur FOR
SELECT id, name, ...
FROM regions, ...
WHERE ...
这个SP到处都在使用——在会返回几十个地区的地方,在会返回数万个的地方。
我还有一个函数,GetRegionPath,它获取一个区域的“路径”。这是一个中等成本的功能 - 在数十个区域上运行它没有问题,但在数万个区域上运行它是不可接受的。
我需要编写一个存储过程,GetRegionsWithPaths,它使用与GetRegions 完全相同的逻辑现在和永远获取区域,但在结果中包含区域的路径设置。
目前,GetRegionsWithPaths 是 GetRegions 的精确副本,并添加了路径:
OPEN out_cur FOR
SELECT id, name, ..., GetRegionPath(id) path
FROM regions, ...
WHERE ...
但这是不可接受的 - 如果有人编辑 GetRegions,那么这两个 SP 将不同步。我想要的是从GetRegions 中取出光标,然后添加它的路径。比如:
GetRegions(..., v_cur);
OPEN out_cur FOR
SELECT id, name, ..., GetRegionPath(id) path
FROM ( SELECT * FROM v_cur );
这可能吗?如果有,语法是什么?
【问题讨论】:
-
我会向 GetRegions SP 添加一个名为“includedPath”的额外参数(0-否,1-是)。 SP 将始终返回“路径”列,但如果参数为“0”,它将为 NULL。然后在光标上添加一个额外的列来调用“GetPath”,如下所示“CASE WHEN includePath = 1 THEN GetRegionPath(id) ELSE NULL END CASE”。
-
@MarcoPolo 这是一个非常好的建议,谢谢。
-
您甚至可以根据参数动态打开两个不同的游标,一个带列,另一个不带列。
-
@MarmiteBomber 我不确定这对我有什么帮助 - 我需要相同的逻辑,所以我仍然需要从第一个光标读取以写入第二个光标。
-
添加了@Maco提出的参数实现
标签: oracle stored-procedures plsql oracle11g