问题描述
嗨,
我有PL/SQL块下面的writem将表的ROWID填充到中间表tb_load_stats中。
当类型typ_rowid/t_typ_rowid直接用于PL/SQL块时,下面的块工作正常。
但是,当这些类型创建为oracle对象时,其抛出不一致的数据类型错误:
我有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;
专家解答
良好的... 首先
修复此问题后,我们无需重复plsql代码中的定义,只需定义变量即可保存数据。
另外,由于我们的嵌套表是 “typ_rowid” 对象的表,因此我们的光标必须获取这些 * 对象 * 的列表。所以我们把构造函数放在各个colums值周围。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




