VBA-запрос к базе данных Oracle иногда возвращает правильные значения, в других случаях ничего не возвращает - PullRequest
0 голосов
/ 25 февраля 2020

в моем коде Excel VBA я подключаюсь к базе данных oracle, чтобы запрашивать базу данных в различных случаях. В первый раз у меня был простой запрос, и он дал правильные результаты. Но во второй раз у меня сложный запрос, и набор записей проверяется на ноль, когда я выкидываю точную строку sqlString в Oracle SQL Developer, я получаю результаты. Так что я действительно озадачен тем, что здесь происходит.

Вот мой код:

Global ssConn As New adodb.Connection
Global connStr As String
Global rs As New adodb.Recordset

public sub init()  

    connStr = "Provider=OraOLEDB.Oracle; Data Source=XXXXX; user id=AAAAA;password=BBBBB"
    ssConn.Open connStr
    sqlStr = "select sector_no, sector_name from Sectors where sector_level =2"
    Set rs = ssConn.Execute(sqlStr)
    while not rs.EOF 
      do stuff 
    wend 
    ' other code ... 
    ' here I do get all the results correctly 
end sub 

Public Sub getSecurities()
  Dim sqlStr As String

  sqlStr = "select distinct a.isin, a.ticker, a.market_cap, a.ipo_date, a.gics2_sector from Constituent_Securities a, Index_Constituents b "
  sqlStr = sqlStr & " where b.index_ticker in ('SPX', 'RIY') and a.isin = b.isin and a.ipo_date <= '" & Format(cutoff_date, "dd-mmm-yyyy") & "' "
  sqlStr = sqlStr & " and exists (select * from Security_Price_Hist where isin = a.isin and business_date <= '" & Format(cutoff_date, "dd-mmm-yyyy") & "')"
  '--& "' and a.gics2_sector in (" & sectorStr & ")"

  sqlStr = "select sector_no, sector_name from Sectors where sector_level =2"

  Set rs = ssConn.Execute(sqlStr)


  'ReDim avail_secs(num_secs) As Security

  Dim i As Integer

  i = 0
  While Not rs.EOF
    avail_secs(i).sec_id = rs.Fields(0).Value
    avail_secs(i).ticker = rs.Fields(1).Value
    avail_secs(i).market_cap = rs.Fields(2).Value
    avail_secs(i).ipo_date = rs.Fields(3).Value
    avail_secs(i).sector = rs.Fields(4).Value

    rs.MoveNext
    i = i + 1
  Wend
  num_secs = i - 1
  rs.Close

End Sub

Public Sub generateEquityPortfolios()
  Call init
  Call getSecurities
  '... other codes 
end pub 

Итак, во время первой инициализации подпрограммы я получил правильные результаты, но в подпрограмме getSecurities rs.EOF всегда возвращал true, даже хотя, когда я копирую эту строку sql в Oracle SQL Developer, я получаю результаты.

Может кто-нибудь помочь, пожалуйста? И, что еще более странно, этот код работал нормально, но перестал работать после того, как обновилось также какое-то обновление системы с версией Oracle.

Большое спасибо!

Селсия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...