【发布时间】:2019-12-11 06:49:39
【问题描述】:
我正在尝试获取单个查询来返回每个表的行数。
通过以下查询,我得到了列出的表,但其中一些行数 返回不正确。
SELECT
TABLE_NAME,
NUM_ROWS
FROM
all_tables;
我在另一个问题的answer 中尝试了解决方案,但我只有读取权限,无法创建表或视图,因此出现错误:
PL/SQL: ORA-00942: 表或视图不存在
该问题中的其他答案似乎也使用了表或视图。
我在 Excel 中使用的 VBA 代码如下:
' Reference:
' Microsoft AtiveX Data Objects 6.1 Library
Private Sub NumberOfRowsOfEachTable()
Dim Connection As ADODB.Connection
Const ConnectionTimeout As Long = 0
Const ConnectionString As String = "Driver={Oracle in OraClient11g_home1}; Dbq=...;"
Const UserId As String = "..."
Const Password As String = "..."
Const CommandText As String = _
"DECLARE" & VBA.Constants.vbNewLine & _
" NUM_ROWS integer;" & VBA.Constants.vbNewLine & _
"BEGIN" & VBA.Constants.vbNewLine & _
" FOR RECORD IN (SELECT TABLE_NAME, OWNER FROM all_tables)" & VBA.Constants.vbNewLine & _
" LOOP" & VBA.Constants.vbNewLine & _
" EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || RECORD.TABLE_NAME INTO NUM_ROWS;" & VBA.Constants.vbNewLine & _
" INSERT INTO STATS_TABLE(TABLE_NAME, SCHEMA_NAME, RECORD_COUNT, CREATED)" & VBA.Constants.vbNewLine & _
" VALUES (RECORD.TABLE_NAME, RECORD.OWNER, NUM_ROWS, SYSDATE);" & VBA.Constants.vbNewLine & _
" END LOOP;" & VBA.Constants.vbNewLine & _
"END;"
Dim Recordset As ADODB.Recordset
Dim Fields As ADODB.Fields
Dim Field As ADODB.Field
Dim Value As String
Set Connection = New ADODB.Connection
Connection.ConnectionTimeout = ConnectionTimeout
Connection.ConnectionString = ConnectionString
Connection.Open UserId:=UserId, Password:=Password
Set Recordset = Connection.Execute(CommandText:=CommandText)
Set Fields = Recordset.Fields
Set Field = Fields.Item(Index:=0)
Value = VBA.CStr(Expression:=Field.Value)
Set Field = Nothing
Set Fields = Nothing
Recordset.Close
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing
MsgBox Prompt:=Value
End Sub
ODBC 驱动是 OraClient11g_home1(版本 11.02.00.01)中的 Oracle。
【问题讨论】:
-
This answer 在链接的问题中既不使用 PL/SQL 也不使用视图
标签: sql oracle plsql oracle11g odbc