获取 Oracle table 中所有列的最大值(长度(列))
Get max(length(column)) for all columns in an Oracle table
我需要在一堆 table 中获取每列的最大数据长度。我可以单独执行每个 table,但我正在寻找一种方法来至少遍历 table 中的所有列。
我目前正在使用下面的查询来获取每列的最大值-
select max(length(exampleColumnName))
from exampleSchema.exampleTableName;
我基本上是用 table 中的每一列替换 exampleColumnName。
我已经经历了 3-4 个线程,但其中 none 个线程对我有用,因为它们不是针对 Oracle 的,或者它们有我需要的更多详细信息(而且我无法选择我需要的部分) .
相比 PLSQL,我更愿意在 SQL 中使用它,因为我没有任何创建权限,也无法创建任何 PLSQL对象。
下面的查询有效 -
DECLARE
max_length INTEGER; --Declare a variable to store max length in.
v_owner VARCHAR2(255) :='exampleSchema'; -- Type the owner of the tables you are looking at
BEGIN
-- loop through column names in all_tab_columns for a given table
FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and table_name = 'exampleTableName') LOOP
EXECUTE IMMEDIATE
-- store maximum length of each looped column in max_length variable
'select nvl(max(length('||t.column_name||')),0) FROM '||t.table_name
INTO max_length;
IF max_length >= 0 THEN -- this isn't really necessary but just to ignore empty columns. nvl might work as well
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||max_length ); --print the tableName, columnName and max length
END IF;
END LOOP;
END;
如果评论充分解释了它,请告诉我,否则我会努力做得更好。删除 table_name = 'exampleTableName'
也可能会循环所有表,但现在这对我来说没问题。
你可以试试这个;虽然它使用 PL/SQL,但它会在 SQL-Plus 内工作。它不循环。希望您没有太多的列,以至于 SELECT
查询无法容纳 32,767 个字符!
SET SERVEROUTPUT ON
DECLARE
v_sql VARCHAR2(32767);
v_result NUMBER;
BEGIN
SELECT 'SELECT GREATEST(' || column_list || ') FROM ' || table_name
INTO v_sql
FROM (
SELECT table_name, LISTAGG('MAX(LENGTH(' || column_name || '))', ',') WITHIN GROUP (ORDER BY NULL) AS column_list
FROM all_tab_columns
WHERE owner = 'EXAMPLE_SCHEMA'
AND table_name = 'EXAMPLE_TABLE'
GROUP BY table_name
);
EXECUTE IMMEDIATE v_sql INTO v_result;
DBMS_OUTPUT.PUT_LINE(v_result);
END;
/
我需要在一堆 table 中获取每列的最大数据长度。我可以单独执行每个 table,但我正在寻找一种方法来至少遍历 table 中的所有列。
我目前正在使用下面的查询来获取每列的最大值-
select max(length(exampleColumnName))
from exampleSchema.exampleTableName;
我基本上是用 table 中的每一列替换 exampleColumnName。 我已经经历了 3-4 个线程,但其中 none 个线程对我有用,因为它们不是针对 Oracle 的,或者它们有我需要的更多详细信息(而且我无法选择我需要的部分) .
相比 PLSQL,我更愿意在 SQL 中使用它,因为我没有任何创建权限,也无法创建任何 PLSQL对象。
下面的查询有效 -
DECLARE
max_length INTEGER; --Declare a variable to store max length in.
v_owner VARCHAR2(255) :='exampleSchema'; -- Type the owner of the tables you are looking at
BEGIN
-- loop through column names in all_tab_columns for a given table
FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and table_name = 'exampleTableName') LOOP
EXECUTE IMMEDIATE
-- store maximum length of each looped column in max_length variable
'select nvl(max(length('||t.column_name||')),0) FROM '||t.table_name
INTO max_length;
IF max_length >= 0 THEN -- this isn't really necessary but just to ignore empty columns. nvl might work as well
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||max_length ); --print the tableName, columnName and max length
END IF;
END LOOP;
END;
如果评论充分解释了它,请告诉我,否则我会努力做得更好。删除 table_name = 'exampleTableName'
也可能会循环所有表,但现在这对我来说没问题。
你可以试试这个;虽然它使用 PL/SQL,但它会在 SQL-Plus 内工作。它不循环。希望您没有太多的列,以至于 SELECT
查询无法容纳 32,767 个字符!
SET SERVEROUTPUT ON
DECLARE
v_sql VARCHAR2(32767);
v_result NUMBER;
BEGIN
SELECT 'SELECT GREATEST(' || column_list || ') FROM ' || table_name
INTO v_sql
FROM (
SELECT table_name, LISTAGG('MAX(LENGTH(' || column_name || '))', ',') WITHIN GROUP (ORDER BY NULL) AS column_list
FROM all_tab_columns
WHERE owner = 'EXAMPLE_SCHEMA'
AND table_name = 'EXAMPLE_TABLE'
GROUP BY table_name
);
EXECUTE IMMEDIATE v_sql INTO v_result;
DBMS_OUTPUT.PUT_LINE(v_result);
END;
/