+ -
当前位置:首页 → 问答吧 → Oracle动态执行sql插入表的过程,怎么总是出现错误,可以这样写吗

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;

作者: 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;

作者: 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);】


你这里面有这么多循环,都要干什么,尤其最里面那个?

作者: 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.不是一列啊,exportColumn 是逗号分隔的,很多列啊,传多小列就是多小列,如:taskid,taskname,taskparentid


我的问题就是在游标里,字段值怎样用变量的方式读取出来
c.col1这样当然可以
但我要这样 col1是一个变量,怎么实现,就这个问题
c.变量名,这种形式

作者: yuji821   发布时间: 2011-10-24

可以实现吗

只要能实现,马上就给分

作者: yuji821   发布时间: 2011-10-24

热门下载

更多