【问题标题】:Simplifying a complex SQL query into a simple query将复杂的 SQL 查询简化为简单的查询
【发布时间】:2021-11-12 03:48:01
【问题描述】:

以下查询生成select 语句。而不是生成select 语句,我希望查询执行正在生成的select 语句,并显示TABLE_NAME, COLUMN_NAME, DATA_TYPEMAX(COLUMN_SIZE),并将结果按TABLE_NAMEsort 分组在descending 的顺序中,基于LOB columnmax 大小。

select table_name, 
       column_name,
       data_type,
       'select (max(length(' || COLUMN_NAME || '))/(1024)) as "Size in KB" from '
       || owner || '.' || TABLE_NAME ||';' "querytogetlobsize" 
from dba_tab_cols 
where owner='&SCHEMA' 
  and data_type in ('CLOB','BLOB','NCLOB');

谁能帮我生成查询。非常感谢您提前提供的帮助!

【问题讨论】:

  • 动态查询不能单步执行。你不能在 SQL 中做到这一点。 PLSQL 会是你的选择吗?
  • 这在 SQL 中是不可能的。您不能选择元数据(表和列名称)并在同一查询中使用此信息从表和列中选择数据。你可以做的,艰难的,是生成单个查询而不是多个单独的查询。但是“按 table_name 对结果进行分组”和“显示 COLUMN_NAME”是什么意思?如果按表名分组,每个表只有一行,那么你会选择其中的哪一列?

标签: sql oracle plsql oracle12c


【解决方案1】:

它是动态 SQL。

SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     l_size  NUMBER;
  3  BEGIN
  4     FOR cur_r
  5        IN (SELECT table_name,
  6                   column_name,
  7                   data_type,
  8                      'select (max(length('
  9                   || COLUMN_NAME
 10                   || '))/(1024)) as "Size in KB" from '
 11                   || owner
 12                   || '.'
 13                   || TABLE_NAME querytogetlobsize
 14              FROM all_tab_cols
 15             WHERE     owner = 'SCOTT'
 16                   AND data_type IN ('CLOB', 'BLOB', 'NCLOB'))
 17     LOOP
 18        EXECUTE IMMEDIATE cur_r.querytogetlobsize
 19           INTO l_size;
 20
 21        DBMS_OUTPUT.put_line (
 22              RPAD (cur_r.table_name, 20, ' ')
 23           || ' - '
 24           || RPAD (cur_r.column_name, 20, ' ')
 25           || ': '
 26           || TO_CHAR (l_size, '999G990D00'));
 27     END LOOP;
 28  END;
 29  /

导致

DUGOTRAJNO       - KRAJ_BLOB           :    1.708,98
DUGOTRAJNO       - POCETAK_BLOB        :    2.596,62
OSOBA            - PHOTO               :      390,32
OSOBA            - FAKSIMIL            :       23,18
ZAHTJEV_PUTNI_NA - NALOG_BLOB          :   16.286,69
ZAHTJEV_PUTNI_NA - POZIV_BLOB          :   25.609,50

PL/SQL procedure successfully completed.

SQL>

【讨论】:

  • 非常感谢@Littlefoot 的工作就像一个魅力。我有一个小问题,请您解释一下这种格式TO_CHAR (l_size, '999G990D00')
  • 不客气。 TO_CHAR 只是很好地格式化输出(如您在屏幕上所见);您不必使用它,然后您会在小数点字符右侧得到一堆数字,并且数千不会被组字符分隔(我的数据库中的点)。
  • 再次感谢!你拯救了我的一天。周末愉快:)
猜你喜欢
  • 2011-07-02
  • 2012-11-17
  • 2021-01-11
  • 2016-08-18
  • 2012-09-06
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多