Oracle使用临时表或其他方法

时间:2019-05-13 21:29:25

标签: oracle temp-tables

在Oracle中,需要在存储的proc中多次重用查询结果。想知道临时表是推荐的方法还是其他方法...

首先,我基于某些输入参数创建一个结果集。

然后进行一些检查,看是否有任何结果集行显示在表1中。简单的连接和计数就足够了。 如果count> 0,则返回。 如果count == 0,则将结果集中的选定值(基于某些条件)插入表1。

是否应该使用临时表或其他一些以获得最佳性能?

谢谢

1 个答案:

答案 0 :(得分:1)

根据最近的更新,您似乎需要在多个表中进行本质上不同的插入,并在多个(不同的)测试中使用昂贵的查询结果。

总是最好进行测试和基准测试(比较临时表和其他方法的优缺点)。我将在此处包括另一种样式,该样式仅将结果拉入内存,可以根据需要查询结果(或迭代,计数等)

下面是一个示例:

-示例数据:

CREATE TABLE TABLE_1 (LOREM_IPSUM NUMBER);
INSERT INTO TABLE_1 VALUES (6);
COMMIT;

-用于保存数据的自定义类型

CREATE OR REPLACE TYPE EXPENSIVE_QUERY_TYPE IS OBJECT(LOREM_IPSUM NUMBER);
/
CREATE OR REPLACE TYPE EXPENSIVE_QUERY_RESULT IS TABLE OF EXPENSIVE_QUERY_TYPE;
/

-示例块:

DECLARE
    V_EXPENSIVE_RESULT EXPENSIVE_QUERY_RESULT := EXPENSIVE_QUERY_RESULT();
    V_TABLE_1_TEST INTEGER;
BEGIN
    SELECT EXPENSIVE_QUERY_TYPE(LEVEL)
    BULK COLLECT INTO V_EXPENSIVE_RESULT
    FROM DUAL
    CONNECT BY LEVEL <= 5;

    SELECT COUNT(*) INTO V_TABLE_1_TEST
        FROM TABLE_1
            WHERE EXISTS(SELECT 1 FROM TABLE(V_EXPENSIVE_RESULT) WHERE LOREM_IPSUM = TABLE_1.LOREM_IPSUM);

    IF V_TABLE_1_TEST > 0
        THEN
        RETURN;
        ELSE
        INSERT INTO TABLE_1
            SELECT LOREM_IPSUM FROM TABLE(V_EXPENSIVE_RESULT)
            WHERE MOD(LOREM_IPSUM,2) = 0;
    END IF;

END;
/

当TABLE_1最初只有一个值为6的记录时,它将插入2和4(因为没有共享数据)。

...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
   LOREM_IPSUM
______________
             2
             4
             6

但是,如果在昂贵查询中包含任何内容(例如最初包含3和6),则不会插入任何内容:

...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
   LOREM_IPSUM
______________
             3
             6