alter table test ADD CONSTRAINT  test_key PRIMARY KEY(key1,key2,key3,.....)key1,key2,key3,.....的取得方法是
  SELECT COLUMN_NAME
   FROM USER_IND_COLUMNS
  WHERE INDEX_NAME = 'test_key'明白的达人 给我说说这个动态能不能实现?如何实现?

解决方案 »

  1.   

    declare 
    strSql varchar2(100);
    begin
         strSql:='alter table test add constraint test_key primary key(key1,key2,key3)';
         execute immediate strSql;
    end;
      

  2.   


    不好意思着急啊以下文字描述:
    向表test增加PRIMARY KEY(列1,列2,.....列n),但是列名和有几个列是动态的,需要从USER_IND_COLUMNS 这个view中取出来。要实现的语句:alter table test ADD CONSTRAINT  test_key PRIMARY KEY(col1,col2,col3,.....coln) col1,col2,col3,.....coln的取得方法是 
      SELECT COLUMN_NAME 
      FROM USER_IND_COLUMNS 
      WHERE INDEX_NAME = 'test_key' 难道还没说明白?
      

  3.   

    key1,key2,key3 是未知的,而且有几个也不一定
      

  4.   

    oracle10g测试通过试试吧
    declare
      strTmp varchar2(4000);
      strSql varchar2(100);
    begin
      select wmsys.wm_concat(column_name)
        into strTmp
        from (SELECT column_name, 1 a
                FROM USER_IND_COLUMNS
               where index_name = upper('test_key'))
       group by a;
      strSql := 'alter table test add constraint test_key primary key(' || strTmp || ')';
      execute immediate strSql;
    end;
    这样以后你要注意的就是以后再建立constraint时候不要和这个test_key
    重复,如果想要一模一样的test_key名必须drop后重新建立
      

  5.   

    把SELECT COLUMN_NAME 
      FROM USER_IND_COLUMNS 
      WHERE INDEX_NAME = 'test_key'
    取到的存一个字符串里就行了 。 
      

  6.   

    LZ的意思是联合主键,索引里有好几个列,这就必须用游标:declare
    cursor aaa is SELECT COLUMN_NAME FROM USER_IND_COLUMNS
    WHERE INDEX_NAME = 'TEST_KEY';  --大写
    v_in varchar2(100);
    begin
    for rec in aaa loop
    v_in:=v_in||rec.COLUMN_NAME||',';
    end loop;
    v_in:=substr(v_in,1,LENGTH(v_in)-1);
    execute immediate 'alter table test add constraint xxx primary key('||v_in||')';
    end;
    /
      

  7.   


    declare
    cursor aaa is SELECT COLUMN_NAME FROM USER_IND_COLUMNS
    WHERE INDEX_NAME = 'TEST_KEY';
    v_in varchar2(100);
    begin
    for rec in aaa loop
    v_in:=v_in||rec.COLUMN_NAME||',';
    end loop;
    v_in:=substr(v_in,1,LENGTH(v_in)-1);
    execute immediate 'alter table test add constraint xxx primary key('||v_in||')';
    end;
    /
      

  8.   

    6L的方法简单,以前还不知道wmsys.wm_concat这个函数。
      

  9.   

    我的数据库是 9I的啊 wmsys.wm_concat 这个方法 在9I能好用么?
      

  10.   

    这样写就哦了
    declare
      strTmp  varchar2(4000);
      strTmp1 varchar2(4000);
      cursor curTest is
        SELECT column_name a
          FROM USER_IND_COLUMNS
         where index_name = upper('test_key');
      strSql varchar2(100);
    begin
      open curTest;
      loop
        fetch curTest
          into strTmp1;
        exit when curTest%notfound;
        strTmp := strTmp || strTmp1 || ',';
      end loop;
      close curTest;
      strTmp := substr(strtmp, 1, length(strtmp) - 1);
      dbms_output.put_line(strtmp);
      strSql := 'alter table test add constraint test_key primary key(' || strTmp || ')';
      execute immediate strSql;
    end;