一般项目都有自己的数据库设计表文档,根据这些文档,使用VBA可以很方便且准确的自动生成建表SQL(oracle)
下面是VBA代码:
Option Explicit
' 所有要写入文件的数据
Dim alldata() As String
' 表字段设定注释数组数据
Dim columnsCommentsArray() As String
' 数据所在单元格ID
' 物理表名ID
Const physicsTableNameRangeId = "C5"
' 表名称ID
Const tableNameRangeId = "C6"
' 列名(中文说明)所在列ID,例如:姓名
Const columnNameId = "B"
' 列名(物理)所在列ID,例如:NAME
Const physicsColumnNameId = "C"
' Data属性所在列ID,例如:NUMBER
Const dateTypeId = "D"
' 长度所在列ID,例如:3, 0
Const lengthId = "E"
' key所在列ID,例如:PK
Const keyId = "F"
' 是否可以为空ID,例如:NOT NULL
Const notNullId = "G"
' 默认值ID,例如:0
Const defaultValueId = "H"
' 1个空格
Const space1 = " "
' 2个空格
Const space2 = " "
' 5个空格
Const space5 = " "
' 数据值
' 物理表名数据
Dim physicsTableNameRangeValue As String
' 表名称数据
Dim tableNameRangeValue As String
' 列名(中文说明)所在列数据
Dim columnNameValue As String
' 列名(物理)所在列数据
Dim physicsColumnNameValue As String
' Data属性所在列数据
Dim dateTypeValue As String
' 长度所在列数据
Dim lengthValue As String
' key所在列数据
Dim keyValue As String
' 是否可以为空数据
Dim notNullValue As String
' 默认值数据
Dim defaultValueValue As String
' 列定义开始行
Const startIndex = 9
Const endIndex = 2000
' 主键字符串
Dim keyColumn As String
' -------------------------------
' 制作创建表SQL入口方法
' -------------------------------
Sub makeCreateTableSql()
' 物理表名数据
physicsTableNameRangeValue = Range(physicsTableNameRangeId).Value
' 表名称数据
tableNameRangeValue = Range(tableNameRangeId).Value
' 初始化数组
initAlldataArray ("-- Create table")
createTableColumnsPartData
createTablespacePartData
createTableCommentsPartData
createColumnsCommentsPartData
createTableKeyPartData
writeFile ("C:\")
End Sub
' 创建表定义部分数据
'create table TABLE_NAME
'(
' COL1 VARCHAR2(10) not null,
' COL2 DATE
')
Function createTableColumnsPartData()
addLineData ("create table " & physicsTableNameRangeValue)
addLineData ("(")
' 创建表列定义行数据
makeTableColumnsDetail
addLineData (")")
addLineData ("")
End Function
' 创建表空间定义
'tablespace USERS
' pctfree 10
' initrans 1
' maxtrans 255
' storage
' (
' initial 64K
' minextents 1
' maxextents unlimited
' );
Function createTablespacePartData()
addLineData ("tablespace USERS")
addLineData (" pctfree 10")
addLineData (" initrans 1")
addLineData (" maxtrans 255")
addLineData (" storage")
addLineData (" (")
addLineData (" initial 64K")
addLineData (" minextents 1")
addLineData (" maxextents unlimited")
addLineData (" );")
addLineData ("")
End Function
' 创建表注释
' -- Add comments to the table
' comment on table TABLE_NAME is '表名称';
Function createTableCommentsPartData()
addLineData ("-- Add comments to the table")
addLineData ("comment on table " & physicsTableNameRangeValue & " is '" & tableNameRangeValue & "';")
addLineData ("")
End Function
' 创建表字段注释
' -- Add comments to the columns
' comment on column TABLE_NAME.COL1 is '字段1';
Function createColumnsCommentsPartData()
Dim i As Integer
For i = 0 To UBound(columnsCommentsArray)
addLineData (columnsCommentsArray(i))
Next i
End Function
' 创建主键
'-- Create/Recreate primary, unique and foreign key constraints
'alter table TABLE_NAME
' add primary key (COL1, COL2)
' using index
' tablespace USERS
' pctfree 10
' initrans 2
' maxtrans 255
' storage
' (
' initial 64K
' minextents 1
' maxextents unlimited
' );
Function createTableKeyPartData()
If keyColumn <> "" Then
' 去掉主键字符串最后的“,”
keyColumn = Left(keyColumn, Len(keyColumn) - 1)
addLineData ("-- Create/Recreate primary, unique and foreign key constraints")
addLineData ("alter table " & physicsTableNameRangeValue)
addLineData (" add primary key (" & keyColumn & ")")
addLineData (" using index")
addLineData (" tablespace USERS")
addLineData (" pctfree 10")
addLineData (" initrans 2")
addLineData (" maxtrans 255")
addLineData (" storage")
addLineData (" (")
addLineData (" initial 64K")
addLineData (" minextents 1")
addLineData (" maxextents unlimited")
addLineData (" );")
End If
End Function
' 创建表列定义行数据
' COL1 VARCHAR2(10) not null,
' COL2 VARCHAR2(100),
' COL3 NUMBER(19),
' COL4 DATE,
' COL5 NUMBER(5,2),
' COL6 VARCHAR2(100),
' COL7 CHAR(1) default 0,
'
Function makeTableColumnsDetail()
Dim i As Integer
Dim columnLine As String
' 初始化表字段设定注释数组
initColumnsCommentsArray ("-- Add comments to the columns")
' 主键字符串
keyColumn = ""
For i = startIndex To endIndex
' 列名(物理)所在列数据
physicsColumnNameValue = Trim(Range(physicsColumnNameId & CStr(i)).Value)
If physicsColumnNameValue <> "" Then
' 列名(中文说明)所在列数据
columnNameValue = Trim(Range(columnNameId & CStr(i)).Value)
' 向表字段设定注释数组中添加新行
' comment on column TABLE_NAME.COL1 is '字段1';
addColumnsCommentsLineData ("comment on column " & physicsTableNameRangeValue & "." & physicsColumnNameValue & " is '" & columnNameValue & "';")
' Data属性所在列数据
dateTypeValue = Trim(Range(dateTypeId & CStr(i)).Value)
' 长度所在列数据
lengthValue = Trim(Range(lengthId & CStr(i)).Value)
' key所在列数据
keyValue = Trim(Range(keyId & CStr(i)).Value)
' 是否可以为空数据
notNullValue = Trim(Range(notNullId & CStr(i)).Value)
' 默认值数据
defaultValueValue = Trim(Range(defaultValueId & CStr(i)).Value)
' 取得主键字符串
If UCase(keyValue) = "PK" Then
keyColumn = keyColumn & physicsColumnNameValue & ","
End If
' 得到类似 " COL1 "
columnLine = space2 & physicsColumnNameValue & space5
' 得到类似 "VARCHAR2(10) "
If dateTypeValue = "VARCHAR2" Then
columnLine = columnLine & "VARCHAR2(" & lengthValue & ")" & space1
ElseIf dateTypeValue = "NUMBER" Then
columnLine = columnLine & "NUMBER(" & Replace(lengthValue, ",", ",") & ")" & space1
ElseIf dateTypeValue = "DATE" Then
columnLine = columnLine & "DATE" & space1
ElseIf dateTypeValue = "CHAR" Then
columnLine = columnLine & "CHAR(" & lengthValue & ")" & space1
End If
' 默认值数据, 得到类似 ""
If defaultValueValue <> "" Then
columnLine = columnLine & "default" & space1 & defaultValueValue & space1
End If
' 是否可以为空数据, 得到类似 "not null"
If UCase(notNullValue) = "NOT NULL" Then
columnLine = columnLine & "not null"
End If
' 每个字段行追加一个,
columnLine = columnLine & ","
addLineData (columnLine)
Else
' 去掉字符串最后的“,”
alldata(UBound(alldata)) = Left(alldata(UBound(alldata)), Len(alldata(UBound(alldata))) - 1)
Exit For
End If
Next i
' 向表字段设定注释数组中添加新行
addColumnsCommentsLineData ("")
End Function
' ----------------------------以下为写文件和操作数组方法----------------------------
' 写文件
' path 路径名 例如:"C:\"
Function writeFile(ByVal path As String)
' 循环计数器
Dim i As Integer
Dim fullPath As String
fullPath = path + physicsTableNameRangeValue + ".sql"
Open fullPath For Output As #1
For i = 0 To UBound(alldata)
Print #1, alldata(i)
Next i
' 关闭 Open 语句打开的所有活动文件,并将文件缓冲区的所有内容写入磁盘。
Reset
End Function
' 弹出完成信息
Function showFinishMessage()
MsgBox "成功作成"
End Function
' 初始化数组
Function initAlldataArray(ByVal data As String)
' 初始化数组
ReDim Preserve alldata(0)
alldata(0) = data
End Function
' 向数组中添加新行
Function addLineData(ByVal data As String)
ReDim Preserve alldata(UBound(alldata) + 1)
alldata(UBound(alldata)) = data
End Function
' -----------------------------
' 初始化表字段设定注释数组
Function initColumnsCommentsArray(ByVal data As String)
' 初始化数组
ReDim Preserve columnsCommentsArray(0)
columnsCommentsArray(0) = data
End Function
' 向表字段设定注释数组中添加新行
Function addColumnsCommentsLineData(ByVal data As String)
ReDim Preserve columnsCommentsArray(UBound(columnsCommentsArray) + 1)
columnsCommentsArray(UBound(columnsCommentsArray)) = data
End Function
生成的TABLE_TEST.sql文件内容如下所示:
-- Create table
create table TABLE_TEST
(
USERID VARCHAR2(20) not null,
USERNAME VARCHAR2(100) ,
AGE NUMBER(3) default 18 not null,
SEX default 1 not null,
DELETEFLAG CHAR(1) default 0 not null,
CREATEDATE DATE ,
CREATEUSER VARCHAR2(20) ,
UPDATEDATE DATE ,
UPDATEUSER VARCHAR2(20)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table TABLE_TEST is '制作表SQL测试表';
-- Add comments to the columns
comment on column TABLE_TEST.USERID is '用户ID';
comment on column TABLE_TEST.USERNAME is '用户名称';
comment on column TABLE_TEST.AGE is '年龄';
comment on column TABLE_TEST.SEX is '性别';
comment on column TABLE_TEST.DELETEFLAG is '删除标志';
comment on column TABLE_TEST.CREATEDATE is '创建时间';
comment on column TABLE_TEST.CREATEUSER is '创建人ID';
comment on column TABLE_TEST.UPDATEDATE is '更新时间';
comment on column TABLE_TEST.UPDATEUSER is '更新人ID';
-- Create/Recreate primary, unique and foreign key constraints
alter table TABLE_TEST
add primary key (USERID)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
分享到:
相关推荐
定义好表定义,自动生成建表CREATE语句。
根据EXCEL表格中的数据表结构,一键自动生成sqlserver数据库表结构,create语句。VBA方便快捷,一键生成。减去大量的重复工作,节省开发时间。同时支持sql语句生成excel数据表.
根据数据库设计自动创建sql语句(MySQL + Oracle)
使用Excel通过VBA连接Oracle数据库查询数据,可以实现一键自动快速生成所需的多个标准报表,大大地提高工作效率,节省很多时间。
excel生成ddl语句或者建表脚本,方便数据仓库建设。
用于批量生成Oracle数据库表结构,包含表注释、列注释、分区表、主键索引的创建生成。支持多表生成,索引表空间添加等功能
根据数据库生成数据库结构设计文档,Excel文件,以VBA编写,现在支持oracle/sqlerver/access数据库。每张表对应一张sheet页,所以表名必须符合sheet页命名规则,不能超过31个字符。从Excel中可轻松将表结构文档粘贴...
Oracle数据库表结构导出成Word文档工具(带源码下载) 修改了一下数据库的连接方式:由于我安装的是win764位+office64+oracle client 32位,用MSDAORA.1无法连接,所以将MSDAORA.1换为OraOleDb.Oracle.1,换后正常连接...
使用sql语句,在数据库记录加入时,自动生成序号
VBA操作数据库实例 利用ao技术
vba自动生成sql
内容简介 《Excel VBA 数据库整合应用范例精讲》用180个实例介绍了利用Excel VBA来操作数据库(包括Access、SQL Server和FoxPro)的实用方法和技巧。 全书共11章。第1~6章是利用Excel VBA操作Access数据库的实例...
9.3.2 主要ADO对象的使用 9.3.3利用ADO访问数据库 第9章 VBA数据库编程 概要介绍: 前面已经介绍了模块和VBA程序设计基础知识,包 括VBA面向对象程序设计初步知识。实际上,要想快速、 有效地管理好数据,开发出更具...
VBA连接SQLSERVER数据库实例
内容简介 《Excel VBA 数据库整合应用范例精讲》用180个实例介绍了利用Excel VBA来操作数据库(包括Access、SQL Server和FoxPro)的实用方法和技巧。 全书共11章。第1~6章是利用Excel VBA操作Access数据库的实例...
VBA连接SQL数据库的代码。代码很简单,但是包含了不少初学者可能遇到的三个问题,一是长查询语句的换行问题,二是查询语句执行时间过长导致vba提示查询超时的问题,三是标题行和内容行怎么显示的问题。都很简单,...
功能如下:一是包含VBA连接SQL Server执行查询的代码;二是包含自动将数据结果到处为多个Excel文件的代码,文件名格式为:机构编码+文件主名称+日期,日期是自动取的当前日期,机构编码单独存放在名为shopid的sheet...
用VBA制成的可根据模板工作表,批量生成新的工作表,并能自动编号及工作表命名。
OracleDB2Doc V2.0(Oracle数据库表结构导出器)是一套用来完成将Oracle数据库中的表结构导出成Word文档,并输出标准的打印报表格式的软件。 软件采用Word中VBA开发完成,软件使用Word中的菜单操作,与Word完全集成...
基于VBA数据库报表自动生成系统的设计,常清,邓中亮,如今,软件开发多用数据库作后台数据的支撑载体,利用数据生成报告监测软件的运行情况,而快速的处理数据、自动生成报表对于提升