我有一个数据库表,我需要利用表中的数据来告诉我有关数据库表中列出的表的段大小。
这里是其中一种数据的示例,它分为4列,并且有很多行:
TABLE_A TABLE_B JOIN_COND WHERE_CLAUSE
AZ AT A.AR_ID = B.AR_ID A.DE = 'AJS'
AZ1 AT1 A.AR_ID = B.AR_ID A.DE = 'AJS' AND B.END_DATE > '30-NOV-2015'
AZ2 AT3 A.AR_ID = B.AR_ID A.DE = 'AJS' AND B.END_DATE > '30-NOV-2015'
这是我需要完成的:
...
SELECT *
FROM TABLE_A a, TABLE_B b
WHERE A.AR_ID = B.AR_ID
AND A.FININS_CDE = 'AJS'
AND B.END_DTE > '30-NOV-2015'
...但是对于表中的每一行。因此,在过程结束时,如果表中有100行,我将得到200个结果:
答案 0 :(得分:1)
您将需要为此使用动态sql。 Oracle文档为here。
您需要为每个表构建一些动态sql:
SELECT TABLE_A, 'select segment_name,segment_type,bytes/1024/1024 MB
from dba_segments
where segment_type=''TABLE'' and segment_name=''' || TABLE_A || ''''
FROM <your meta data table>
然后,您需要loop遍历结果集并执行每个语句并捕获结果。有关here的一些信息。
执行完所有语句后,您将得到1的答案。
下一部分比较棘手,您需要为每个列查找数据类型的大小,然后将所有这些值加在一起,就可以得到一张表的一行的大小。您可以使用vsize来获取每一列的大小。
使用更多的动态sql,您可以构建实际的语句并将其作为SELECT COUNT(*)执行以获取实际的行数。将行数乘以每个表中整行的大小,您将得到答案。显然,您还需要另一个循环。
这一切有意义吗?