我现在有一张表test。
  ID                 NUMBER not null,
  NAME               VARCHAR2(60) not null,
  DESC               VARCHAR2(120),
  ARGUMENT1          VARCHAR2(240),
  ARGUMENT2          VARCHAR2(240),
  ARGUMENT3          VARCHAR2(240),
  ARGUMENT4          VARCHAR2(240),
  ARGUMENT5          VARCHAR2(240),
  ARGUMENT6          VARCHAR2(240),
  ARGUMENT7          VARCHAR2(240),
  ARGUMENT8          VARCHAR2(240),
  ARGUMENT9          VARCHAR2(240),
  ARGUMENT10         VARCHAR2(240),
  STATUS             VARCHAR2(20)我现在要在存储过程中向这张表中插入数据,ID ,name,desc,status这几个字段还能拼出来。但是ARGUMENT要怎么拼呢?
也就是说ARGUMENT的个数 是动态的。给了我几个我就插入几个,如:给了我6个ARGUMENT。我就要得到
insert into test(id,name,desc,status,ARGUMENT1,ARGUMENT2,ARGUMENT3,ARGUMENT4)values('1001','test','test','error','ARGUMENT','ARGUMENT','ARGUMENT','ARGUMENT');
红色部分怎么拼出来呢?

解决方案 »

  1.   

    user_tab_columns 表里可以查出某张表所有的字段,可以根据这张表循环读出字段,拼接SQL
      

  2.   

    我现在是知道这个表中的字段,就是要向这个表中插入数据,拼一个动态的sql。因为我这是在存储过程里实现的。我要根据他调用我的存储过程,给我传了几个参数我就要添几个'ARGUMENT'
      

  3.   

    楼主你说6个,但红色的只有4个啊,怎么回事?
    另外他调你的时候,参数怎么传的?一个参数一个IN参数,还是N个参数作为一个字符串中间用特殊字符隔开只用了一个IN?
      

  4.   

    呵呵,那是个例子,我写错了。一个参数一个in参数。是这样的。值我现在可以得到。就是insert into test(id,name,desc,status,ARGUMENT1,ARGUMENT2,ARGUMENT3,ARGUMENT4)这部分我拼不出来
      

  5.   

    不管是哪种情况,你的存储过程都可以用动态sql来执行实现。
    create。
    as
    v_sql varchar2(4000):='insert into test(id,name,desc,status';
    ...
    begin
       if 有几个参数 then
       for i in 1..几 loop
       v_sql := v_sql||',ARGUMENT'||to_char(i);
       end loop
       v_sql := v_sql||')values('........)';
       execute immediate v_sql;
       ......
    end;
    /
      

  6.   

    以你的例子来说, ARGUMENT 有 10 个字段,但是实际上只给 6 个值,你需要自己给出 4 个ARGUMENT的值,
    那么我们直接写成
    str_sql := 'insert into test values (''1001'',''test'',''test'',''error'', :str_param1,:str_param2...:str_param10)';
    execute immediate str_sql using str_param1, str_param2...str_param10;我们只要给将得到的几个参数赋值给对应的 str_paramX 即可,str_paramX 默认值就随便给一个,不是就行了?
      

  7.   

    v_sql varchar2(4000):='insert into test(id,name,desc,status';
    我的for 是这样的,怎么实现呢?
    for results in myCursor(s_proname)
        loop
        v_sql:=v_sql;
        end loop;
      

  8.   

    如果是一个参数一个in参数,其实我觉得你不用拼啊,因为你不要的那些,在数据库中都会是NULL,那你直接拼的时候插个NULL也没关系啊。把你的存储过程的IN参数值那里加个 default null就好了,下面就一个整的写死的就完了。
    create or ....(arg1 varchar2 default null,.....insert into test(id,name,desc,status,ARGUMENT1,ARGUMENT2,ARGUMENT3,ARGUMENT4,....ARGUMENT10)values('1001','test','test','erro',arg1值,arg2值arg3值);
      

  9.   

    得看下你的 myCursor(p_name)返回得是个啥啊
      

  10.   

    你把myCursor(p_name)的代码贴出来,我帮你写写看
      

  11.   

    我猜的,看看是不是你要的?
    v_sql varchar2(2000):='insert into test(id,name,desc,status';
    v_values varchar2(2000):='values('1001','test','test','error';
    v_no number(2):=1;
    我的for 是这样的,怎么实现呢?for results in myCursor(s_proname)
        loop
        v_sql:=v_sql||',ARGUMENT'||to_char(v_no);
        v_values := v_values||','||results.paramValue;
        v_no :=v_no+1;
        end loop;
    close myCursor;--不知道怎么关这个游标execute immediate v_sql||')'||v_values||')';