【问题标题】:Error while executing SQL query in VBA在 VBA 中执行 SQL 查询时出错
【发布时间】:2012-11-18 07:32:46
【问题描述】:

在 VB 中执行以下查询时出现错误(我正在使用宏来运行此查询)。但在 ORACLE 中,相同的查询运行文件并给我预期的结果。 请注意,“XML_FIELD”是一个包含 XML 数据的 CLOB。我正在尝试使用 VB 宏从“XML_FIELD”中提取数据。

SQL 查询:执行良好:
---> select xmltype(XML_FIELD).extract('//XML_TAGNAME/text()').getStringVal() as NEW_COL from TAB_1 where TEST_ID = 123

VB 中的错误:SQL 执行错误 ora-00936 缺少表达式

VBA 中的查询:
子提取_CLOB()
将 SQL 调暗为字符串
将 OraDynaSet 调暗为对象
'评论:我使用两个单引号 (' ' ) 转义另一个单引号
SQL = "select xmltype(XML_FIELD).extract(''//XML_TAGNAME/text()'').getStringVal () 作为 NEW_COL 来自 TAB_1,其中 TEST_ID = 123"
设置 OraDynaSet = objDataBase.DBCreateDynaset(SQL, 0&)
结束子

【问题讨论】:

  • 进入调试模式,打印出SQL的值并贴出来。

标签: sql xml vba


【解决方案1】:

我试过这段代码,效果很好。我在 emp 表中添加了一个 clob 字段。

Public objSession As Object
Public objDataBase As Object

Sub ConnectToOracle()
    'Create a reference to the OO4O dll
    Set objSession = CreateObject("OracleInProcServer.XOraSession")
    'Create a reference to my database
    Set objDataBase = objSession.OpenDatabase("mydb", "scott/tiger", 0&)
    Dim strSQL As String
Dim strTxt As String
Dim OraDynaSet As Object

strSQL = "select xmltype(MyXMLField).extract('//ROWSET//ROW//JOB/text()').getStringVal() as NEW_COL from emp where empno = 2"

'Retrieve the results from Oracle
Set OraDynaSet = objDataBase.DBCreateDynaset(strSQL, 0&)

strTxt = CStr(OraDynaSet.Fields(0).Value)

MsgBox strTxt
End Sub

我的 xml 是:

<?xml version="1.0"?>
      <ROWSET>
         <ROW num="1">
            <EMPNO>7</EMPNO>
            <ENAME>S</ENAME>
            <JOB>CLERK</JOB>
            <MGR>7</MGR>
            <HIREDATE>12/17/2008 0:0:0</HIREDATE>
           <SAL>999</SAL>
           <DEPTNO>20</DEPTNO>
        </ROW>
     </ROWSET>

【讨论】:

  • 我使用了两个单引号来转义另一个。 extract(''//XML_TAGNAME/text()'') - 这里我使用了两个单引号('')
  • 您如何连接到 Oracle?您是使用 Oracle Objects for OLE 还是通过 ODBC?您是否尝试过运行其他 SQL 语句?
  • 下面是连接数据库的代码。我收到连接成功消息。其他查询工作正常。
    Private Sub StartConnection() '创建一个会话对象
    Set objSession = CreateObject("OracleInProcServer.XOraSession")
    dbName = .Cells(4, 3).Value
    dbUserName = .Cells(5, 3).Value
    dbPwd = .Cells(6, 3).Value
    设置 objDataBase = objSession.OpenDatabase(dbName, dbUserName & "/" & dbPwd, 0&)
    MsgBox "连接成功"
    'Set objDataBase = objSession.OpenDatabase("QTCSTG", "APPSRO/read0nly", 0&)
    Call Extract_CLOB
    End Sub
  • 很抱歉没有格式化上述评论。尝试给 2 个空格来插入换行符,并尝试使用
    ,仍然所有行都显示为内联。
  • 请按照 ElectricLlama 的建议使用调试模式在此处发布您的 SQL 变量的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多