如何计算表中包含PK(PL-SQL)的列数

时间:2019-04-07 13:32:31

标签: sql oracle plsql

简介

我遇到了这个练习,要求我编写一个脚本,该脚本计算有多少行,有多少列以及PK,有多少和消耗的存储空间。

阅读文档时,我发现了以下有用的内容:

ANALYZE TABLE table_name COMPUTE STATISTICS FOR TABLE;

此行收集给定table_name的统计信息,然后可以这样访问该统计信息:

SELECT *
FROM user_tables
WHERE table_name LIKE 'table_name'

在这里,它从我们之前输入的表中显示了很多内容,但是我找不到具有PK的列数以及该表消耗的存储空间。

我的TRY AT PL-SQL是:

DECLARE

    v_nom_table VARCHAR2(10);
    v_num_rows NUMBER(100);
    v_num_col_pk NUMBER(100);
    v_num_storage NUMBER(100);

BEGIN

    v_nom_table := &input_nom_table;

    ANALYZE TABLE v_nom_table COMPUTE STATISTICS FOR TABLE;

    SELECT num_row INTO v_num_rows 
    FROM user_tables
    WHERE UPPER(table_name) LIKE UPPER(v_nom_table )

    DBMS_OUTPUT.PUT_LINE(
        'La tabla ' || v_nom_table || ' tiene: ' || v_num_rows || ' filas, ' 
         || v_num_col_pk || ' columnas con PK y ocupa ' || v_num_storage
    );

问题

如何获取给定表中PK涉及的列数和消耗的存储空间?

1 个答案:

答案 0 :(得分:3)

列出表主键中涉及的列的典型解决方案是:

  • 查询Oracle视图USER_CONSTRAINTS(或ALL_CONSTRAINTS)以查找与该表的主键(CONSTRAINT_TYPE = P)相关的记录
  • 然后在视图USER_CONS_COLUMNS中查看相关列

考虑:

SELECT COUNT(*)
FROM user_constraints cons
INNER JOIN user_cons_columns cols ON cons.constraint_name = cols.constraint_name
WHERE cons.constraint_type = 'P' AND cons.table_name = ?

在计算给定表占用的存储空间时,这是一个不同的问题。一种解决方案是使用视图BLOCKS中的列USER_TABLES。您所要做的就是将该值乘以ALL_TABLESPACES视图中BLOCK_SIZE列中存储表的表空间的块大小。