有这样一张表:
表名 字段名 字段类型
表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 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
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 贴下试试。跟到下面的帖子
表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出 创建表的语句。这样看起来也简单,明了。
11:36:06 scott@TUNGKONG> desc tb
名称 是否为空? 类型
----------------------------------------------------- -------- ------------------------------------
TBNAME VARCHAR2(10)
COLNAME VARCHAR2(30)
COLTYPE VARCHAR2(20)
COLLEN NUMBER(38)
---------- ------------------------------ -------------------- ----------
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
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类型,需要支持别的类型就自己加点判断稍微改动一下吧。。
数据类型 在数据字典中有个专门的字段放这个。所以你不需要考虑字段精度 长度之类的。直接取出来字段用就可以了。还有 你没有解决 取到最后一个字段的时候,后面那个 逗号的问题。
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;
/
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