如何在传导的地方使用RECORD或CURSOR

时间:2016-03-30 16:48:52

标签: oracle plsql

我正在编写一个需要返回文档ID的存储过程 这个文件的id可以是两个字段中的任何一个。 APP_DOC_ID(从应用程序添加)BTCH_DOC_D(从批处理添加)都是同一个表中的不同字段。

我需要根据子查询获得那些docid。

SELECT DISTINCT APP_DOC_ID FROM
(SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SUBQUERY))
UNION ALL
SELECT DISTINCT BTCH_DOC_ID FROM
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SUBQUERY))

我的SUBQUERY有点复杂,所以我不想运行该查询2次1 APP_DOC_ID和BTCH_DOC_ID, 是否可以将子查询结果保存在RECORD或CURSOR中,并将其用于查询的

BEGIN
OPEN P_CURSOR FOR (Select AB.XX||AB.XY||AB.XZ from ....)
SELECT DISTINCT APP_DOC_ID FROM
    (SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN P_CURSOR)
UNION ALL
SELECT DISTINCT BTCH_DOC_ID FROM
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN P_CURSOR)

这种方法我没有运行我的复杂子查询2次。

感谢您的帮助和时间

1 个答案:

答案 0 :(得分:1)

您可以使用WITH子句:

WITH subquery AS(
  SELECT .... your complex subquery goes here
)
SELECT DISTINCT APP_DOC_ID FROM
(SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SELECT * FROM SUBQUERY))
UNION ALL
SELECT DISTINCT BTCH_DOC_ID FROM
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SELECT * FROM SUBQUERY SUBQUERY))

有关详细信息,请参阅此链接:subquery factoring clause

  

WITH query_name子句允许您为子查询块指定名称。   然后,您可以在查询中引用子查询块多个位置   通过指定query_name。 Oracle数据库通过优化查询   将查询名称视为内联视图或临时视图   表