有这样一张表:
表名  字段名  字段类型
表1   字段名1  varchar2
表1   字段名2  varchar2
表1   字段名3  varchar2
表1   字段名4  varchar2
表2   字段名1  varchar2
表2   字段名2  varchar2
表2   字段名3  varchar2
表2   字段名4  varchar2
表2   字段名5  varchar2
表3   字段名1  varchar2
表3   字段名2  varchar2要求:根据这个如何自动生成创建表语法 可以OUT_PUT出来就可以,不要求,执行。动态组合下面这个语法批量生成创建表语法
思路:
create table tablename  --表名 依次取出
(
c1 vc2,            --字段名|| 数据类型||','
c2 vc2,            --字段名|| 数据类型||','
c3 vc2,            --字段名|| 数据类型||','
c4 vc2             --难点在这里,只能依次取出也加逗号的
)
如何让游标定位到最后这一行?
我的思路是给每个 字段加一列 不重复标示。
通过计算 从第一个字段开始到最后一个字段结束的数字+1 作为所有字段的个数。
可以取到 MIN 字段ID MAX 字段ID 
MAX-MIN+1 就是所有字段个数。
FOR 就在这个数字之间循环取数据了。
MAX ID 就可以定位到最后一个字段的位置 update replace 替换掉那个逗号。
整个过程完成,然后LOOP。
哎,说不清了。
麻烦高手给出一下完整代码。最好自己测试过的。能完成这个题目的。
只写部分代码,或者思路的,暂时蹭不到分 呵呵。

解决方案 »

  1.   

    补充一下。表名是动态,字段名也是动态。另外我加的那个 有MINID MAXID 的表 结构如下:    TABID 表名 数据项个数 TABMAXID TABMINID
    1 4831 T_CZ_ZYSB_SBJBXX_TEMP 22 4852 4831
    2 1283 T_CY_KS_SRZSK_TEMP 21 1303 1283
    3 2984 T_JX_XMGC_XMJDQKXX_XMZTBJD 20 3003 2984
    4 2220 T_DY_XZCF_XZCFZXXX_TEMP 18 2237 2220
    5 2140 T_DY_XZCF_XZCFDCQZXX_XZCFXWJBLXX 18 2157 2140
    6 876 T_CB_DJXX_DYQDJ_TEMP 16 891 876
      

  2.   

    用substr、index截取,然后用动态sql拼接起来,execute immediate动态方式执行sql即可。
      

  3.   

    create table TEST_A(
      ID               VARCHAR2(36) not null,
      表名             VARCHAR2(100),
      表名中文含义     VARCHAR2(100),
      数据项编码       VARCHAR2(100),
      国标数据项编号   VARCHAR2(20),
      数据项名称       VARCHAR2(200),
      数据项定义       VARCHAR2(1000),
      数据项类型       VARCHAR2(100),
      数据格式         VARCHAR2(200),
      引用标准         VARCHAR2(500),
      备注说明         VARCHAR2(200),
      数据项类型编码   VARCHAR2(100),
      数据项编码分隔符 VARCHAR2(36) default ','
    );create table TEST_B
    (
      TABID      VARCHAR2(36),
      表名       VARCHAR2(100),
      数据项个数 VARCHAR2(20),
      TABMAXID   VARCHAR2(36),
      TABMINID   VARCHAR2(36)
    );表中数据太大,这里写不下啊。 我ROWNUM<100 贴下试试。跟到下面的帖子
      

  4.   

    表名  字段名  字段类型 
    表1  字段名1  varchar2 
    表1  字段名2  varchar2 
    表1  字段名3  varchar2 
    表1  字段名4  varchar2 
    表2  字段名1  varchar2 
    表2  字段名2  varchar2 
    表2  字段名3  varchar2 
    表2  字段名4  varchar2 
    表2  字段名5  varchar2 
    表3  字段名1  varchar2 
    表3  字段名2  varchar2 各位高手们,经过请示过领导,暂时不能把真实数据贴上来,机密性的。高手们就根据上面这个结构来写代码吧。就是根据上面这样的结构 OUT_PUT出 创建表的语句。这样看起来也简单,明了。
      

  5.   

    如果类型都是varchar2的话,需要指定长度的。
    11:36:06 scott@TUNGKONG> desc tb
     名称                                                  是否为空? 类型
     ----------------------------------------------------- -------- ------------------------------------
     TBNAME                                                         VARCHAR2(10)
     COLNAME                                                        VARCHAR2(30)
     COLTYPE                                                        VARCHAR2(20)
     COLLEN                                                         NUMBER(38)
      

  6.   

    11:38:21 scott@TUNGKONG> select * from tb;TBNAME     COLNAME                        COLTYPE                  COLLEN
    ---------- ------------------------------ -------------------- ----------
    A          col1                           varchar2                     10
    A          col2                           varchar2                     10
    A          col3                           varchar2                     10
    B          col1                           varchar2                     10
    B          col2                           varchar2                     10
    C          col1                           varchar2                     10已选择6行。已用时间:  00: 00: 00.00
    11:38:26 scott@TUNGKONG> declare
    11:38:37   2   strSQL varchar2(4000);
    11:38:37   3   cursor tbCursor is select distinct tbname from tb;
    11:38:37   4   TYPE curType IS REF CURSOR;
    11:38:37   5   myCursor curType;
    11:38:37   6   p_col tb.colname%type;
    11:38:37   7   p_type tb.coltype%type;
    11:38:37   8   p_len tb.collen%type;
    11:38:37   9  begin
    11:38:37  10   FOR cur IN tbCursor LOOP
    11:38:37  11   strSQL := 'create table ' || cur.tbname || '(';
    11:38:37  12      OPEN myCursor FOR select colname,coltype,collen from tb where tbname = cur.tbname;
    11:38:37  13      LOOP
    11:38:37  14      FETCH myCursor INTO p_col,p_type,p_len;
    11:38:37  15      EXIT WHEN myCursor%NOTFOUND;
    11:38:37  16   strSQL := strSQL || p_col || ' ' || p_type || '(' || p_len || '),';
    11:38:37  17     END LOOP;
    11:38:37  18    CLOSE myCursor;
    11:38:37  19    strSQL := SUBSTR(strSQL,1,length(strSQL)-1) || ');';
    11:38:37  20      DBMS_OUTPUT.PUT_LINE(strSQL);
    11:38:37  21    END LOOP;
    11:38:37  22  end;
    11:38:37  23  /
    create table A(col1 varchar2(10),col2 varchar2(10),col3 varchar2(10));
    create table B(col1 varchar2(10),col2 varchar2(10));
    create table C(col1 varchar2(10));PL/SQL 过程已成功完成。已用时间:  00: 00: 00.01
      

  7.   

    liusong_china   高人表名也要动态取
      

  8.   

    declare
    strSQL varchar2(4000);
    cursor tbCursor is select distinct tbname from tb;
    TYPE curType IS REF CURSOR;
    myCursor curType;
    p_col tb.colname%type;
    p_type tb.coltype%type;
    p_len tb.collen%type;
    begin
    FOR cur IN tbCursor LOOP
    strSQL := 'create table ' || cur.tbname || '(';
        OPEN myCursor FOR select colname,coltype,collen from tb where tbname = cur.tbname;
        LOOP
        FETCH myCursor INTO p_col,p_type,p_len;
        EXIT WHEN myCursor%NOTFOUND;
    strSQL := strSQL || p_col || ' ' || p_type || '(' || p_len || '),';    
       END LOOP;
      CLOSE myCursor; 
      strSQL := SUBSTR(strSQL,1,length(strSQL)-1) || ');';
        DBMS_OUTPUT.PUT_LINE(strSQL);
      END LOOP;
    end;
    /你的表中只有varchar2类型,需要支持别的类型就自己加点判断稍微改动一下吧。。
      

  9.   

    上面的 代码 不能实现。 liusong_china 
    数据类型 在数据字典中有个专门的字段放这个。所以你不需要考虑字段精度 长度之类的。直接取出来字段用就可以了。还有 你没有解决 取到最后一个字段的时候,后面那个 逗号的问题。
      

  10.   

    1、根据字典表的数据取表名不能实现?你修改一下字典表的数据试试。
    2、逗号的问题已经去掉了啊。
    declare
    strSQL varchar2(4000);
    cursor tbCursor is select distinct tbname from tb;
    TYPE curType IS REF CURSOR;
    myCursor curType;
    p_col tb.colname%type;
    p_type tb.coltype%type;
    begin
    FOR cur IN tbCursor LOOP
    strSQL := 'create table ' || cur.tbname || '(';
        OPEN myCursor FOR select colname,coltype from tb where tbname = cur.tbname;
        LOOP
        FETCH myCursor INTO p_col,p_type;
        EXIT WHEN myCursor%NOTFOUND;
    strSQL := strSQL || p_col || ' ' || p_type ||',';    
       END LOOP;
      CLOSE myCursor; 
      strSQL := SUBSTR(strSQL,1,length(strSQL)-1) || ');';
        DBMS_OUTPUT.PUT_LINE(strSQL);
      END LOOP;
    end;
    /
      

  11.   

    这是我的测试数据
    12:27:19 scott@TUNGKONG> select * from tb;TBNAME     COLNAME                        COLTYPE
    ---------- ------------------------------ --------------------
    tb1        col1                           varchar2(10)
    tb1        col2                           varchar2(10)
    tb1        col3                           varchar2(10)
    tb2        col1                           varchar2(10)
    tb2        col2                           varchar2(10)
    tb3        col1                           varchar2(10)已选择6行。已用时间:  00: 00: 00.00
    12:27:24 scott@TUNGKONG> declare
    12:27:32   2   strSQL varchar2(4000);
    12:27:32   3   cursor tbCursor is select distinct tbname from tb;
    12:27:32   4   TYPE curType IS REF CURSOR;
    12:27:32   5   myCursor curType;
    12:27:32   6   p_col tb.colname%type;
    12:27:32   7   p_type tb.coltype%type;
    12:27:32   8  begin
    12:27:32   9   FOR cur IN tbCursor LOOP
    12:27:32  10   strSQL := 'create table ' || cur.tbname || '(';
    12:27:32  11      OPEN myCursor FOR select colname,coltype from tb where tbname = cur.tbname;
    12:27:32  12      LOOP
    12:27:32  13      FETCH myCursor INTO p_col,p_type;
    12:27:32  14      EXIT WHEN myCursor%NOTFOUND;
    12:27:32  15   strSQL := strSQL || p_col || ' ' || p_type ||',';
    12:27:32  16     END LOOP;
    12:27:32  17    CLOSE myCursor;
    12:27:32  18    strSQL := SUBSTR(strSQL,1,length(strSQL)-1) || ');';
    12:27:32  19      DBMS_OUTPUT.PUT_LINE(strSQL);
    12:27:32  20    END LOOP;
    12:27:32  21  end;
    12:27:32  22  /
    create table tb3(col1 varchar2(10));
    create table tb2(col1 varchar2(10),col2 varchar2(10));
    create table tb1(col1 varchar2(10),col2 varchar2(10),col3 varchar2(10));PL/SQL 过程已成功完成。已用时间:  00: 00: 00.01