正在尝试从Oracle函数获取表。取而代之的是不一致的数据类型
我正在尝试从Oracle中的存储函数返回查询。此简单尝试失败:正在尝试从Oracle函数获取表。取而代之的是不一致的数据类型,oracle,plsql,stored-functions,ora-00932,Oracle,Plsql,Stored Functions,Ora 00932,我正在尝试从Oracle中的存储函数返回查询。此简单尝试失败: CREATE OR REPLACE TYPE GetObjectsForFolderObjectType IS OBJECT ( FOLDER_ID NUMBER(9), OBJECT_ID NUMBER(9) ); CREATE OR REPLACE TYPE GetObjectsForFolderTableType IS TABLE OF GetObjectsForFolderObjectType;
CREATE OR REPLACE TYPE GetObjectsForFolderObjectType IS OBJECT (
FOLDER_ID NUMBER(9), OBJECT_ID NUMBER(9)
);
CREATE OR REPLACE TYPE GetObjectsForFolderTableType IS
TABLE OF GetObjectsForFolderObjectType;
CREATE OR REPLACE FUNCTION GetObjectsForFolder
(FOLDER_ID INTEGER, FOLDER_DATA_TABLE VARCHAR2)
RETURN GetObjectsForFolderTableType IS
THE_RESULT GetObjectsForFolderTableType := GetObjectsForFolderTableType ( );
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM '||FOLDER_DATA_TABLE BULK COLLECT INTO THE_RESULT;
RETURN THE_RESULT;
END;
SELECT * FROM TABLE(GetObjectsForFolder(1, 'MY_TABLE_NAME'));
上述结果是
ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "USERNAME.GETOBJECTSFORFOLDER", line 6
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:
注意:尽管我在示例中屏蔽了一些内容,但ORA-00932行在动态PL/SQL语句中确实显示“expected-get-”,您不能将表列直接批量收集到对象表中。您必须首先将列选择到对象中,然后将对象批量收集到表类型中:
CREATE OR REPLACE TYPE GetObjectsForFolderObjectType IS OBJECT (
FOLDER_ID NUMBER(9), OBJECT_ID NUMBER(9)
);
CREATE OR REPLACE TYPE GetObjectsForFolderTableType IS
TABLE OF GetObjectsForFolderObjectType;
CREATE OR REPLACE FUNCTION GetObjectsForFolder
(FOLDER_ID INTEGER, FOLDER_DATA_TABLE VARCHAR2)
RETURN GetObjectsForFolderTableType IS
THE_RESULT GetObjectsForFolderTableType := GetObjectsForFolderTableType ( );
BEGIN
EXECUTE IMMEDIATE 'SELECT GetObjectsForFolderObjectType(folder_id, object_id) FROM '||FOLDER_DATA_TABLE BULK COLLECT INTO THE_RESULT;
RETURN THE_RESULT;
END;
在动态PL/SQL语句中,不能将表列直接批量收集到对象表中。您必须首先将列选择到对象中,然后将对象批量收集到表类型中:
CREATE OR REPLACE TYPE GetObjectsForFolderObjectType IS OBJECT (
FOLDER_ID NUMBER(9), OBJECT_ID NUMBER(9)
);
CREATE OR REPLACE TYPE GetObjectsForFolderTableType IS
TABLE OF GetObjectsForFolderObjectType;
CREATE OR REPLACE FUNCTION GetObjectsForFolder
(FOLDER_ID INTEGER, FOLDER_DATA_TABLE VARCHAR2)
RETURN GetObjectsForFolderTableType IS
THE_RESULT GetObjectsForFolderTableType := GetObjectsForFolderTableType ( );
BEGIN
EXECUTE IMMEDIATE 'SELECT GetObjectsForFolderObjectType(folder_id, object_id) FROM '||FOLDER_DATA_TABLE BULK COLLECT INTO THE_RESULT;
RETURN THE_RESULT;
END;