已知表名称和字段信息。需要生成建表的SQL语句。如果有一张表还好,手动写下SQL语句没问题,但是如果有20张表,再手动写SQL效率就不高,而且手动容易写错。
使用下面的小工具就可以批量生成建表的SQL,支持多张表一键生成。此工具以oracle数据库为例,其他数据库可以修改后使用。
完整代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<h1 style="text-align:center;">批量生成建表语句工具</h1>
<h3>将表名称信息放入"表名称文本域",将字段信息放入"表字段文本域"中,点击解析按钮.</h3>
<h3>"表名称文本域",放2列数据,如'<span style="color:red;">员工信息表 MID_HR_PERSON</span>',第一列为表中文名称,用于和字段循环时比对;第二列是表名称.</h3>
<h3>"表字段文本域",放4列数据,如'<span style="color:red;">员工信息表 生效日期 FEFFDT 日期类型</span>',第一列为表中文名称,用于和表名称循环时比对;第二列数据是字段中文名称;第三列是字段名称;第四列是表字段类型.</h3>
<h3>数据放入对应文本域后注意将最后一行的回车删掉</h3>
<div style="float:left;">
<h2>表名称文本:</h2>
<textarea id="TableNameText" rows="15" style="width:500px"></textarea>
<h2>表字段文本</h2>
<textarea id="AnswerText" rows="15" style="width:500px"></textarea>
<button id="BtnNow" style="width:50px;height:50px;">解析</button>
<br />
</div>
<div>
<h2>解析后文本</h2>
<textarea id="AnswerAnalysis" rows="40" style="width:500px"></textarea>
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
$("#BtnNow").on("click", function () {
//表名称信息
var _tblNameText = $("#TableNameText").val();
var vArrTblName = _tblNameText.split("\n");//按行拆分表名称信息
//字段信息
var _answerText = $("#AnswerText").val();
var vHtml ="";
for (var k = 0; k < vArrTblName.length; k++) {
var vNameTblRow = vArrTblName[k];//表名称单行数据
var vNameRowArr = vNameTblRow.split("\t");//按空格拆分
var tableCnName= vNameRowArr[0];//表中文名称
var tableName= vNameRowArr[1];//表英文名称
vHtml += "create table "+tableName +"\n (";
vHtml += " ID NUMBER NOT NULL, \n";
var vArr = _answerText.split("\n");//按行拆分表字段信息
if (_answerText != "") {
//console.log(vArr);
//开始循环字段信息
for (var i = 0; i < vArr.length; i++) {
var v1 = vArr[i];
var vArr1 = v1.split("\t");//按空格拆分
var tblName=vArr1[0];//表中文名
var fileName=vArr1[2];//字段名称
var dataType=vArr1[3];//数据类型 (字符串类型 日期类型 数字类型)
if(tableCnName==tblName){//是同一张表的信息
if(dataType=="字符串类型"){
vHtml += fileName+" VARCHAR2(2000), \n";
}else if(dataType=="日期类型"){
vHtml += fileName+" DATE, \n";
}else if(dataType=="数字类型"){
vHtml += fileName+" NUMBER, \n";
}else{
vHtml += fileName+ " "+dataType +", \n";//如果是写明字段类型的直接取
}
}
}
//通用字段添加
vHtml += "CORPNO VARCHAR2(2000),\n";
vHtml += "SOURCECORPNO VARCHAR2(2000),\n";
vHtml += "RESOURCE_SIGN VARCHAR2(50),\n";
vHtml += "RESOURCE_ID VARCHAR2(50),\n";
vHtml += "SYNC_DATE DATE,\n";
vHtml += "SYNC_STATUS NUMBER,\n";
vHtml += "IS_COMPARE NUMBER,\n";
vHtml += "ABNORMAL_HINTS VARCHAR2(4000),\n";
vHtml += "ABNORMAL_REMIND VARCHAR2(4000),\n";
vHtml += "CREATE_USERNAME VARCHAR2(2000),\n";
vHtml += "CREATE_DATE DATE,\n";
vHtml += "OPERATE_USERNAME VARCHAR2(2000),\n";
vHtml += "OPERATE_DATE DATE,\n";
vHtml += "OPERATE_TYPE VARCHAR2(2000),\n";
vHtml += "AUDIT_USER VARCHAR2(2000),\n";
vHtml += "AUDIT_DATE DATE,\n";
vHtml += "CANCEL_DATE DATE);\n";
vHtml += "\n";
vHtml += "comment on table "+tableName + " is '" +tableCnName+"';\n";
vHtml += "comment on column "+tableName + ".ID is '主键ID';\n";
//开始循环字段注释信息
for (var i = 0; i < vArr.length; i++) {
var v1 = vArr[i];
var vArr1 = v1.split("\t");//按空格拆分
var tblName=vArr1[0];//表中文名,用于和外层循环StdTableName的值判断
var cnName=vArr1[1];//字段中文名
var fileName=vArr1[2];//字段名称
if(tableCnName==tblName){//是同一张表的信息
vHtml += "comment on column "+tableName + "."+fileName+" is '" +cnName+"';\n";
}
}
//通用字段添加备注
vHtml += "comment on column "+tableName+".CORPNO is '企业编码';\n";
vHtml += "comment on column "+tableName+".SOURCECORPNO is '数据来源单位';\n";
vHtml += "comment on column "+tableName+".RESOURCE_SIGN is '数据源标志';\n";
vHtml += "comment on column "+tableName+".RESOURCE_ID is '数据源ID';\n";
vHtml += "comment on column "+tableName+".SYNC_DATE is '同步日期';\n";
vHtml += "comment on column "+tableName+".SYNC_STATUS is '同步状态(1-未比对/2-异常数据/5-撤销/7-已入库)';\n";
vHtml += "comment on column "+tableName+".IS_COMPARE is '是否比对入库(0-未比对/1-已比对)';\n";
vHtml += "comment on column "+tableName+".ABNORMAL_HINTS is '错误提示';\n";
vHtml += "comment on column "+tableName+".ABNORMAL_REMIND is '非必要级告警提醒';\n";
vHtml += "comment on column "+tableName+".CREATE_USERNAME is '创建人';\n";
vHtml += "comment on column "+tableName+".CREATE_DATE is '创建日期';\n";
vHtml += "comment on column "+tableName+".OPERATE_USERNAME is '操作人';\n";
vHtml += "comment on column "+tableName+".OPERATE_DATE is '操作日期';\n";
vHtml += "comment on column "+tableName+".OPERATE_TYPE is '操作类型';\n";
vHtml += "comment on column "+tableName+".AUDIT_USER is '审核人';\n";
vHtml += "comment on column "+tableName+".AUDIT_DATE is '审核日期';\n";
vHtml += "comment on column "+tableName+".CANCEL_DATE is '撤销日期';\n";
//为表添加主键
vHtml += "\n";
vHtml += "alter table "+tableName + " add constraint PK_" +tableName+" primary key (ID) using index;";
vHtml += "\n\n\n\n";//单张表结束
}
}//表名称循环结束
$("#AnswerAnalysis").html(vHtml);
});
</script>
</body>
</html>
使用方法:
1.将上面代码拷贝到TXT文本中,将文件后缀改为html格式。在浏览器中打开,可以看到如下内容:
2.根据文字提示将对应信息放入对应文本框中,点击页面中的解析按钮,就可以生成对应表的创建语句。
工具的脚本是用js写的,可以根据实际应用场景修改。
代码中有一段逻辑是为表添加通用字段,就是每张表都有的字段,如果不需要则可以删除。
代码逻辑是两层for循环,外层循环表名称中的文本信息,内层循环字段信息,如果表名称中的表名和字段信息中的表名相同,则说明是同一张表,生成表的语句。然后再继续循环,直到把所有表循环完毕。