2016-07-05 20 views
2

我正在開發一個查詢,返回兩列作爲結果:VARCHAR(256)NUMBER。爲了儲存以備將來使用的查詢結果,我創建了下面的類型:ORA-00932 - 創建定製類型表後不一致的數據類型

-- 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: 

我試過在b定義的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 

在此先感謝。

回答

5

一個對象必須明確構造。將您的測試中的查詢更改爲:

EXECUTE IMMEDIATE 'SELECT tp_some_type(''TEXT'', 1) FROM DUAL' 
+0

工作就像一個魅力。感謝您的準確答案。 –

0

您將轉換隱藏在TP_SOME_TYPE類型的select語句中引用的列。

DECLARE 
    SOME_RESULT TP_SOME_TABLE; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT TP_SOME_TYPE(''TEXT'' , 1) FROM DUAL' 
    BULK COLLECT INTO SOME_RESULT; 
END; 

你仍然能夠訪問此集合像 選擇SOME_TEXT,從表(ur_collection)SOME_NUMBER;