我在编写 SQL 查询时遇到了一些麻烦。在一个包函数中,我试图在其他两个查询中重用一个查询的结果。事情是这样的:
我的架构存储请求。每个请求涉及多个目的地。此外,每个请求都在另一个表 (Request_Detail) 中详细说明。此外,请求由其 ID 标识。
所以,我主要使用 3 个表。一个用于请求,另一个用于目的地,最后一个用于详细信息。这些表中的每一个都由 Request_Id 列索引。
我要优化的查询是用户想要查找所有请求,以及在两个日期之间发送的目的地和命令。
我想先查询 Request_Table 以获取所有 Request_id。然后,使用此 Request_Ids 列表查询命令表和目标表。
我找不到如何做到这一点...我不能使用 ref 游标,因为它们不能被获取两次...我只需要一些类似数组或类似列的变量来存储 Request_Ids,然后使用它变量两次或更多...
这是我要优化的原始查询:
FUNCTION EXTRACT_REQUEST_WITH_DATE (ze_from_date DATE, ze_to_date DATE, x_request_list OUT cursor_type, x_destination_list OUT cursor_type,
x_command_list OUT cursor_type) RETURN VARCHAR2 AS
my_function_id VARCHAR2(80) := PACKAGE_ID || '.EXTRACT_REQUEST_WITH_DATE';
my_return_code VARCHAR2(2);
BEGIN
OPEN x_request_list FOR
SELECT NAME,DESTINATION_TYPE,
SUCCESS_CNT, STATUS, STATUS_DESCRIPTION,
REQUEST_ID, PARENT_REQUEST_ID, DEDUPLICATION_ID, SUBMIT_DATE, LAST_UPDATE_DATE
FROM APP_DB.REQUEST_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID;
OPEN x_destination_list FOR
SELECT REQUEST_ID, DESTINATION_ID
FROM APP_DB.DESTINATION_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID;
OPEN x_command_list FOR
SELECT SEQUENCE_NUMBER, NAME, PARAMS, DESTINATION_ID
SEND_DATE, LAST_UPDATE_DATE,PROCESS_CNT, STATUS, STATUS_DESCRIPTION,
VALIDITY_PERIOD, TO_ABORT_FLAG
FROM APP_DB.REQUEST_DETAILS_TABLE
WHERE SUBMIT_DATE >= ze_from_date
AND SUBMIT_DATE < ze_to_date
ORDER BY REQUEST_ID, DESTINATION_ID, SEQUENCE_NUMBER;
return RETURN_OK;
END EXTRACT_REQUEST_WITH_DATE;
如您所见,我们对所有 3 个查询使用相同的谓词(即 SUBMIT_DATE 条件)。我认为可能有某种方法可以通过获取 REQUEST_ID 然后在其余查询中使用它们来优化它。
谢谢你听我说!