Oracle 动态插入在过程中失败,但与静态SQL一样工作
我正在研究一个程序,将数据从一个大矩阵转换成一个由三列组成的表。我在动态地将行插入表中时遇到一些困难。当我尝试执行下面的过程块时,我得到一个错误消息:Oracle 动态插入在过程中失败,但与静态SQL一样工作,oracle,plsql,insert,dynamic-sql,execute-immediate,Oracle,Plsql,Insert,Dynamic Sql,Execute Immediate,我正在研究一个程序,将数据从一个大矩阵转换成一个由三列组成的表。我在动态地将行插入表中时遇到一些困难。当我尝试执行下面的过程块时,我得到一个错误消息: ORA-00936: missing expression ORA-06512: at line 24 00936. 00000 - "missing expression" 该过程生成一个有效的insert语句,我可以将其作为静态SQL复制和执行。执行立即stmnt之前的所有操作都正常工作。此外,我有一个几乎完全相同的过程,可以完美地运行。
ORA-00936: missing expression
ORA-06512: at line 24
00936. 00000 - "missing expression"
该过程生成一个有效的insert语句,我可以将其作为静态SQL复制和执行。执行立即stmnt之前的所有操作都正常工作。此外,我有一个几乎完全相同的过程,可以完美地运行。两者之间只有一个区别。在工作版本中,插入的所有值均为“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语句示例:
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开发人员
Oracle 12c社区版。您应该使用绑定变量,即
stmnt := 'insert into p100_stg1_site_measurement (site_id, col_name, measurement)
values (:site_id, :col, :measurement)';
execute immediate stmnt using my_rec.row_name, cols(i), my_rec.measurement;
这很有魅力,谢谢你的提示。就我个人的理解而言,你(或其他人)知道这种方法,但不知道另一种方法吗?我知道两种方法,但在循环中构造唯一的SQL语句是一种缓存破坏器,正如你所发现的那样,它更容易出错。
my_rec.measurement
在哪里填充?如果为空,您将得到一条语句,其中包含类似于值('X','Y',)