无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 591|回复: 10
打印 上一主题 下一主题

[分享] vba将Excel当前活动工作表内容一键生成能够插入到oracle数据库的sql语句

[复制链接]
跳转到指定楼层
1#
发表于 2025-4-11 08:16:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 likeyouli 于 2025-4-17 17:30 编辑

内容为原创,ai生成的会有很多小毛病,且很多没有用数组,生成的内容直接粘贴到sql文件里,在sqlplus里执行即可。

Sub 将活动表格内容生成为oracle制表sql语句并直接粘贴()
'需要确保在VBA编辑器中已引用"Microsoft Forms 2.0 Object Library"(通常在引用列表中显示为"FM20.dll")
    Dim strText As String, colTypes As String, values As String
  '首先生成create表语句,默认首行为标题
arr = Range("a1").CurrentRegion
TableName = InputBox("请输入Oracle表名:", "表名输入", "YOUR_TABLE_NAME")
If Not TableName Like "[a-zA-Z]*" Then MsgBox "表名不是以字母开头,请从新开始": Exit Sub
For i = 1 To UBound(arr, 2)
If  Len(Trim(arr(1, i))) = 0 Then MsgBox "第一行有空单元格": Exit Sub
Next i
For i = 1 To UBound(arr, 2)
    colnames = colnames & arr(1, i)
    If i < UBound(arr, 2) Then colnames = colnames & ","
    colTypes = colTypes & arr(1, i) & " varchar2(4000)," & Chr(13)
Next i
   colTypes = Left(colTypes, InStrRev(colTypes, ",") - 1) & Mid(colTypes, InStrRev(colTypes, ",") + 1)
'以上为生产建表语句   
For j = 2 To UBound(arr)
      values = ""
    For k = 1 To UBound(arr, 2)
        if arr(j,k) = "" then    '不用 If Len(Trim(arr(j, k))) = 0 Then了,因为几十万大数据量时这样判断速度过慢, varchar2类型哪怕是null都不会报错。
            values = values & "null"
'         ElseIf k Mod 6 = 0 Then values = values & "TO_DATE(REGEXP_SUBSTR('" & arr(j, k) & "','^[0-9-]+'),'YYYY-MM-DD')"  '个人认为这里是我写的精华,当遇到特殊列,比如带星期几的日期列,可用正则表达式提取出来,当然前边的生成列的数据类型要改为date类型.这里的数字6为要更改第几列就写几.
         Else
            values = values & "'" & Replace(arr(j, k), "'", "''") & "'"
        End If
         If k < UBound(arr, 2) Then values = values & ","
    Next k
        insertsql = insertsql & "INSERT INTO " & TableName & "(" & colnames & ")  VALUES(" & values & ");" & Chr(13) 'insert into有列名
      '  insertsql = insertsql & " INSERT INTO " & TableName & " VALUES(" & values & ");" & Chr(13)
        If j Mod 300 = 0 Then insertsql = insertsql & "commit;" & Chr(13)  '这里的300可任意改,代表间隔几列commit一次.
    If j = 200000 Then Exit For  '可以设置到二十万行结束
    DoEvents
    Application.StatusBar = Format(j / UBound(arr), "0.0%")  '大数据量可以看看进度
Next j
strText = "set echo on;" & Chr(13) & "CREATE TABLE  " & TableName & Chr(13) & "(" & colTypes & ")" & Chr(13) & _
            "tablespace users storage (next 10M) nologging;" & Chr(13) & "commit;" & Chr(13) & insertsql & "commit;"
    ' 将文本放入剪贴板
    With New DataObject
        .SetText strText
        .PutInClipboard
    End With
    MsgBox "生成的sql语句已复制到粘贴板!"
End Sub



..png (53.1 KB, 下载次数: 0)

..png

..png (8.27 KB, 下载次数: 0)

..png

..png (127.3 KB, 下载次数: 0)

..png
2#
发表于 2025-4-11 08:43:50 | 只看该作者
感谢分享
回复

使用道具 举报

3#
发表于 2025-4-11 09:24:25 | 只看该作者
谢谢分享!
回复

使用道具 举报

4#
发表于 2025-4-11 09:30:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5#
发表于 2025-4-11 09:34:21 | 只看该作者
感谢分享
回复

使用道具 举报

6#
发表于 2025-4-11 12:58:38 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
发表于 2025-4-11 14:12:18 | 只看该作者
THX~!感恩分享摟,謝謝大大喔~~!辛苦了!^^
回复

使用道具 举报

8#
发表于 2025-4-11 14:31:44 | 只看该作者

谢谢分享!
回复

使用道具 举报

9#
发表于 2025-4-11 16:26:06 | 只看该作者
感谢分享,
回复

使用道具 举报

10#
发表于 2025-4-11 16:55:07 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

11#
发表于 2025-4-11 17:42:47 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-4-24 06:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表