获取列中允许的最大长度神谕

时间:2014-12-15 12:09:17

标签: sql oracle maxlength

如何在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;

但问题是,它不可重用,而且有点硬编码。我必须为每个值明确发送MAXMIN值以及要检查的数据。

所以在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,那么性能将大大降低。

3 个答案:

答案 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 )
 );