我在Oracle中有一个数据库。我使用以下代码成功查询了它:
Sub AnalyzeDBATables()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim col As Integer
Dim row As Integer
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open ( _
"User ID=" & _
";Password=" & _
";Data Source=" & _
";Provider=MSDAORA.1")
rs.Open "select * from dba_tables", cn
col = 0
' First Row: names of columns
Do While col < rs.Fields.Count
Cells(1, col + 1) = rs.Fields(col).Name
col = col + 1
Loop
' Now actual data as fetched from select statement
row = 1
Do While Not rs.EOF
row = row + 1
col = 0
Do While col < rs.Fields.Count
Cells(row, col + 1) = rs.Fields(col).Value
col = col + 1
Loop
rs.MoveNext
Loop
End Sub
它似乎适用于简单的SQL语句。但是我的问题出现在从使用DBMS_OUTPUT.put_line
的一些相当长的PLSQL代码中检索数据。我的结束数据以CSV值返回。
更明显的解决方案可能是尝试在最后将此输出转换为Oracle中的真实表,并使用SELECT与上面的代码来收集它。但是我只读过数据库的权限,所以我真的需要能够收集输出。
有没有办法从DBMS_OUTPUT.put_line
收集响应,然后我可以在宏中解析。我甚至试过DBMS_OUTPUT.put_line('Hi');
的简单收获,但收到错误runtime error 3704
让我知道你的想法是什么!
答案 0 :(得分:1)
生产数据库中的一个过程,其主要目的是写入dbms_output
缓冲区,希望调用者分配这样的缓冲区,它具有足够的大小,并且调用者从缓冲区中读取并执行数据的某些东西是可怕的架构方法。 dbms_output
对于编写一些非常基本的调试非常有用。不应该依赖该程序的主要目的。
也就是说,如果您想要读取写入dbms_output
的数据,则需要使用dbms_output.get_line
or dbms_output.get_lines
procedure。在Excel宏中,我希望您需要编写一个调用dbms_output.get_line
的循环,直到返回的status
为1。