Oracle使用临时表或其他方法

Oracle使用临时表或其他方法,oracle,temp-tables,Oracle,Temp Tables,在Oracle中,需要在存储过程中多次重复使用查询结果。想知道临时表格是推荐的方式还是其他方式 首先,我基于某些输入参数创建一个resultset 然后进行一些检查,查看是否有任何结果集行出现在表1中。简单的连接和计数就足够了。 如果计数>0,则返回。 如果count==0,则我将根据某些条件从resultset中插入选定的值到表1中 为了获得最佳性能,应该使用临时表还是其他工具 谢谢,鉴于上次的更新,您似乎需要对多个表进行不同性质的插入,并在多个不同的测试中使用昂贵的查询结果 最好是测试和基准

在Oracle中,需要在存储过程中多次重复使用查询结果。想知道临时表格是推荐的方式还是其他方式

首先,我基于某些输入参数创建一个resultset

然后进行一些检查,查看是否有任何结果集行出现在表1中。简单的连接和计数就足够了。 如果计数>0,则返回。 如果count==0,则我将根据某些条件从resultset中插入选定的值到表1中

为了获得最佳性能,应该使用临时表还是其他工具


谢谢,

鉴于上次的更新,您似乎需要对多个表进行不同性质的插入,并在多个不同的测试中使用昂贵的查询结果

最好是测试和基准测试,比较优点和缺点,以及temp表与其他方法的性能。我将在这里包括另一种样式,它只是将结果拉入内存,在内存中可以根据需要查询结果,或者迭代、计数等

一个例子如下:

-示例数据:

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;
/
但如果它在昂贵的查询中包含任何内容,例如最初同时包含3和6,则不会插入任何内容:

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

谢谢你,考夫曼。再多了解一些信息会很有帮助——在插入表1之后,您是否会继续进一步重新使用查询结果?从所描述的情况来看,它只是一种用途。如果您只是有条件地插入到一个表中,那么可能根本不需要PLSQL,至少插入时不需要PLSQL;有条件的插入或合并可能就足够了。还有,您正在处理多少数据?这是成百上千,还是成百上千万?你试着把它记在记忆里吗?当然,谢谢你的回复。我首先使用的结果集是一个复杂且有点昂贵的查询,因此希望存储结果以比较表1中是否存在数据。这是使用1。如果没有,那么我将从这个结果集中选择行插入表1。这不是有用吗?再次感谢。在此之后,我将进行更多的插入等操作,但在我的过程中不使用此结果集。数据不会超过20行,但获取数据的查询既复杂又昂贵。请让我知道我是否正确地解释了这个问题。再次感谢,谢谢考夫曼。我刚才提到的概念是,可以在一条sql语句中检查匹配项并对insert all应用条件。测试和基准测试始终是最好的方法,但乍一看,我认为临时表是不必要的,尽管它也可以工作,很好地进行基准测试。可以在过程中将它们保存在内存中,也可以只执行条件插入。我将添加这些方法的一些示例,尽管可能还有其他方法。我查看了我的场景,发现我将根据某些条件将数据从resultset插入到2个表中。因此,如果我的结果集中有20行,在确认表1中不存在任何内容后,我将在表1中插入一些内容,并在表2中插入其余内容,以进行更新。作为回应,我从这个答案中删除了第二个例子。谢谢你。。我可能需要一段时间才能理解这一点。。。昂贵的查询类型是OBJECTLOREM_IPSUM NUMBER-假设参数将是昂贵查询的参数。所以如果我的查询返回FirstName,LastName,Salary,我的对象是昂贵的,查询类型是OBJECTfn varchar50,ln varchar50,sal number。如何用我的“昂贵”查询填写V_昂贵结果-从emp中选择fname、lname、salary,其中salary>12000。插入V_昂贵的_结果名称,lname,薪水选择从emp中选择fname,lname,薪水,其中薪水>12000??谢谢@N.Kaufman是的,这种方法中的对象类型将匹配昂贵的_查询头的形状。如果是fname/lname/salary,那么您提供的示例类型定义看起来不错。至于加载,涉及两个部分——选择对象类型和批量收集到表类型中。这里有一个经过提炼的语法选择昂贵的查询类型fname,LNAME,工资批量收集到V_昂贵的结果中。。。参加哪里如果有任何问题或后续行动,请告诉我。我还对与temp table等进行性能比较的后续工作感兴趣。感谢您的帮助和耐心。我仍在努力思考选择对象类型的问题。如果我的查询是Select fname,lname,salary from emp join sal on emp.dept=sal.dept,其中sal.salary>12000,我的批量收集查询是什么?在emp.dept=sal.dept上选择昂贵的查询类型fname、LNAME、工资批量收集到V_昂贵的结果emp join sal,其中sal.SALARY>12000。我收到了吗?谢谢@N.Kaufman提供了这些表格并加入,批量收集看起来不错,尽管通过部门加入emp到sal似乎不寻常。魁北克 ry应将okall-else编译到一边,并可通过从表V\u结果中选择FNAME、LNAME、SAL在以后的选择中使用。谢谢
...PL/SQL procedure successfully completed.
SELECT * FROM TABLE_1;
   LOREM_IPSUM
______________
             3
             6