我正在为将数据从表插入到另一个表的存储过程编写代码。我使用的语句如下:
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的值用于函数或不同的、其中、CONNECT BY、GROUP或ORDER子句中。长值只能在SELECT子句中使用。
因此,我尝试将bacthid列从number更改为varchar2 (当然还有过程中变量IN_BATCHID的类型),但是抛出了相同的异常。
对于mytable、TEXT1、TEXT2...are类型的VARCHAR2,可能也很有用;而table1,表2是表1的表和表1的表,字段1是int的类型,表2是varchar的类型。
任何帮助都将不胜感激。
发布于 2017-10-05 05:41:20
首先,不推荐长数据和长原始数据类型。我建议您使用CLOB、BLOB和BFILE。
对于长数据类型表单varchar2,您可以尝试这样的转换:
declare
v_str varchar(4000);
v_lraw long raw;
begin
v_str := utl_raw.cast_to_varchar2(v_lraw);
... 您可以在insert语句中使用这个v_str。
https://stackoverflow.com/questions/46578105
复制相似问题