Oracle:如何从动态生成的查询中获取最大列长度?

时间:2016-01-30 01:10:19

标签: sql oracle plsql

假设我有一个像

这样的查询
select a.column1, b.column2, substr(b.column3,instr(b.column3,',')) as Column3
from tableA a, tableB b
where a.column1 = b.column1

如何获取此查询的每一列的最大字符长度?

如果tableA和tableB定义为

tableA ( column1 VARCAHR2(100))     
tableB ( column1 VARCAHR2(100), column2 INTEGER, column3 VARCAHR2(5000))

我想获得这些数据:

COLUMN1 : 100
COLUMN2 : 10
COLUMN3 : 5000

请记住,这是一个动态查询,限制范围内任意数量的表可能有任意数量的列。

2 个答案:

答案 0 :(得分:2)

您可以在查询(CTAS)中创建一个表格,然后使用user_tab_columns为您的新表格获取列data_length

create table temp as 
select a.column1, b.column2, substr(b.column3,instr(b.column3,',')) as Column3
from tableA a, tableB b
where a.column1 = b.column1
    --No need for store the data, unless you want the maximum size of current data.
    and 1 = 0;

select column_name, data_length from user_tab_columns where table_name = 'TEMP';

drop table temp;

这非常简单,您无需关心查询中的确切内容。 Oracle会为您解决这个问题。

顺便说一句。 VARCHAR2的最大大小为4000.除非您使用12c扩展数据类型,否则不能有5000。

答案 1 :(得分:0)

您可能必须访问USER_TAB_COLUMNS元数据表才能获得这些列长度

以下是一个示例查询

SELECT COLUMN_NAME
      ,CHAR_LENGTH
  FROM USER_TAB_COLUMNS 
 WHERE TABLE_NAME IN ('tableA', 'tableB')
   AND COLUMN_NAME IN ('column1', 'column2', 'column3')
;

如果您在生成的查询中需要上述内容,则需要更改为以下内容

select a.column1
     , b.column2
     , substr(b.column3,instr(b.column3,',')) as Column3
     , (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableA' AND COLUMN_NAME = 'column1') AS column1_size
     , (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableB' AND COLUMN_NAME = 'column2') AS column2_size
     , (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableB' AND COLUMN_NAME = 'column3') AS column3_size
  from tableA a
     , tableB b
 where a.column1 = b.column1

以上是这样做的一种方式。根据您要执行的操作以及生成查询的方式,我认为您希望将列大小放在单独的查询中,就像第一个查询一样,因为您在生成查询时已经知道了列和表名。 / p>

希望这会有所帮助..