【问题标题】:VBScript DDL on Oracle 11g - Stops after DROP TABLEOracle 11g 上的 VBScript DDL - 在 DROP TABLE 后停止
【发布时间】:2013-09-15 23:56:09
【问题描述】:

我目前正在尝试将一系列用于将数据从远程 Oracle DB 源(我们的供应商)加载到我们的(现在)Oracle 11g R2 实例中的非常麻烦的 VBScript 迁移。该脚本基于之前的 Oracle 10g 实例(完全不同的机器)运行良好,并且 DDL 本身在我在 CN 字符串中使用的同一用户下手动运行时运行良好。

主机操作系统: Windows 2008 R2 64 位企业版
主机数据库: Oracle 11g R2 64 位

脚本:

Option explicit

Dim CN
Dim fso, objFile

Const strOutputFile = "\\<server>\<path>\<to>\LOGS\LOAD_DATA.LOG"

Set CN = CreateObject("ADODB.CONNECTION")

CN.Open "Driver={Oracle in OraDb11g_home1};Dbq=<tnsname>;Uid=<uid>;Pwd=<pwd>;"

Set fso = CreateObject("SCRIPTING.FileSystemObject")

Set objFile = fso.OpenTextFile(strOutputFile, 2, True)

objFile.WriteBlankLines(2)
objFile.WriteLine "*** Start Load_Data.vbs Log - " &Now() &" ***"

Call SBB_BASE()

objFile.WriteLine "*** End Load_Data.vbs Log - " &Now() &" ***"
objFile.WriteBlankLines(2)
objFile.Close

Set objFile = Nothing
Set fso = Nothing

CN.Close

Sub SBB_BASE()

On Error Resume Next

CN.Execute "TRUNCATE TABLE DATA.SBB_BASE"
CN.Execute "DROP TABLE DATA.SBB_BASE"

CN.Execute "CREATE TABLE DATA.SBB_BASE STORAGE (INITIAL 20000 NEXT 1024 PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 121) NOLOGGING TABLESPACE DATA AS SELECT * FROM SBB_BASE@<vendor>"

CN.Execute "CREATE INDEX DATA.IDX_SBB_SUB_ACCT_NO ON DATA.SBB_BASE(SUB_ACCT_NO_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_HSE_KEY ON DATA.SBB_BASE(HSE_KEY_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_EXT_STAT ON DATA.SBB_BASE(EXT_STAT_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_CUST_ACCT_NO ON DATA.SBB_BASE(CUST_ACCT_NO_SBB) TABLESPACE DATA_IDX NOLOGGING"

End Sub

当我从命令行运行 .vbs 时,它首先会提示有关不受信任脚本的警告(当尝试从 Windows 任务计划程序运行此无人值守时,这可能会导致问题,但一次出现一个问题),然后它似乎在没有任何明显错误的情况下执行 - 但只有前两个 CN.Execute 语句执行 - TRUNCATE TABLEDROP TABLE DDL 命令 - 似乎没有其他处理。我知道是这种情况,因为表和所有索引都从架构中消失了。

但是,当我从每个 CN.Execute 行中获取 DDL 并将它们作为代码块手动执行时,它们工作得很好。我在 Oracle 服务器上找不到任何可以指示问题所在的错误日志。

有什么想法吗?

编辑:喘口气后,我想出了如何在 DDL 语句中添加一些额外的日志记录,以尝试找出发生了什么 - 事实证明,问题与使用的 DBLINK 有关C-T-AS DDL,因为我们的供应商非常友好地设置了SESSIONS_PER_USER 上限。

但是,我总共有四个不同的DBLINKS 给同一个供应商,我可以使用不同的用户来加载数据,我真的很想在脚本中构建一些可以检查是否有任何这些连接的功能将返回 SESSIONS_PER_USER 消息,而第一个未用于后续数据加载的消息。由于这是一个完全独立的问题,我将创建一个不同的问题。

【问题讨论】:

    标签: sql oracle vbscript adodb ddl


    【解决方案1】:

    我不是 Oracle 人员,但从所述症状来看,由于某种原因,在之前的某个语句完成之前执行创建,并且当删除完成时,它会删除您的新表。

    我建议增强脚本,使其在放置完成之前不会继续创建。

    我可以在 SQL Server 中为您提供此语法,但在 oracle 中无法提供。

    【讨论】:

    • 事实证明,你有点走上正轨 - 问题不在于我的 DDL 被不按顺序执行,但是 - 它与表数据的来源有关 - 我是违反了他们使用的SESSIONS_PER_USER 上限。
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多