暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 数据库类型与PL/SQL类型的批量收集

askTom 2017-07-05
258

问题描述

嗨,

我有PL/SQL块下面的writem将表的ROWID填充到中间表tb_load_stats中。

当类型typ_rowid/t_typ_rowid直接用于PL/SQL块时,下面的块工作正常。

但是,当这些类型创建为oracle对象时,其抛出不一致的数据类型错误:

            CREATE OR REPLACE TYPE typ_rowid IS record (
            TABLE_NAME VARCHAR2(100),
            COL_VALUE NUMBER(38),
            ROW_ID VARCHAR2(100)
            );

           

            CREATE OR REPLACE TYPE t_typ_rowid IS TABLE OF TYP_rowid;

 

Can you please help to understand this?

How to used Oracle types in below case instead of PL/SQL type?

           

create table tb_load_stats
(
TABLE_NAME    VARCHAR2(30 CHAR),
COL_VALUE     NUMBER(38),
ROW_ID        VARCHAR2(30 CHAR)
)
/

 

DECLARE
            TYPE typ_rowid IS record (
            TABLE_NAME VARCHAR2(100),
            COL_VALUE NUMBER(38),
            ROW_ID VARCHAR2(100)
            );
          

            TYPE t_typ_rowid IS TABLE OF TYP_rowid;
         
            tb_col_rowid           t_typ_rowid := t_typ_rowid();
 
            TYPE r_cursor IS REF CURSOR;
            c_cur_var r_cursor;
BEGIN
     OPEN c_cur_var FOR SELECT /*+ PARALLEL(ORDER_HISTORY, 2) */ 'ORDER_HISTORY', ORDER_ID, ROWID FROM ORDER_HISTORY WHERE posting_dt <= TO_DATE('01/01/2008', 'MM/DD/YYYY');

     LOOP

         FETCH c_cur_var BULK COLLECT INTO tb_col_rowid LIMIT 5000;
                       EXIT WHEN tb_col_rowid.COUNT = 0;
                        FORALL i IN tb_col_rowid.FIRST .. tb_col_rowid.LAST
             INSERT INTO tb_load_stats VALUES (tb_col_rowid(i).table_name, tb_col_rowid(i).col_value, tb_col_rowid(i).row_id);
    
                         tb_col_rowid.DELETE;
     END LOOP;
     CLOSE c_cur_var;
END;


专家解答

良好的... 首先

SQL>  CREATE OR REPLACE TYPE typ_rowid IS record (
  2              TABLE_NAME VARCHAR2(100),
  3              COL_VALUE NUMBER(38),
  4              ROW_ID VARCHAR2(100)
  5              );
  6  /

Warning: Type created with compilation errors.


修复此问题后,我们无需重复plsql代码中的定义,只需定义变量即可保存数据。

另外,由于我们的嵌套表是 “typ_rowid” 对象的表,因此我们的光标必须获取这些 * 对象 * 的列表。所以我们把构造函数放在各个colums值周围。

SQL>  CREATE OR REPLACE TYPE typ_rowid IS object (
  2              TABLE_NAME VARCHAR2(100),
  3              COL_VALUE NUMBER(38),
  4              ROW_ID VARCHAR2(100)
  5              );
  6  /

Type created.

SQL>
SQL>
SQL>             CREATE OR REPLACE TYPE t_typ_rowid IS TABLE OF TYP_rowid;
  2  /

Type created.

SQL>
SQL> create table tb_load_stats
  2  (
  3  TABLE_NAME    VARCHAR2(30 CHAR),
  4  COL_VALUE     NUMBER(38),
  5  ROW_ID        VARCHAR2(30 CHAR)
  6  )
  7  /

Table created.

SQL> DECLARE
  2              tb_col_rowid           t_typ_rowid := t_typ_rowid();
  3
  4              TYPE r_cursor IS REF CURSOR;
  5              c_cur_var r_cursor;
  6  BEGIN
  7       OPEN c_cur_var FOR SELECT typ_rowid('ORDER_HISTORY', object_id, ROWID) FROM t WHERE rownum <= 100;
  8
  9       LOOP
 10
 11           FETCH c_cur_var BULK COLLECT INTO tb_col_rowid LIMIT 5000;
 12                         EXIT WHEN tb_col_rowid.COUNT = 0;
 13                          FORALL i IN tb_col_rowid.FIRST .. tb_col_rowid.LAST
 14               INSERT INTO tb_load_stats VALUES (tb_col_rowid(i).table_name, tb_col_rowid(i).col_value, tb_col_rowid(i).row_id);
 15
 16                           tb_col_rowid.DELETE;
 17       END LOOP;
 18       CLOSE c_cur_var;
 19  END;
 20  /

PL/SQL procedure successfully completed.



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论