我有一个带有以下结构的表(my_routine)
Name Null Type
MY_ID NOT NULL NUMBER(10)
TEMPLATE_NAME NOT NULL VARCHAR2(255)
TEMPLATE_ID NOT NULL NUMBER(10)
ASSIGN_FL NOT NULL CHAR(1)
SYSTEM_FL CHAR(1)
DELETE_FL NOT NULL CHAR(1)
VERSION_ID NOT NULL NUMBER(10)
P_ID NOT NULL NUMBER(10)
我尝试根据另一个表的输出将数据插入到此表中。所以我编写了一个执行任务的过程,但是在将值插入表时我遇到了问题。
我收到以下错误
ORA-00984: column not allowed here
ORA-06512: at line 21
00984. 00000 - "column not allowed here"
以下是我为执行插入任务而编写的程序
DECLARE RCOUNT NUMBER(10);
I NUMBER(10);
BEGIN
SELECT COUNT(TEMPLATE_ID) INTO RCOUNT FROM MY_TEMPLATE WHERE %SOME_CONDITION%;
I := 1;
WHILE I <= RCOUNT LOOP
DECLARE TEMPLATEID NUMBER(10);
MYNAME VARCHAR(100);
BEGIN
--CTEID := 10;
--CTENAME := 'QWER';
SELECT TEMPLATE_ID INTO TEMPLATEID FROM MY_TEMPLATE WHERE ID = I;
SELECT MY_NAME INTO MYNAME FROM MY_TEMPLATE WHERE ID = I;
DBMS_OUTPUT.PUT_LINE(I || TEMPLATEID || MYNAME);
EXECUTE IMMEDIATE 'INSERT INTO MY_ROUTINE VALUES(I,MYNAME,TEMPLATEID,N,N,N,1,1)';
I := I + 1;
END;
END LOOP;
END;
如果程序中有任何错误,请告诉我 任何帮助表示赞赏!!!
答案 0 :(得分:2)
这里不需要使用execute immediate,使用常规语句并直接使用变量:
insert into my_routing
values (I,MYNAME,TEMPLATEID, 'N','N','N',1,1);
顺便说一下:总是在insert语句中声明列是一种很好的编码风格:
insert into my_routine
(my_id, template_id, name, assign_fl, system_fl, delete_fl, version-id, p_id)
values
(I,MYNAME,TEMPLATEID, 'N','N','N',1,1);
但是你根本不需要缓慢而低效的PL / SQL循环。你想做什么,可以在没有PL / SQL的情况下完成:
insert into my_routine (my_id, template_id, name, assign_fl, system_fl, delete_fl, version-id, p_id)
select id, template_id, my_name, 'N','N','N',1,1
from my_template
where %some_condition%
答案 1 :(得分:0)
您也可以使用绑定变量(如果需要立即执行),如下所示
EXECUTE IMMEDIATE 'INSERT INTO MY_ROUTINE VALUES(I,:MYNAME,:TEMPLATEID,N,N,N,1,1)' using MYNAME,TEMPLATEID
请在运行时http://www.dba-oracle.com/t_oracle_execute_immediate.htm
参考绑定