`

使用VBA根据数据库表设计文档自动生成建表SQL(oracle)

    博客分类:
  • Vba
阅读更多
一般项目都有自己的数据库设计表文档,根据这些文档,使用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
  );

分享到:
评论

相关推荐

    postgres 建表SQL语句自动生成VBA

    定义好表定义,自动生成建表CREATE语句。

    excel2003 生成oracle 建表语句

    3. **运行宏**:启用Excel的宏功能后,执行宏会自动生成建表语句,这些语句可以直接复制到SQL客户端工具中执行,从而在Oracle数据库中创建对应的表。 4. **验证和调整**:生成的SQL语句需要进行检查,确保符合数据库...

    Excel根据表格,批量生成sqlserver语句 ,生成建表语句,自行到数据库中执行

    标题提到的“Excel根据表格,批量生成sqlserver语句,生成建表语句,自行到数据库中执行”,就是一种利用Excel宏自动化生成SQL Server建表语句的方法。这种方法适用于已有数据结构清晰的Excel表格,通过特定的规则...

    excel生成建表SQl

    "excel生成建表SQL"这个主题涉及到将Excel中的数据转换为创建数据库表的SQL语句。在这个过程中,我们可以利用Excel的固定格式来定义表的字段、属性和约束,比如主键、索引、默认值以及是否允许为空等关键要素。 ...

    SQL SERVER自动导出Word数据库文档

    "SQL SERVER自动导出Word数据库文档"这一功能就满足了这样的需求。这个功能主要应用于SQL SERVER 2000、2005、2008这三个版本,意味着它兼容性较强,能够覆盖较早时期到较新的数据库系统。 1. **SQL Server ...

    数据库建表操作SQL语句大全

    ### 数据库建表操作SQL语句详解 #### 一、新建表 新建表是数据库管理中最基础的操作之一,用于创建新的数据存储结构。在SQL语言中,`CREATE TABLE`语句用于定义表的结构。 **语法示例**: ```sql CREATE TABLE ...

    根据EXCEL数据表结构生成sqlserver数据库表结构,同时支持sql语句生成excel数据表

    根据EXCEL表格中的数据表结构,一键自动生成sqlserver数据库表结构,create语句。VBA方便快捷,一键生成。减去大量的重复工作,节省开发时间。同时支持sql语句生成excel数据表.

    excel vba生成建表语句

    excel生成ddl语句或者建表脚本,方便数据仓库建设。

    Excel通过VBA连接Oracle数据库

    在Excel中通过Visual Basic for Applications (VBA) 连接Oracle数据库是一种强大的自动化工具,能够让你轻松地从大型数据库中提取、处理和分析数据。VBA是Excel内置的编程环境,允许用户创建自定义功能和宏,以实现...

    vba自动建表.zip

    在给定的"vba自动建表.zip"压缩包中,我们看到涉及到的是使用VBA(Visual Basic for Applications)编写宏来自动化Hive表的构建过程。Hive是一个基于Hadoop的数据仓库工具,常用于大数据处理,而VBA则是Excel和其他...

    VBA操作数据库实例

    VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义功能、自动化任务,甚至可以操作外部数据源,如数据库。在这个“VBA操作数据库实例”中,我们将深入探讨如何...

    数据库设计模板 + VBA创建sql语句

    根据数据库设计自动创建sql语句(MySQL + Oracle)

    Excel VBA整合数据库应用从基础到实践(源文件)

    《Excel VBA整合数据库应用从基础到实践》是一本针对具备一定Excel使用基础的学习者编写的书籍,旨在帮助读者深入理解和掌握如何通过VBA(Visual Basic for Applications)与数据库进行高效整合,从而实现自动化和...

    Oracle建表VBA文件.xls

    用于批量生成Oracle数据库表结构,包含表注释、列注释、分区表、主键索引的创建生成。支持多表生成,索引表空间添加等功能

    数据库结构设计文档生成器1.0

    根据数据库生成数据库结构设计文档,Excel文件,以VBA编写,现在支持oracle/sqlerver/access数据库。每张表对应一张sheet页,所以表名必须符合sheet页命名规则,不能超过31个字符。从Excel中可轻松将表结构文档粘贴...

    vba自动生成sql

    vba自动生成sql

    MySQL数据库表导出Word工具,生成数据库说明文档

    总结一下,"MySQL数据库表导出Word工具"是一个高效实用的解决方案,它通过ODBC和Word宏实现了数据库结构的自动化文档化。使用这个工具,你可以方便地创建和维护MySQL数据库的详细说明,提高团队的工作效率和沟通效果...

    excel生成sql脚本

    在“表结构说明及SQL生成文档.xls”中,可能包含了数据库中的各个表的字段定义,如字段名、数据类型、长度、是否为主键等信息。这些信息是生成SQL脚本的基础,因为它们定义了数据库的架构。你可以通过整理这些信息,...

    序号自动生成.sql

    使用sql语句,在数据库记录加入时,自动生成序号

    Oracle数据库表结构导出成Word文档工具(带源码下载)

    Oracle数据库表结构导出成Word文档工具(带源码下载) 修改了一下数据库的连接方式:由于我安装的是win764位+office64+oracle client 32位,用MSDAORA.1无法连接,所以将MSDAORA.1换为OraOleDb.Oracle.1,换后正常连接...

Global site tag (gtag.js) - Google Analytics