ORA-00984:使用sql过程插入时不允许使用此列

时间:2014-12-01 07:23:07

标签: sql oracle stored-procedures plsql

我有一个带有以下结构的表(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;

如果程序中有任何错误,请告诉我 任何帮助表示赞赏!!!

2 个答案:

答案 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

参考绑定