【问题标题】:ORA-00917: Missing Comma in PLSQLORA-00917: PLSQL 中缺少逗号
【发布时间】:2019-09-12 08:32:15
【问题描述】:

我编写了一个 PL SQL 脚本来将存储在数组中的值添加到临时表中。我使用 Execute immediate 在循环内执行插入查询。

我检查了单引号的数量和逗号的数量,它们是关闭的。不过,我得到了错误代码

ORA-00917:缺少逗号。

declare
   type post_CODS IS VARRAY(34) OF VARCHAR2(20); 
   type locality_ID IS VARRAY(34) OF NUMBER(9); 
   pc post_CODS; 
   Y varchar2(1);
   lid locality_ID; 
   total integer;
begin
   Y := 'Y'; 
   lid := locality_ID(2380,3785,8710,17895,20345,24630,26814,28525,29130,31025,31265,32445,36940,40590,54290,83775,83780,83785,83790,83795,88483,93480,94560,96670,1000524,1000628,1000738,1000857,1000988,1001103,1001466,1001575,1001707,1001744);
   pc := post_CODS(2822,2739,2822,2372,2817,4314,4300,4726,4300,4884,4314,4314,4300,5719,3026,4314,4314,4314,4314,4314,873,2582,2817,4314,5723,5440,2083,2575,873,2372,5440,5440,5715,5440);
   total := lid.count;
   FOR i in 1 .. total LOOP 
      execute immediate 'insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','||Y||',89987,'||sysdate||')';  
   END LOOP; 
END;

这是我遇到的错误

错误报告:

ORA-00917: 缺少逗号 ORA-06512: 在第 14 行 00917. 00000 - “缺少逗号”

我正在使用预言机。

【问题讨论】:

  • 也许你忘了把DECLARE作为第一条语句?
  • 编辑出现问题,对此感到抱歉....
  • 使用to_char(sysdate) 有效吗?
  • '||Y||'

标签: sql oracle


【解决方案1】:

将您的insert 语句包装在q'[]' 中并尝试

execute immediate q'[insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','||Y||',89987,'||sysdate||')]';  

更新

推荐使用bind variable。你可以试试下面的。它对我有用并插入数据。

declare
   type post_CODS IS VARRAY(34) OF NUMBER(20); 
   type locality_ID IS VARRAY(34) OF NUMBER(9); 
   pc post_CODS; 
   Y varchar2(1);
   lid locality_ID; 
   total integer;
begin
   Y := 'Y'; 
   lid := locality_ID(2380,3785,8710,17895,20345,24630,26814,28525,29130,31025,31265,32445,36940,40590,54290,83775,83780,83785,83790,83795,88483,93480,94560,96670,1000524,1000628,1000738,1000857,1000988,1001103,1001466,1001575,1001707,1001744);
   pc := post_CODS(2822,2739,2822,2372,2817,4314,4300,4726,4300,4884,4314,4314,4300,5719,3026,4314,4314,4314,4314,4314,873,2582,2817,4314,5723,5440,2083,2575,873,2372,5440,5440,5715,5440);
   total := lid.count;
   FOR i in 1 .. total LOOP 
      execute immediate q'[insert into tmp_ref_lc_pc_cods values(:var1,:var2,'Y',89987,sysdate)]' using lid(i),pc(i);  
   END LOOP; 
END;

【讨论】:

    【解决方案2】:

    尝试立即执行时的一个好技巧是确保创建的语句格式正确,打印您编写的代码表明 Y 不在撇号内

    insert into tmp_ref_lc_pc_cods values(2380,2822,Y,89987,23-APR-19)
    

    因此,在动态创建代码时,请确保创建的所有字符串都包含正确数量的撇号。

    dbms_output.put_line('insert into tmp_ref_lc_pc_cods values('||lid(i)||','||pc(i)||','''||Y||''',89987,'||sysdate||')');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多