ORA-00997:在INSERT INTO ... SELECT语句中非法使用LONG数据类型

时间:2017-10-05 04:55:28

标签: sql oracle sqldatatypes

我正在编写一个存储过程,用于将数据从表插入另一个表。我使用如下语句:

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子句中的“IN_BATCHID”&“IN_LOGID”替换为硬代码3(或任何数字)时,该过程正常。 我在网上搜索并获得了类似的信息。

  

数据类型LONG的值在函数或DISTINCT中使用,   WHERE,CONNECT BY,GROUP BY或ORDER BY子句。只有LONG值   用于SELECT子句。

所以我试图将我的bacthid列从number更改为varchar2(当然还有程序中变量IN_BATCHID的类型),但是抛出了同样的异常。

也许有用的是,对于mytable,TEXT1,TEXT2 ...是VARCHAR2的类型;而table1,表2是SQL SEVER表,table1.field1是int类型,table2.field2是varchar的类型。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,不推荐使用LONG和LONG RAW数据类型。我建议您使用CLOB,BLOB和BFILE。

您可以尝试使用LONG数据类型表格varchar2进行此类转换:

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

你可以在插入语句中使用v_str