1

我在编写 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 然后在其余查询中使用它们来优化它。

谢谢你听我说!

4

2 回答 2

0

根据您发布的查询,我只需将SUBMIT_DATE索引添加到REQUEST_TABLEDESTINATION_TABLE然后保持REQUEST_DETAILS_TABLE您的 SQL 不变。所有三个查询都将得到优化,运行速度与匹配值表一样快REQUEST_ID

于 2013-03-01T18:54:02.587 回答
0

所以......我发现这种方法似乎足够有效:

首先,定义全局类型以用作数组。这是代码:

对象(记录)类型:

create or replace 
TYPE "GENERIC_ID" IS OBJECT(ID VARCHAR2(64));

GENERIC_ID 的可变大小数组

create or replace 
TYPE "GENERIC_ID_ARRAY" IS TABLE OF "GENERIC_ID";

然后,通过 FOR LOOP 中的 extend() 完成填充。生成的数组可以用作 SQL 请求中的表,使用:

TABLE(CAST(my_array_of_ids AS GENERIC_ID_ARRAY)

谢谢,

于 2013-03-13T15:29:54.520 回答