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

时间:2019-03-25 23:35:23

标签: excel vba

很抱歉,如果这是太多信息,但我想在发布时做到周密。

我一直在努力使临时表填充来自插入查询的数据的问题。

  • 此数据是从Oracle SQL表中提取的

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

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

  • 我可以在我的设置中使用“选择查询”(所以我不认为连接是问题)

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

我真正注意到的是,如果在执行插入查询时使用“记录集”,它确实表明存在受影响的行的预期数量,但是当我从数据库中选择“全部”(从Oracle软件)时,临时表中没有显示任何内容。

我一直在寻找,但是我还没有弄清楚我所缺少的。从我阅读的内容来看,可能是我没有将NOCOUNT设置为ON(或将FEEDBACK设置为OFF),但是我找不到在VBA代码中实际执行此操作的方法。我最初尝试将数据插入到现有表中,所以尝试创建一个临时表以将数据移入。

显式选项

Sub oracleQuery()

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = ActiveWorkbook.Worksheets("Query Output")
Set ws2 = ActiveWorkbook.Worksheets("Main Page")

清除查询输出工作表

ws1.Cells.Clear

分配变量

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

此查询将创建一个空白的Global Temp表(带有列标题)

StrQuery = "XXXXXX"

这是我的插入查询

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"

打开与数据库的连接,还设置超时计时器

cnn.Open ConnectionString
cnn.CommandTimeout = 60

执行临时表查询

cnn.Execute StrQuery

执行插入查询

cnn.BeginTrans
cnn.Execute StrQuery2
cnn.CommitTrans

在临时表上执行选择查询,使用记录集

rst.Open StrQuery3, cnn

放置临时表

cnn.Execute StrQuery4

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

ws1.Range("A2").CopyFromRecordset rst

清空连接字符串

ConnectionString = ""

关闭并清除记录集

rst.Close
Set rst = Nothing

结束子

最好确定实际上是什么导致我的插入查询不插入数据。由于我没有足够的想法来检查,因此我将不胜感激。

UPDATE 我简化了代码以磨练我的问题。我的问题是INSERT INTO查询实际上没有在表中插入任何数据。我正在尝试插入的选择查询会在3列和3行数据中插入结果。

临时表查询

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"

建立连接字符串

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

打开与数据库的连接,还设置超时计时器

cnn.Open ConnectionString
cnn.CommandTimeout = 60

创建临时表

cnn.Execute StrQuery

执行插入查询操作

Dim recordsAffected As Integer

cnn.BeginTrans
cnn.Execute StrQuery2, recordsAffected
cnn.CommitTrans

从临时表中选择数据并转储到工作表中

rst.Open StrQuery3, cnn
ws1.Range("A2").CopyFromRecordset rst

放置温度表

cnn.Execute StrQuery4

清空连接字符串

ConnectionString = ""
cnn.Close

1 个答案:

答案 0 :(得分:0)

您的commit可能正在删除您的行。

发件人:https://docs.oracle.com/javadb/10.8.3.0/ref/rrefdeclaretemptable.html

  

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

     

删除行如果没有可保持状态,则将删除表的所有行   光标在桌子上打开。 这是ON COMMIT的默认值。   如果指定ON ROLLBACK DELETE ROWS,则将删除所有行   仅当使用临时表时才在表中使用。提交删除   即使未使用表,ROWS也会删除表中的行   (如果表格上没有打开可保持的游标)。

     

PRESERVE ROWS将保留表的行。