我正在编写存储过程以将数据从表插入另一个表。我用的语句,如: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的类型。
任何帮助将不胜感激。
为什么你首先使用'LONG'?这在20年前已经被弃用了。使用'CLOB'而不是 –
我首先使用NUMBER,而mytable不包含任何类型的字段long ... – metallic
您的错误说明它!要么这不是抛出错误的代码,或者你错过了某些东西。你确定这些文本字段('TEXT1'等)不是LONG吗? –