【发布时间】:2019-02-26 21:57:52
【问题描述】:
我使用的是 Oracle 12.1 我认为我可以查询 12c 中的表类型。当我尝试执行此包时出现错误 ORA-00902: invalid datatype。 我什至尝试使用 cast multiset,但仍然出现同样的错误。
我知道我们可以在数据库级别创建对象然后查询,但我不想这样做。
CREATE OR REPLACE PACKAGE test123 AS
TYPE typ1 IS RECORD(col1 VARCHAR2(100),col2 VARCHAR2(100));
TYPE tab_typ IS TABLE OF typ1 INDEX BY BINARY_INTEGER;
v_tab tab_typ;
PROCEDURE p1;
END;
/
CREATE OR REPLACE PACKAGE BODY test123 AS
PROCEDURE p1 IS
BEGIN
SELECT c1,c2 BULK COLLECT INTO v_tab FROM tabx;
INSERT INTO taby
SELECT * FROM TABLE(v_tab);
END;
END;
/
EXEC test123.p1;
--ORA-00902: invalid datatype
【问题讨论】:
-
“我知道我们可以在数据库级别创建对象然后查询,但我不想这样做。” - 为什么不呢?此外,如果您只需要执行一个简单的
insert into taby(col1,col2) select c1,c2 from tabx,那么需要收集什么? -
不幸的是,为了以您尝试的方式从集合中进行选择,需要在数据库级别定义它。您不能在 SQL 语句中使用本地定义的集合类型。只要您从该包中删除您的类型,而是执行
create or replace type typ1 as object (col1 varchar2(100), col2 varchar2(100));和create or replace type tab_type as table of typ1;,您的程序就会起作用。在这里查看我的答案:stackoverflow.com/questions/44683875/… -
您的表
taby中有多少列。如果有超过 2 列或这两列的数据类型与varchar2不同,则可能会出现问题。但是,假设您的代码中的所有内容都完好无损,它应该可以正常工作,就像在Oracle 12c R1中查询 plsql 块范围内的类型是非常允许的。再次检查数据库的版本。阅读链接以供参考livesql.oracle.com/apex/livesql/file/… -
@XING 感谢及时回复。是的,表中的数据类型:taby 是varchar2 与记录类型相同。你可以自己试试看有没有报错。
-
@RajA 我已经分享了链接,该链接显示在 PLSQL 范围内声明的
Type可以在块中的SQL语句中使用。你能运行这个语句并与我们分享输出吗Select * from v$version;。