0

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 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の行には「expected--got-」と表示されます。

4

1 に答える 1

3

動的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; 
于 2012-10-05T00:02:47.650 に答える