如何为number类型变量设置指定取值范围,实现1到13等区间值限制
你尝试的varname number(2,0) range 1..13语法确实不符合Oracle SQL/PLSQL的规范,不需要特意改用integer类型,不管用NUMBER还是INTEGER都可以通过**检查约束(CHECK CONSTRAINT)**实现取值范围限制,具体实现方式分两种常见场景:
场景1:PL/SQL程序块内的局部变量
直接在变量声明时加检查约束即可,两种类型的写法如下:
-- 用NUMBER(2,0)实现 DECLARE varname NUMBER(2,0) CONSTRAINT check_var_range CHECK (varname BETWEEN 1 AND 13); BEGIN varname := 5; -- 赋值合法,正常执行 varname := 14; -- 赋值超出范围,触发约束报错 END; / -- 用INTEGER实现,逻辑完全一致 DECLARE varname INTEGER CONSTRAINT check_var_range CHECK (varname BETWEEN 1 AND 13); BEGIN -- 业务逻辑 END; /
如果这个范围规则要在同一个程序块内多次复用,可以先定义子类型,减少重复代码:
DECLARE SUBTYPE num_1_to_13 IS NUMBER(2,0) CHECK (VALUE BETWEEN 1 AND 13); -- 后续所有同范围变量都可以直接用这个子类型声明 var1 num_1_to_13; var2 num_1_to_13; BEGIN -- 业务逻辑 END; /
场景2:数据库表的列定义
给表字段加检查约束即可:
CREATE TABLE demo_table ( -- 用NUMBER(2,0) varname NUMBER(2,0) CONSTRAINT check_var_range CHECK (varname BETWEEN 1 AND 13) -- 用INTEGER也可以,写法替换为:varname INTEGER CONSTRAINT check_var_range CHECK (varname BETWEEN 1 AND 13) );
如果范围规则要在多个表/变量中复用,也可以创建全局自定义类型:
CREATE OR REPLACE TYPE num_1_to_13 IS NUMBER(2,0) CONSTRAINT check_num_range CHECK (VALUE BETWEEN 1 AND 13); /
类型选择说明
INTEGER本质是NUMBER(38,0)的别名,你的取值范围只有1-13,用NUMBER(2,0)反而更节省存储空间,完全没有必要特意切换成INTEGER类型。
内容的提问来源于stack exchange,提问作者dcd
相关产品推荐
相关产品推荐

