在Oracle中,需要在存储的proc中多次重用查询结果。想知道临时表是推荐的方法还是其他方法...
首先,我基于某些输入参数创建一个结果集。
然后进行一些检查,看是否有任何结果集行显示在表1中。简单的连接和计数就足够了。 如果count> 0,则返回。 如果count == 0,则将结果集中的选定值(基于某些条件)插入表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