如何利用动态SQL语句在数据库中按用户给定的名字建立表,急

sunie2002 2002-07-20 08:11:00
本人在开发一个体育成绩管理系统的时候,遇到这样一个问题,用户需要每学年建立一个本学年的学生体育选课班的表,我想用程序实现让用户输入表的名称,利用动态SQL语言用代码建立这张以用户所输入的名称为表名的表,应该怎样实现呢?请各位兄弟姐妹助我一臂之力!
...全文
73 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhkili 2002-07-21
首先建一个TAB字段有(表名编码,列名,列中文名,数据类型,是否为空,是否主键,是否索引);

ll_rows = dw.retreve("tabcode")
lstr_sql = "IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='" + dw.GetItemString(1, "tabcode") +&
"' AND TYPE='U') ~n DROP TABLE " + dw.GetItemString(1, "tabcode") + &
";~nCREATE TABLE " + dw.GetItemString(1, "tabcode") + "("
For i = 1 to ll_rows
lstr_sql = lstr_sql + "~n" + dw.GetItemString(i, "colname")
lstr_sql = lstr_sql + "~t " + dw.GetItemString(i,"data_type")
If Upper(dw.GetItemString(i, "colnull")) = "Y" Then
lstr_sql = lstr_sql + "~t NULL,"
Else
lstr_sql = lstr_sql + "~t NOT NULL,"
End If
Next
ldw_pk.SetFilter("colpk = 'Y'")
ldw_pk.Filter()
lstr_pk = ldw_pk.GetItemString(1, "colname")
For i = 2 To ldw_pk.RowCount()
lstr_pk = ", " + ldw_pk.GetItemString(i, "colname")
Next
ldw_pk.SetFilter("")
ldw_pk.Filter()

lstr_sql = lstr_sql + "~nCONSTRAINT PK_" + dw.GetitemString(1, "tabcode") + " PRIMARY KEY(" + lstr_pk + ")); "

if IsNull(lstr_sql) then lstr_sql = "NULL"
MessageBox("", lstr_sql)

就是说先建用户需用新建表的信息,根据需用动态生成。
仅供参考,基本功能已经实现

回复
prghome 2002-07-21
倒ing.
你应该会举一反三,zhanwei(@_@)提供的通过动态SQL语句建表,你用“用户输入的表名”来代替SYSBACKUP不就的了。
你不至于完全硬搬人家提供的办法吧。
回复
sunie2002 2002-07-21
好了,问题已经解决了,谢谢zhanwei(@_@)和zhkili(加油啊!你一定行) 的帮忙,给分
回复
sunie2002 2002-07-21
谢谢诸位兄弟姐妹的捧场,请恕小弟愚笨,没有看明白,感觉 zhanwei(@_@)的回复提供了一个建立转入转出表的方法,没有看出来如何利用用户输入的表名建立表的方法啊,我的意思是让用户输入表名,我用SQL建立表啊。能不能详细一点啊,小弟在线盼望!

zhkili(加油啊!你一定行) 的回复我已经尝试,没有成功,能不能帮小弟尝试一下告诉我啊?
jlandzpa(ORA-00600)的回复太简单了,我想用动态sql实现

再一次衷心谢谢你们的帮助!
回复
jlandzpa 2002-07-20
也可以写一个动态过程,查查oracle的文档.
回复
zhkili 2002-07-20
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='TABNAME' AND TYPE='U')
DROP TABLE TABNAME;

CREATE TABLE TABNAME(
COLNAME1 NUMERIC(18,0) NOT NULL,
COLNAME2 NUMERIC(18,0) NULL,
CONSTRAINT TABNAME PRIMARY KEY(COLNAME1)) ;

CREATE INDEX IDXNAME ON TABNAME (COLNAME1, COLNAME1) ;

把表名,列名,字段明,数据类型,是否为空,主键,索引。
都作成变量,品成SQL语句.然后执行就可以了。

回复
zhanwei 2002-07-20
拼SQL串就行了,例子来了:
sqlca.autocommit = true
//生成转入转出表
ls_SqlString = "CREATE TABLE SYSBACKUP(TBNAME char(30) NOT NULL,TBDESC char(40) NULL,"+&
"COLNAME char(100) DEFAULT '*' NULL,TBPRIORTY integer NOT NULL,"+&
"TBPRIMKEY char(40) NULL,DBNAME char(30) NULL,PRIMARY KEY(TBNAME)) ;"
//设主键了

execute immediate : ls_SqlString;

if sqlca.sqlcode <> 0 then
messagebox('错误提示:', '数据库表操作错误!~r~nSQLCA.SQLCODE = '+string(sqlca.sqlcode)+'~r~nSQLCA.SQLERRTEXT = '+sqlca.sqlerrtext)
return -1
end if

//生成索引
ls_SqlString = "CREATE UNIQUE INDEX SYSBACKUP ON SYSBACKUP(TBNAME) "

execute immediate : ls_SqlString;

if sqlca.sqlcode <> 0 then
messagebox('错误提示::', '数据库生成索引操作错误!~r~nSQLCA.SQLCODE = '+string(sqlca.sqlcode)+'~r~nSQLCA.SQLERRTEXT = '+sqlca.sqlerrtext)
return -1
end if
sqlca.autocommit = false
return 1
回复
发动态
发帖子
数据库相关
创建于2007-09-28

732

社区成员

PowerBuilder 数据库相关
申请成为版主
社区公告
暂无公告