Oracle动态执行sql插入表的过程,怎么总是出现错误,可以这样写吗
时间:2011-10-24
来源:互联网
create or replace procedure export_data_fromTempData(tableName varchar2, --表名
exportColumn varchar2, --列名
sequenceName varchar2, --序列名
columnsCount number) --列数
is
v_sql varchar2(4000);
v_strsql varchar2(4000);
v_col varchar2(100);
v_sequenceVal number;
v_values varchar2(4000) := '';
cursor curTemp is
select * from nk_excel_data;
begin
v_sql := 'insert into ' || tableName || ' (' || exportColumn ||
') values(';
for c in curTemp loop
select sequenceName.nextval into v_sequenceVal from dual; --这里怎么写,这样写肯定是错误的 sequenceName是个变量,不同的表是不一样的,不能写死
v_values := v_sequenceVal || ',';
begin
for d in 1 .. columnsCount loop
v_col := 'c.col' || d || ','; --这里怎么写呢,我是动态列名c.col+个整数
v_values := v_values || v_col;
end loop;
v_strsql := v_strsql || v_values;
v_values := '';
end;
v_strsql := substr(v_strsql, 1, length(v_strsql) - 1) || ')';
execute immediate v_strsql;
end loop;
commit;
end;
exportColumn varchar2, --列名
sequenceName varchar2, --序列名
columnsCount number) --列数
is
v_sql varchar2(4000);
v_strsql varchar2(4000);
v_col varchar2(100);
v_sequenceVal number;
v_values varchar2(4000) := '';
cursor curTemp is
select * from nk_excel_data;
begin
v_sql := 'insert into ' || tableName || ' (' || exportColumn ||
') values(';
for c in curTemp loop
select sequenceName.nextval into v_sequenceVal from dual; --这里怎么写,这样写肯定是错误的 sequenceName是个变量,不同的表是不一样的,不能写死
v_values := v_sequenceVal || ',';
begin
for d in 1 .. columnsCount loop
v_col := 'c.col' || d || ','; --这里怎么写呢,我是动态列名c.col+个整数
v_values := v_values || v_col;
end loop;
v_strsql := v_strsql || v_values;
v_values := '';
end;
v_strsql := substr(v_strsql, 1, length(v_strsql) - 1) || ')';
execute immediate v_strsql;
end loop;
commit;
end;
作者: yuji821 发布时间: 2011-10-24
第一个问题我已经解决了,是这样的
create or replace procedure export_data_fromTempData(tableName varchar2, --表名
exportColumn varchar2, --列名
sequenceName varchar2, --序列名
columnsCount number) --列数
is
v_sql varchar2(4000);
v_strsql varchar2(4000);
v_col varchar2(100);
v_sequenceVal number;
v_values varchar2(4000) := '';
cursor curTemp is
select * from nk_excel_data;
begin
v_sql := 'insert into ' || tableName || ' (' || exportColumn ||
') values(';
for c in curTemp loop
execute immediate 'select '|| sequenceName||'.nextval from dual' into v_sequenceVal; --这样写就可以了
v_values := v_sequenceVal || ',';
v_strsql := v_sql;
begin
for d in 1 .. columnsCount loop
v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...,有什么办法吗
v_values := v_values || v_col;
end loop;
v_strsql := v_strsql || v_values;
v_values := '';
end;
v_strsql := substr(v_strsql, 1, length(v_strsql) - 1) || ')';
--dbms_output.put_line (v_strsql);
execute immediate v_strsql;
end loop;
commit;
end;
create or replace procedure export_data_fromTempData(tableName varchar2, --表名
exportColumn varchar2, --列名
sequenceName varchar2, --序列名
columnsCount number) --列数
is
v_sql varchar2(4000);
v_strsql varchar2(4000);
v_col varchar2(100);
v_sequenceVal number;
v_values varchar2(4000) := '';
cursor curTemp is
select * from nk_excel_data;
begin
v_sql := 'insert into ' || tableName || ' (' || exportColumn ||
') values(';
for c in curTemp loop
execute immediate 'select '|| sequenceName||'.nextval from dual' into v_sequenceVal; --这样写就可以了
v_values := v_sequenceVal || ',';
v_strsql := v_sql;
begin
for d in 1 .. columnsCount loop
v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...,有什么办法吗
v_values := v_values || v_col;
end loop;
v_strsql := v_strsql || v_values;
v_values := '';
end;
v_strsql := substr(v_strsql, 1, length(v_strsql) - 1) || ')';
--dbms_output.put_line (v_strsql);
execute immediate v_strsql;
end loop;
commit;
end;
作者: yuji821 发布时间: 2011-10-24
1.v_sql := 'insert into ' || tableName || ' (' || exportColumn || ') values(';
这里只有一列exportColumn,
2.v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...
这么多都当成是value,就形成sql就不正确了【dbms_output.put_line (v_strsql);】
你这里面有这么多循环,都要干什么,尤其最里面那个?
这里只有一列exportColumn,
2.v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...
这么多都当成是value,就形成sql就不正确了【dbms_output.put_line (v_strsql);】
你这里面有这么多循环,都要干什么,尤其最里面那个?
作者: anjiushian 发布时间: 2011-10-24
茫然路过
作者: lkz2004 发布时间: 2011-10-24
引用 2 楼 anjiushian 的回复:
1.v_sql := 'insert into ' || tableName || ' (' || exportColumn || ') values(';
这里只有一列exportColumn,
2.v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...
这么多都当成是value,就形成sql就不正确了【dbms_……
1.v_sql := 'insert into ' || tableName || ' (' || exportColumn || ') values(';
这里只有一列exportColumn,
2.v_col := 'c.col' || d || ','; --这里怎么解决呢,我是动态构造的col1,col2,col3...
这么多都当成是value,就形成sql就不正确了【dbms_……
1.不是一列啊,exportColumn 是逗号分隔的,很多列啊,传多小列就是多小列,如:taskid,taskname,taskparentid
我的问题就是在游标里,字段值怎样用变量的方式读取出来
c.col1这样当然可以
但我要这样 col1是一个变量,怎么实现,就这个问题
c.变量名,这种形式
作者: yuji821 发布时间: 2011-10-24
可以实现吗
只要能实现,马上就给分
只要能实现,马上就给分
作者: yuji821 发布时间: 2011-10-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28