如何获取 varchar2
列中允许的最大和最小长度。
我必须测试来自某个远程数据库的临时表的传入数据。并且要针对特定列测试每一行值是否具有可以设置到该列中的最大值或最小值。
所以我要使用其架构详细信息来获取列规范。我确实为此创建了一个proc
:
PROCEDURE CHK_COL_LEN(VAL IN VARCHAR2,
MAX_LEN IN NUMBER :=4000,
MIN_LEN IN NUMBER :=0,
LEN_OUT OUT VARCHAR2)
IS
BEGIN
IF LENGTH(VAL)<MIN_LEN THEN
LEN_OUT := 'ERROR';
RETURN;
ELSIF LENGTH(VAL)>MAX_LEN THEN
LEN_OUT := 'ERROR';
RETURN;
ELSE
LEN_OUT := 'SUCCESS';
RETURN;
END IF;
END;
END CHK_COL_LEN;
但问题是,它不可重用,而且有点硬编码。我必须显式发送每个值的 MAX
和 MIN
值以及要检查的数据。
因此,在 proc
调用中,类似于:
CHK_COL_LEN(EMP_CURSOR.EMP_ID, 5, 1, LEN_ERROR_MSG);
我想要类似的东西:(如果存在这样的东西!)
CHK_COL_LEN(EMP_CURSOR.EMP_ID,
EMP.COLUMN_NAME%MAX_LENGTH,
EMP.COLUMN_NAME%MIN_LENGTH,
LEN_ERROR_MSG)
提前致谢。
编辑
select max(length(col)) from table;
这是一个解决方案,但我再次必须每次运行此查询来设置 MAX 和 MIN 值的两个变量。当有大约 32 个表,每个表有 5-8 个 varchar2 列,每个表中平均行数约为 40k-50k 时,为每个值运行额外的两个查询,然后设置 2 个变量将导致性能显着损失
最佳答案
您可以查询表“user_tab_columns table”来检索特定表的元数据信息:
SELECT
COLUMN_NAME, DATA_LENGTH, DATA_PRECISION
FROM
user_tab_columns
WHERE
t.table_name IN ('<YOURTABLE>');
使用此信息,您可以直接在存储过程中查询元数据:
...
SELECT
CHAR_LENGTH INTO max_length
FROM
user_tab_columns
WHERE
table_name = '<YOURTABLE>' AND COLUMN_NAME = '<YOURCOLUMN>';
...
获取表/列的最大长度的示例过程:
create or replace PROCEDURE GET_MAX_LENGTH_OF_COLUMN(
tableName IN VARCHAR2,
columnName IN VARCHAR2,
MAX_LENGTH OUT VARCHAR2)
IS
BEGIN
SELECT CHAR_LENGTH INTO MAX_LENGTH
FROM user_tab_columns
WHERE table_name = tableName AND COLUMN_NAME = columnName;
END GET_MAX_LENGTH_OF_COLUMN;
关于sql - 获取列中允许的最大长度 |甲骨文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483766/