如何在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值的两个变量。对每个值运行额外的两个查询,然后设置2个变量,如果有大约32个表,每个表有5-8个varchar2列,每个表的平均行数约为40k-50k,那么性能将大大降低。
答案 0 :(得分:4)
您可以查询表'user_tab_columns表'以检索特定表的元数据信息:
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;
答案 1 :(得分:1)
尝试创建这样的程序:
create or replace procedure Checking_size(column_name varchar2,columnvalue varchar2,state out varchar2) is
begin
execute immediate 'declare
z '||column_name||'%type;
begin
z:=:param2;
end;' using columnvalue;
state:='OK';
exception when value_error then
state:='NOT OK';
end;
正如您所见,我模拟了错误分配。如果columnvalue
长度大于我传递为column_name
的列,则会抛出value_error异常并返回NOT OK
,否则返回OK
。
例如,如果your_table.your_column
引用长度为(3)的列,则返回NOT OK
。
declare
state varchar2(10);
begin
Checking_size('your_table.your_column','12345',state);
dbms_output.put_line(state);
end;
答案 2 :(得分:0)
如果表格列表不多,您可以使用表格中的CHECK Constraint指定MIN值。
如果超过分配给该列的长度,表上的任何DML都将自动失败。
CREATE TABLE suppliers
(
supplier_id numeric(4),
supplier_name varchar2(50),
CONSTRAINT check_supplier_id
CHECK (length(supplier_name) > 5 )
);