大势趋007

每个人都是🏆
  新随笔  :: 管理

oracle 执行计划原来这样打印的

Posted on 2025-09-02 11:06  大势趋007  阅读(6)  评论(0)    收藏  举报
DECLARE
  l_cursor      INTEGER;
  l_col_cnt     INTEGER;
  l_desc_tab    DBMS_SQL.DESC_TAB;
  l_sql_query   VARCHAR2(1000) := 'SELECT * FROM orders';
  l_data_type   VARCHAR2(50);
BEGIN
  l_cursor := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(l_cursor, l_sql_query, DBMS_SQL.NATIVE);
  DBMS_SQL.DESCRIBE_COLUMNS(l_cursor, l_col_cnt, l_desc_tab);
  
  DBMS_OUTPUT.PUT_LINE('Column Details:');
  DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------------------------------');
  DBMS_OUTPUT.PUT_LINE(RPAD('Column Name', 20) || RPAD('Type', 15) || RPAD('Length', 10) || RPAD('Precision', 12) || RPAD('Scale', 10) || 'Nullable');
  DBMS_OUTPUT.PUT_LINE('----------------------------------------------------------------------------------------');
  
  FOR i IN 1 .. l_col_cnt LOOP
    -- 将数字类型代码转换为可读的名称
    l_data_type := CASE l_desc_tab(i).col_type
                    WHEN 1 THEN   'VARCHAR2'
                    WHEN 2 THEN   'NUMBER'
                    WHEN 12 THEN  'DATE'
                    WHEN 96 THEN  'CHAR'
                    WHEN 180 THEN 'TIMESTAMP'
                    WHEN 112 THEN 'CLOB'
                    ELSE          'UNKNOWN(' || l_desc_tab(i).col_type || ')'
                   END;
    
    DBMS_OUTPUT.PUT_LINE(
      RPAD(l_desc_tab(i).col_name, 20) ||
      RPAD(l_data_type, 15) ||
      RPAD(NVL(TO_CHAR(l_desc_tab(i).col_max_len), 'N/A'), 10) ||
      RPAD(NVL(TO_CHAR(l_desc_tab(i).col_precision), 'N/A'), 12) ||
      RPAD(NVL(TO_CHAR(l_desc_tab(i).col_scale), 'N/A'), 10) ||
      CASE WHEN l_desc_tab(i).col_null_ok THEN 'Y' ELSE 'N' END
    );
  END LOOP;
  
  DBMS_SQL.CLOSE_CURSOR(l_cursor);
END;
/

fe25769d-558a-452c-996f-085517b96210