Oracle中

时间:2015-11-03 13:57:15

标签: oracle plsql oracle11g

我有一个使用大型员工表(EMP_medicalplan)

的存储过程

EMP_medicalplan的数据结构 (emp id,SSN,medicalPlan_id,startdate,enddate,companyid等) )

接下来,我们有一个月度报告的临时表 stgreport表结构 (EMPID,月,medicalplan,公司等)

现在我们在stgreport表上使用SSN上的循环处理报告以填充最终报告表。为了验证目前的某些字段,我们多次为每个SSN点击EMP_medicalplantable,如下所示

  1. 光标在每个SSN的登台报告表上
  2. EMP_medicalplan表中特定持续时间的进程计数
  3. 特定公司的EMP_medicalplan表中的流程计数(如果有多家公司可用)
  4. 插入最终报告表
  5. 现在我想使用本地临时表的概念,就像在SQl服务器中一样,一旦循环启动,我将从EMP_medicalplan获取每个SSN的数据,并且每次都不进行表格处理。

    请评论有关查询的更多说明。我提供了基本信息。

2 个答案:

答案 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