2017-10-05 356 views
0

我正在編寫存儲過程以將數據從表插入另一個表。我用的語句,如:ORA-00997:在INSERT INTO ... SELECT語句中非法使用LONG數據類型

Procedure ImportData(
    IMPORT_DATE_FROM date 
    ,IMPORT_DATE_TO date 
    ,SEQ_ID int 
) 
AS 
INSERT_DAY nvarchar2(10); 
IMPORT_MONTHYEAR nvarchar2(10); 
IMPORT_DATE_FROM_INT NUMBER; 
IMPORT_DATE_TO_INT NUMBER; 
IMPORT_DATE varchar2(20); 
--LOG_ID, BATCH_ID have been of type NUMBER and varchar2 
IN_LOGID mytable.LOG_ID%TYPE; 
IN_BATCHID mytable.BATCH_ID%TYPE; 
BEGIN 

IMPORT_DATE_FROM_INT := to_number(to_char(IMPORT_DATE_FROM, 'j')); 
IMPORT_DATE_TO_INT := to_number(to_char(IMPORT_DATE_TO, 'j')); 

--even assigned it to a nubmer then insert throws exception 
IN_LOGID:=10; 
IN_BATCHID:10; 
    for cur_r in IMPORT_DATE_FROM_INT ..IMPORT_DATE_TO_INT loop 
    IMPORT_DATE := to_char(to_date(cur_r, 'j'), 'yyyy-MM-dd'); 
    INSERT_DAY:=SUBSTR(IMPORT_DATE,9,2); 
    IMPORT_MONTHYEAR:=SUBSTR(IMPORT_DATE,1,7); 
    INSERT INTO mytable 
    (LOGID,BATCHID,TEXT1,TEXT2,TEXT3,...) 
    SELECT 
    (IN_LOGID,IN_BATCHID, table1.field1, table2.field2,....) 
    FROM table1 
    INNER JOIN table2 
    on table1.dayId= 
    CASE 
    WHEN INSERT_DAY='01' THEN table2.day1 
    WHEN INSERT_DAY='02' THEN table2.day2 
    .... 
    WHEN INSERT_DAY='31' THEN table2.day31 
    END 
    INNER JOIN table3 
    ..... 
    END LOOP; 

這個問題似乎是在(LOGID & BATCHID),因爲當我在SELECT子句中的硬編碼3(或任何數字)在替換「IN_BATCHID」 &「IN_LOGID」,然後該過程正常工作。 我在網上搜索並獲取信息。

在函數或在DISTINCT使用數據類型long的值, WHERE,CONNECT BY,GROUP BY,或ORDER BY子句。一個LONG值只能在SELECT子句中使用 。

所以我想我的bacthid列從數更改爲VARCHAR2(當然在程序中的變量IN_BATCHID的類型),但同樣的異常被拋出。

對於mytable,TEXT1,TEXT2 ...是VARCHAR2類型也可能是有用的;而table1,table 2是SQL SEVER的表,而table1.field1是int的類型,table2.field2是varchar的類型。

任何幫助將不勝感激。

+1

爲什麼你首先使用'LONG'?這在20年前已經被棄用了。使用'CLOB'而不是 –

+0

我首先使用NUMBER,而mytable不包含任何類型的字段long ... – metallic

+1

您的錯誤說明它!要麼這不是拋出錯誤的代碼,或者你錯過了某些東西。你確定這些文本字段('TEXT1'等)不是LONG嗎? –

回答

0

首先,不推薦使用LONG和LONG RAW數據類型。我建議你改用CLOB,BLOB和BFILE。

您可以嘗試了很長的數據類型形式VARCHAR2這樣的轉換:

declare 
v_str varchar(4000); 
v_lraw long raw; 
begin 
v_str := utl_raw.cast_to_varchar2(v_lraw); 
... 

,你可以,你這個v_str在你的INSERT語句。

+0

感謝您的回覆。我試圖將LOGID更改爲BLOB,但它作爲數據類型的無效更改失敗。對於轉換,我嘗試了tochar/to_number函數來確保插入正確的類型,但沒有運氣。 – metallic

+0

@metallic不客氣。在將數據類型更改爲BLOB時它會發出什麼警告? –