6 sql oracle vba ado excel-vba
这两个语句类似,但第二个语句导致Excel每次执行时崩溃.唯一的区别是model和之间model return updated rows(我特意设计了这个最小的例子,以便在任何一种情况下查询都返回完全相同的数据,我的真实世界的SQL当然是不同的):
select *
from( select *
from ( select 1 id, 100 val from dual
union all
select 2 id, 200 val from dual )
model
dimension by (id)
measures (val)
rules ( val[1] = val[cv()]+1 ) )
where val=101
Run Code Online (Sandbox Code Playgroud)select *
from( select *
from ( select 1 id, 100 val from dual
union all
select 2 id, 200 val from dual )
model return updated rows
dimension by (id)
measures (val)
rules ( val[1] = val[cv()]+1 ) )
where val=101
Run Code Online (Sandbox Code Playgroud)这是ADO中的一个错误的孤立示例,还是有一个已知的SQL语句类崩溃了解析器(我甚至不确定为什么ADO会解析语句而不是只是将它传递给数据库).
以下是崩溃版本的完整VBA代码:
Option Explicit
Sub Go()
Dim lConn As ADODB.Connection
Dim lRecordset As ADODB.Recordset
'Dim lRecordset
Dim sSQL As String
Set lConn = New ADODB.Connection
Set lRecordset = New ADODB.Recordset
'Set lRecordset = CreateObject("ADODB.Recordset")
lConn.Open "Provider=MSDAORA;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=devdb)(PORT=1521)))(CONNECT_DATA=(SID=oracle)(SERVER=DEDICATED)));User Id=csuk;Password=thisisnotmyrealpassword;"
With lRecordset
sSQL = "select * " & _
"from( select * " & _
" from ( select 1 id, 100 val from dual " & _
" Union all " & _
" select 2 id, 200 val from dual ) " & _
" model return updated rows " & _
" dimension by(id) " & _
" measures (val) " & _
" rules ( val[1] = val[cv()]+1 ) ) " & _
"where val=101"
.Open sSQL, lConn
While Not .EOF
Sheets(1).Cells(1, 1) = ![Val]
.MoveNext
Wend
.Close
End With
Set lRecordset = Nothing
lConn.Close
Set lConn = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
在回复评论时,我尝试使用DAO使用相同的SQL,并且对于我的困惑,我们得到了相同的结果.以下代码崩溃Excel,但删除return updated rows它是使它按预期工作所需的全部内容:
Option Explicit
Sub Go()
Dim lWorkspace As DAO.Workspace
Dim lDatabase As DAO.Database
Dim lRecordset As DAO.Recordset
Dim sSQL As String
sSQL = "select * " & _
"from( select * " & _
" from ( select 1 id, 100 val from dual " & _
" Union all " & _
" select 2 id, 200 val from dual ) " & _
" model return updated rows " & _
" dimension by(id) " & _
" measures (val) " & _
" rules ( val[1] = val[cv()]+1 ) ) " & _
"where val=101"
Set lWorkspace = DBEngine.Workspaces(0)
Set lDatabase = lWorkspace.OpenDatabase("", False, False, "Driver={Microsoft ODBC for Oracle};Server=devdb:1521/oracle;Uid=charts_csuk_uksoft;Pwd=thisisnotmyrealpassword;")
Set lRecordset = lDatabase.OpenRecordset(sSQL, dbOpenDynaset, dbSQLPassThrough)
With lRecordset
While Not .EOF
Sheets(1).Cells(1, 1) = ![Val]
.MoveNext
Wend
End With
Set lRecordset = Nothing
Set lDatabase = Nothing
Set lWorkspace = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
这更像是一种解决方法,而不是解决方案,但它可能是隐藏任何 SQL 语句的选项,从而扰乱 ADO(或 Excel,就此而言)VIEW。对于动态语句(即在运行时更改视图),您可以考虑在EXECUTE IMMEDIATE CREATE OR REPLACE VIEW ...其中使用过程。