Excel VBA:Oracle SQL插入查询未插入数据

Excel VBA:Oracle SQL插入查询未插入数据,excel,vba,Excel,Vba,抱歉,如果这是太多的信息,但我想在发布时彻底 我一直在努力解决一个问题,即如何用插入查询中的数据填充临时表 正在从Oracle SQL表中提取此数据 此查询创建临时表,插入数据,并在Oracle SQL Developer软件中查询临时表而不出现问题 我的代码将成功创建临时表(我已经在Oracle软件中验证了它的存在) 我可以在设置中使用Select查询(因此我认为连接不是问题) 运行我的代码不会产生任何错误(至少不会停止执行) 我注意到的是,如果在执行insert查询时使用“记录集”,它确

抱歉,如果这是太多的信息,但我想在发布时彻底

我一直在努力解决一个问题,即如何用插入查询中的数据填充临时表

  • 正在从Oracle SQL表中提取此数据

  • 此查询创建临时表,插入数据,并在Oracle SQL Developer软件中查询临时表而不出现问题

  • 我的代码将成功创建临时表(我已经在Oracle软件中验证了它的存在)

  • 我可以在设置中使用Select查询(因此我认为连接不是问题)

  • 运行我的代码不会产生任何错误(至少不会停止执行)

我注意到的是,如果在执行insert查询时使用“记录集”,它确实会显示受影响行的预期数量,但当我从temp表中选择All(来自Oracle软件)时,它不会显示填充的任何内容

我已经到处找了,但我还没有完全弄清楚我遗漏了什么。从我阅读的内容来看,可能我没有设置NOCOUNT(或设置FEEDBACK OFF),但我找不到如何在VBA代码中真正做到这一点。我最初尝试将数据插入到现有表中,因此我尝试创建一个临时表以将数据移动到其中

选项显式

子oracleQuery()

清除查询输出工作表

ws1.Cells.Clear
rst.Open StrQuery3, cnn
ws1.Range("A2").CopyFromRecordset rst
分配变量

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.RecordSet
Dim ConnectionString As String
Dim StrQuery As String
Dim StrQuery2 As String
Dim StrQuery3 As String
Dim StrQuery4 As String
此查询创建一个空白的全局临时表(带有列标题)

这是我的插入查询

StrQuery2 = "INSERT INTO temp_1 (Field1,Field2,Field3,..etc) Select From 
      Where UNION ALL Select From Where UNION ALL..Etc
此查询从temp表中选择数据,并将一些附加字段与详细信息连接起来

StrQuery3 = "Select temp_1. Etc....
此查询用于在我完成临时表时删除它

StrQuery4 = "DROP TABLE temp_1"
这是我的连接字符串

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(XXX)(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=XXX)(Port=XXX))(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
cnn.Close
打开与数据库的连接,并设置超时计时器

cnn.Open ConnectionString
cnn.CommandTimeout = 60
cnn.Open ConnectionString
cnn.CommandTimeout = 60
执行临时表查询

cnn.Execute StrQuery
StrQuery = "CREATE GLOBAL TEMPORARY TABLE temp_1( GALOTIDX Number(9, 0), LOTID VARCHAR2(12 BYTE), LOTDESCR VARCHAR2(40 BYTE))"
执行插入查询

cnn.BeginTrans
cnn.Execute StrQuery2
cnn.CommitTrans
对临时表执行select查询,使用记录集

rst.Open StrQuery3, cnn
下降温度表

cnn.Execute StrQuery4
将记录集中的所有结果转储到活动工作簿中第一张工作表的单元格A2中

ws1.Range("A2").CopyFromRecordset rst
清空连接字符串

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(XXX)(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=XXX)(Port=XXX))(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
cnn.Close
关闭并清除记录集

rst.Close
Set rst = Nothing
端接头

最好确定是什么导致我的Insert查询不插入数据。我将非常感谢任何关于这个问题的见解,因为我已经没有什么想法要检查了

更新我简化了代码,以便深入研究我的问题。我的问题是INSERT INTO查询实际上并没有向表中插入任何数据。我尝试在3列和3行数据中插入结果的Select查询

临时表查询

cnn.Execute StrQuery
StrQuery = "CREATE GLOBAL TEMPORARY TABLE temp_1( GALOTIDX Number(9, 0), LOTID VARCHAR2(12 BYTE), LOTDESCR VARCHAR2(40 BYTE))"
插入到查询字符串中

StrQuery2 = "Insert INTO temp_1 (GALOTIDX, LOTID, LOTDESCR)"
StrQuery2 = StrQuery2 + " Select LotIdx, ID1, Descr1 From DataTable1"
查询最终选择

StrQuery3 = "Select * From temp_1"
删除临时表的查询

StrQuery4 = "DROP TABLE temp_1"
cnn.Execute StrQuery
cnn.Execute StrQuery4
生成连接字符串

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(XXX)(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=XXX)(Port=XXX))(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
cnn.Close
打开与数据库的连接,并设置超时计时器

cnn.Open ConnectionString
cnn.CommandTimeout = 60
cnn.Open ConnectionString
cnn.CommandTimeout = 60
创建临时表

StrQuery4 = "DROP TABLE temp_1"
cnn.Execute StrQuery
cnn.Execute StrQuery4
执行Insert Into查询

Dim recordsAffected As Integer

cnn.BeginTrans
cnn.Execute StrQuery2, recordsAffected
cnn.CommitTrans
从临时表中选择数据并转储到工作表中

ws1.Cells.Clear
rst.Open StrQuery3, cnn
ws1.Range("A2").CopyFromRecordset rst
下降温度表

StrQuery4 = "DROP TABLE temp_1"
cnn.Execute StrQuery
cnn.Execute StrQuery4
清空连接字符串

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(XXX)(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=XXX)(Port=XXX))(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"
ConnectionString = ""
cnn.Close

看起来您的
commit
可能正在删除您的行

发件人:

ON COMMIT指定对全局临时表执行的操作 当执行提交操作时

删除行如果没有可保留的行,表中的所有行都将被删除 光标在表上打开这是提交时的默认值。 如果指定在回滚时删除行,这将删除所有行 仅当使用临时表时才在表中显示。提交时删除 行将删除表中的行,即使未使用该表 (如果表上没有打开的可保持光标)

保留行将保留表中的行


看起来您的
commit
可能正在删除您的行

发件人:

ON COMMIT指定对全局临时表执行的操作 当执行提交操作时

删除行如果没有可保留的行,表中的所有行都将被删除 光标在表上打开这是提交时的默认值。 如果指定在回滚时删除行,这将删除所有行 仅当使用临时表时才在表中显示。提交时删除 行将删除表中的行,即使未使用该表 (如果表上没有打开的可保持光标)

保留行将保留表中的行


我相信temp表只在每个会话中可见,因此您无法看到来自不同会话的内容,而不是用于创建它的会话。问题可能是,在尝试读取数据之前,您正在关闭然后重新打开连接。当逐行执行代码时,我在运行临时表查询并看到它已创建后检查了(Oracle软件),当我运行查询以删除临时表时,我可以看到它已被删除。我的解释是,如果我能看到创建和删除,我应该能够看到是否插入了数据。另外,我代码中的select查询也没有得到任何结果。我是否遗漏了代码中的某些连接?TBH您发布的内容不够全面,无法真正了解发生了什么-不清楚您是使用单个连接连续执行了所有步骤,还是没有执行。创建一个非常精简的示例可能会有所帮助,您可以完整地发布该示例,但它仍然显示了相同的问题。设置NOCOUNT ON和设置FEEDBACK OFF更像是SQLPLus命令,我从来没有在该工具之外使用过它们。有什么有助于展示它们?有关插入查询的更多详细信息?我的问题是Insert查询非常庞大。它的内容似乎相当简单,它由几个Select查询组成,每个查询之间都有联合。它本身就能正常工作。在发布更多细节时,我应该使用什么焦点?我想一些简单的东西-李