我有一个使用大型员工表(EMP_medicalplan)
的存储过程EMP_medicalplan的数据结构 (emp id,SSN,medicalPlan_id,startdate,enddate,companyid等) )
接下来,我们有一个月度报告的临时表 stgreport表结构 (EMPID,月,medicalplan,公司等)
现在我们在stgreport表上使用SSN上的循环处理报告以填充最终报告表。为了验证目前的某些字段,我们多次为每个SSN点击EMP_medicalplantable,如下所示
现在我想使用本地临时表的概念,就像在SQl服务器中一样,一旦循环启动,我将从EMP_medicalplan获取每个SSN的数据,并且每次都不进行表格处理。
请评论有关查询的更多说明。我提供了基本信息。
答案 0 :(得分:0)
我的建议是使用物化视图,它将保留来自EMP_medicalplantable的复制数据。 尝试在下一步之前安排MV刷新。通过这种方式,您的主表不会受到太多影响,您不会每次都查询主表。 并且正如所建议的那样,一旦执行了这些步骤,您就可以进行BULK COLLECT而不是逐行LOOP处理。 如果这有帮助,请告诉我。
答案 1 :(得分:0)
填写表类型后,可以在SQL TABLE()函数的查询中使用它。然而,更好的方法是在其上创建自己的索引。 假设每个SSN只有一条记录,并且两个SSN列都称为“SSN”:
DECLARE
TYPE ssn_table_type IS TABLE OF ssn_cursor
INDEX BY BINARY_INTEGER;
my_ssn_table ssn_table_type;
TYPE ssn_index_type IS TABLE OF BINARY_INTEGER
INDEX BY VARCHAR2( 20 );
my_ssn_index ssn_index_type;
my_ssn_record ssn_cursor%ROWTYPE;
my_rec_index BINARY_INTEGER;
BEGIN
OPEN ssn_cursor;
FETCH ssn_cursor BULK COLLECT INTO my_ssn_table;
CLOSE ssn_cursor;
FOR idx IN my_ssn_table.FIRST .. my_ssn_table.LAST
LOOP
my_ssn_index( my_ssn_table( idx ).ssn ) := idx;
END LOOP;
FOR rec_todo IN c_todo
LOOP
my_rec_index := my_ssn_index( rec_todo.ssn );
my_ssn_record := my_ssn_table( my_rec_index );
-- Do something useful....
END LOOP;
END;
/
顺便说一下,您是否考虑过在填充临时表时使用分析函数实现第2点和第3点的可能性?填充登台表时可以检索的越多越好。类似的东西:
count(1) over ( partition by company_id ) AS company_count