【问题标题】:Query the number of rows of each table in Oracle 11g without create view permissions [duplicate]在没有创建视图权限的情况下查询Oracle 11g中每个表的行数[重复]
【发布时间】: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


【解决方案1】:

您不需要create view 权限;您从中获取该代码的答案不会创建表或视图。如果 Oracle 告诉您它找不到哪个表/视图,但遗憾的是,它从来没有找到,那将会很有帮助。

问题是您已从该答案中删除了所有者过滤器,即这一位:

where owner = 'SCHEMA_NAME'

但即便如此,如果该架构不是您当前的架构,那么它仍然可能无法找到表。 (如果您只查看自己的架构,请改用user_tables。)

您需要在计数查询中包含所有者,因此:

"  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || RECORD.TABLE_NAME INTO NUM_ROWS;" & VBA.Constants.vbNewLine & _

变成:

"  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || RECORD.OWNER || '.' || RECORD.TABLE_NAME INTO NUM_ROWS;" & VBA.Constants.vbNewLine & _

如果您为模式/用户/所有者(都是相同的东西)或表名引用了标识符,那么您需要将它们括在双引号中,您必须将其转义 - 但是 VBA 会这样做。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多