我正在开发一个返回两列结果的查询:VARCHAR(256)
和NUMBER
。为了存储查询结果以供将来使用,我创建了以下类型:
-- An object representing each of the records of my query
create or replace TYPE TP_SOME_TYPE IS OBJECT(
SOME_TEXT VARCHAR2(256),
SOME_NUMBER NUMBER
);
-- A table of the objects created above:
create or replace TYPE TP_SOME_TABLE AS TABLE OF TP_SOME_TYPE;
最后,我运行了一个示例SQL
,尝试在TP_SOME_TABLE
类型的变量中收集结果:
DECLARE
SOME_RESULT TP_SOME_TABLE;
BEGIN
EXECUTE IMMEDIATE 'SELECT ''TEXT'' AS SOME_TEXT, 1 AS SOME_NUMBER FROM DUAL'
BULK COLLECT INTO SOME_RESULT;
END;
并收到以下错误消息:
ORA-00932: tipos de dados inconsistentes: esperava - obteve -
ORA-06512: em line 4
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
我尝试使用相同的字段在我的函数体上定义RECORD TYPE
而不是OBJECT TYPE
,但不幸的是,因为我要揭露收集的内容导致TABLE()
调用,我必须使用像OBJECT
这样的数据库级别。
任何使当前结构有效的想法?
我的数据库设置:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
提前致谢。
答案 0 :(得分:5)
必须显式构造对象。将测试中的查询更改为:
EXECUTE IMMEDIATE 'SELECT tp_some_type(''TEXT'', 1) FROM DUAL'
答案 1 :(得分:0)
您要转换隐藏在TP_SOME_TYPE类型的select语句中引用的列。
Tue Jul 05 2016 02:46:43 PM
你仍然可以像访问这个集合一样 从表(ur_collection)中选择SOME_TEXT,SOME_NUMBER;