动态INSERT在过程中失败,但作为静态SQL

时间:2017-04-08 19:27:44

标签: oracle plsql insert dynamic-sql execute-immediate

我正在研究一种将数据从大矩阵转换为由三列组成的表的过程。我在向表中动态插入行时遇到了一些困难。当我尝试执行下面的过程块时,我收到错误消息:

ORA-00936: missing expression
ORA-06512: at line 24
00936. 00000 -  "missing expression"

该过程生成一个有效的insert语句,我可以将其复制并作为静态SQL执行。一切达到执行立即stmnt 的工作正常。而且,我有一个完全相同的程序。两者之间只有一个区别。在工作版本中,插入的所有值都是#34; VARCHAR2"类型。我对如何继续排除故障感到茫然。

declare
  type rec_type is record(
    row_name varchar2(250),
    measurement number(30,27)
    );
    my_rec rec_type;

    type cols_type is table of varchar2(10);
    cols cols_type;

    stmnt varchar2(2000);
    cur sys_refcursor;
begin
  select colnames bulk collect into cols from p100_stg1_tmnt_meta;
  for i in cols.first..cols.last loop
    stmnt := 'select site_id, '|| cols(i) ||' from p100_stg1_site_matrix';
    open cur for stmnt;
    loop
      fetch cur into my_rec;
      exit when cur%notfound;
      stmnt := 'insert into p100_stg1_site_measurement (site_id, col_name, measurement) values '||
      '('''||my_rec.row_name ||''', '''||cols(i)||''', '||my_rec.measurement||')';

      --dbms_output.put_line(stmnt);
    execute immediate stmnt;
    end loop;
  end loop;
end;
/

上述过程生成的插入语句示例:

insert into p100_stg1_site_measurement (
     site_id, 
     col_name, 
     measurement
) 
values (
    '5715_C17orf85_S500_RPHS[+80]PEKAFSSNPVVR', 
    'tmnt_2', 
    .0288709682691077
)

环境: Ubuntu 16.04上的SQL Developer Oracle 12c社区版。

1 个答案:

答案 0 :(得分:1)

您应该使用绑定变量,即

line 40, in <module>
    repro_entry.bind("<KEY>", refineRate)

line 1245, in bind
    return self._bind(('bind', self._w), sequence, func, add)

line 1200, in _bind
    self.tk.call(what + (sequence, cmd))

_tkinter.TclError: bad event type or keysym "KEY"