精华内容
下载资源
问答
  • oracle调整字段精度的四种方法

    千次阅读 2020-09-15 21:18:10
    oracle调整字段精度的四种方法: 01_执行用户_ddl/dml_表名_注释(建表/授权/同义词) 调整方式一:(精度只能调大不能调小) alter table table_name_a MODIFY (column_AXX number(27,15)); 调整方式二:...

    oracle调整字段精度的四种方法:

    01_执行用户_ddl/dml_表名_注释(建表/授权/同义词)

    调整方式一:(精度只能调大不能调小)

    alter table table_name_a MODIFY (column_AXX number(27,15));

    调整方式二:(借用一个新的列调整)

    alter table table_name_a add (column_temp number(27,15));
    update table_name_a set column_temp = round(column_AXX,15);
    alter table table_name_a drop column column_AXX;
    alter table table_name_a add (column_AXX number(27,15));
    update table_name_a set column_AXX = column_temp;
    alter table table_name_a drop column column_temp;

    方式三:(在不影响数据使用的情况下,效率略低)

    alter table table_name_a add (column_temp number(30,15));
    update table_name_a set column_temp = round(column_AXX,15);
    update table_name_a set column_AXX = null;
    alter table table_name_a MODIFY (column_AXX number(30,15));
    update table_name_a set column_AXX = column_temp;
    alter table table_name_a drop column column_temp;

    方式四:重新创建一张符合要求的表,通过同义词切换使用(速度最快,效率最优)

    user_fu(建表):     create table table_name_b;
    user_fu(授权):     grant select, insert, update, delete on table_name_b to user_zi;
    user_fu(copy):     INSERT INTO  table_name_b SELECT * FROM table_name_a;
    user_zi(同义词):   create or replace synonym table_name_a for user_fu.table_name_b;

     

    展开全文
  • 对于oracle数据库varchar2类型的字段设计的字段,存储中文时一个汉字占3个字符,而数字、字母、符号占1个字符。导致接口校验字段内容长度时不方便,因此编写自定义注解用于校验这类字段的内容长度。 ...

    前言:

    对于Oracle数据库varchar2类型的字段设计的字段,存储中文时一个汉字占3个字符,而数字、字母、符号占1个字符。导致接口校验字段内容长度时不方便,因此编写自定义注解用于校验这类字段的内容长度。

    举个栗子:

    类型说明
    VARCHAR2(50 CHAR)按字符计数,可存储50个汉字
    VARCHAR2(50)按字节计数,根据字符集不同,gbk可存25个汉字,utf8可存16个汉字
    函数说明
    lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节
    length(string)计算string所占的字符长度:返回字符串的长度,单位是字符

    我们可以建表测试两种字段类型的区别:

    create table tb_test_length(
        char1 varchar2(20),
        char2 varchar2(20 char)
    );
    

    所建表的长度均为20,不过char1最多只能存储6个汉字,而char2能存储最多20个汉字:

    insert into tb_test_length values ('一二三四五六', '一二三四五六');
    insert into tb_test_length values ('一二三四五六', '一二三四五六七');
    insert into tb_test_length values ('一二三四五六七', '一二三四五六七'); -- 插入这条数据会报错
    

    报错截图
    使用lengthb函数查看成功插入数据char2的字节数:

    select t.CHAR2, LENGTHB (t.CHAR2) from tb_test_length t where CHAR1 = '一二三四五六';
    

    在这里插入图片描述


    JSR-303定义的长度检查注解

    注解说明
    @Size(min=, max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
    @Length(min=, max=)Validates that the annotated string is between min and max included.

    以上两个注解 @Size@Length均可用于String类型的字段长度校验,不过都是字符级别的长度检查。针对VARCHAR2(50)这种类型的数据表字段值的长度校验是有问题的。

    于是我们写一个自定义注解 @ValiStringByte

    import javax.validation.Constraint;
    import java.lang.annotation.*;
    
    @Constraint(validatedBy = {ValiStringByteValidator.class})
    @Documented
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ValiStringByte {
    	// 默认提示信息
        String message() default "{Character bytes are extremely long!}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    	
    	// 最大字节数,可以自行调整
        int max() default 2147483647;
    }
    

    还要为 @ValiStringByte 注解实现校验逻辑,实现ConstraintValidator接口,重写isValid方法:

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class ValiStringByteValidator implements ConstraintValidator<ValiStringByte, String> {
    
        private int max = 0;
    
        public void initialize(ValiStringByte valiStringByte) {
            max = valiStringByte.max();
        }
    
        /**
         * 重写校验逻辑
         *
         * @param string
         * @param constraintValidatorContext
         * @return
         */
        @Override
        public boolean isValid(String string, ConstraintValidatorContext constraintValidatorContext) {
            if (null != string) {
                int total = count(string);
                return total <= max;
            } else {
                return true;
            }
        }
    
        /**
         * 统计参数的字节数
         *
         * @param str
         * @return
         */
        private static Integer count(String str) {
            int total = 0; // 字节总数
    
            if (null == str || str.equals("")) {
                return total;
            }
    
            for (int i = 0; i < str.length(); i++) {
                char tmp = str.charAt(i);
                if ((tmp >= 'A' && tmp <= 'Z') || (tmp >= 'a' && tmp <= 'z')) {
                    total++;
                } else if ((tmp >= '0') && (tmp <= '9')) {
                    total++;
                } else if (tmp == ' ') {
                    total++;
                } else if (isChinese(tmp)) {
                    total += 3;
                } else {
                    total++;
                }
            }
            return total;
        }
    
        /**
         * 判断字符是否为汉字字符
         *
         * @param ch
         * @return
         */
        private static boolean isChinese(char ch) {
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch);
            return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
                    || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                    || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
                    || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION;
        }
    }
    

    测试:

    @Data
    public class ParamBean {
    	// 校验字段值字节数最长为20
        @ValiStringByte(max = 20)
        private String text;
    }
    
    @PostMapping(path = "/test")
    public void test(@RequestBody @Validated ParamBean bean) {
        logger.info(bean.toString());
    }
    

    调用接口:


    POST 127.0.0.1:8080/test  
    param: {"text": "一二三四五六12" }     一共20个Byte
    

    控制台正常打印:
    在这里插入图片描述


    POST 127.0.0.1:8080/test  
    param: {"text": "一二三四五六123" }     一共21个Byte
    

    控制台打印报错,说明能成功校验:
    org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument at index 0 in method: public void TestController.test(ParamBean), with 1 error(s): [Field error in object ‘paramBean’ on field ‘text’: rejected value [一二三四五六123]; codes [ValiStringByte.paramBean.text,ValiStringByte.text,ValiStringByte.java.lang.String,ValiStringByte]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [paramBean.text,text]; arguments []; default message [text],20]; default message [{Character bytes are extremely long!}]] …

    展开全文
  • oracle varchar2字段长度不够问题

    千次阅读 2020-07-17 10:49:39
    3.调整oracle字段,改至varchar2(500),保存成功 今天用户反馈bug,数据无法保存。于是把数据拉到本地代码测试跑一遍。可以保存成功。 跑到linux上tail -f,由于有3台节点,只能一台台看,总算拉到日志。 1.报...

    目录

    1.报错误

    2.上网搜了一下字符计算

    3.调整oracle字段,改至varchar2(500),保存成功


    今天用户反馈bug,数据无法保存。于是把数据拉到本地代码测试跑一遍。可以保存成功。

    跑到linux上tail -f,由于有3台节点,只能一台台看,总算拉到日志。

    1.报错误

    Caused by: java.sql.SQLException: ORA-12899: 列 "GAMC_DCS"."TT_SALE_ORDER_OCR"."CUSTOMER_ADRESS_OCR" 的值太大 (实际值: 101, 最大值: 100)

    保存的customer_address_ocr内容是:江西省鹰潭市高新技术产业开发区龙岗片区三纬路北侧、国贸饰品公司东侧鹰潭嘉能实业有限公司二号厂房01011室

    2.上网搜了一下字符计算

    varchar(50) 表示该字段类型为varchar2类型,长度为50,
    可以存单字节字符50个,如字母、数字等,可以存储双字节字符25个,如汉字。
    不同的是,若输入的不足,则以空格填充。

    varchar2(50) 表示该字段类型为varchar2类型,长度为50,可以存单字节字符50个,
    如字母、数字等,可以存储双字节字符25个,如汉字。

    nvarchar2(50)表示该字段类型为nvarchar2,长度为50,不论英文,数字,中文都能存50个。

    查询一下数据库编码
    select userenv('language') from dual;

    长度刚好超过了。

    3.调整oracle字段,改至varchar2(500),保存成功

     

    展开全文
  • Oracle修改表结构字段名和字段长度

    万次阅读 2015-12-01 12:16:34
    Oracle修改表字段名和长度的方式与标准的sql不一样,它需要增加特定的关键字。 使用rename关键字来实现字段名的修改:alter table 表名 rename column旧的字段名 to 新的字段名; alert table wtc column rename ...

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….);

    修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….);

    删除字段的语法:alter table tablename drop (column);

    创建表结构:
    create table test1
    (id varchar2(20) not null);

     

    增加一个字段:

    alter table test1
    add (name varchar2(30) default ‘无名氏’ not null);

     

    使用一个SQL语句同时添加三个字段:

    alter table test1
    add (name varchar2(30) default ‘无名氏’ not null,

    age integer default 22 not null,

    has_money number(9,2)

    );

     

    修改一个字段

    alter table test1
    modify (name varchar2(16) default ‘unknown’);

    删除一个字段

    alter table test1
    drop column name;


    Oracle修改表字段名和长度的方式与标准的sql不一样,它需要增加特定的关键字。


    使用rename关键字来实现字段名的修改:alter table 表名 rename column旧的字段名 to 新的字段名;

    alert table wtc rename column qy to qcompany;

    使用modify关键字来实现对数据类型的修改:alter table 表名 modify 字段名 数据类型;


    alert table wtc modify column qcompany varchar2(500);


    高级用法:

    重命名表
    ALTER TABLE
     table_name RENAME TO new_table_name;

     

    修改列的名称

    语法:
    ALTER TABLE table_name RENAME COLUMN supplier_name to sname;

    范例:
    alter table s_dept rename column age to age1;

     

    附:创建带主键的表>>

    create table student (
    studentid int primary key not null,
    studentname varchar(8),
    age int);

     

    1、创建表的同时创建主键约束
    (1)无命名
    create table student (
    studentid int primary key not null,
    studentname varchar(8),
    age int);
    (2)有命名
    create table students (
    studentid int ,
    studentname varchar(8),
    age int,
    constraint yy primary key(studentid));


    2、删除表中已有的主键约束
    (1)无命名
    可用 SELECT * from user_cons_columns;
    查找表中主键名称得student表中的主键名为SYS_C002715
    alter table student drop constraint SYS_C002715;
    (2)有命名
    alter table students drop constraint yy;


    3、向表中添加主键约束
    alter table student add constraint pk_student primary key(studentid);



    展开全文
  • 如何修改Oracle表中字段长度

    万次阅读 2019-02-04 17:03:18
    如何修改Oracle表中字段长度 工具 电脑 PL/SQL Developer工具 方法步骤 通过 PL/SQL Developer登入到数据库的管理界面,当然,也可以使用别的数据库管理工具; 2.在developer的主界面左侧,找到tables,并展开。...
  • 2月9号的时候分享了篇Oracle针对大表在线修改的脚本,主要是使用Oracle自带的在线重定义功能,对于表结构的修改,非常的方便,强列推荐使用。脚本下载地址:oracle大表字段类型修改在线重定义脚本.txt最近在客户现场...
  • 问题描述:将生产环境表字段TMS在有数据的情况下将精度timestamp(9)-->timestamp(3) 操作sql(停应用,不然TMS列会有数据丢失) --添加临时字段TMPTMP ...--将TMS字段值赋给临时字段TMSTMP UPDATE S51T1_A...
  • oracle表名,字段名的长度限制

    千次阅读 2016-03-07 23:13:39
    可以看出 ,user_tables这个表,table_name的字段长度为30,查看该视图的构造可以造出table_name的来源,sys.obj$, 而且这个表是不能更改的。
  • tab_columns t_column, user_tables t_tables where t_column.table_name = t_tables.table_name and t_tables.table_name like '%BM_B%' -- 模糊匹配的表名 and t_column.data_length 可根据字段长度 and t_column....
  • 最近,ORACLE物化视图维护中发现一个问题,物化视图相关基表发生字段长度类DDL变更后,如果物化视图执行FORCE 或者FAST刷新后,物化视图相关user_mview_keys和dba_mview_keys记录的相关基表信息丢失,物化视图相关...
  • 在SQLServer数据库: 修改字段类型和长度: alter table student|表名 alter column stucard|字段名 varchar(18)|含...在Oracle数据库: 修改字段类型和长度: alter table student/表名 modify(stuid/字段名 ...
  • 在11g版本中Oracle是不支持调整表字段顺序的,而在更高的版本则可以直接调整字段顺序。 这里我们需要做的就是在保持原表数据完整的情况下,调整字段顺序。 1、我们重新建一个临时表存放表数据,我们的原表名是...
  • 如图所示,该字段的类型是 varchar,长度是 50。 我修改它的长度。 alter table nresa_upgrade modify (name varchar(200)); 修改完后长度就变成 200 了。
  • --使用oracle server自带的tkprof工具解析trace文件 tkprof /U01/app/oracle/diag/rdbms/s3megdb/megdb/trace/megdb_ora_9236.trc /home/oracle/alter_test.log --查看解析后的日志内容如下: 可以看到表上加了一个...
  • oracle 字段类型

    2014-03-11 16:24:00
    字段长度根据实际字符串长度自动调整,不用空格填充。 2.数值型NUMBER(PRECISION,SCALE) 精度PRECISION指定所有数字位的个数,范围SCALE指定小数的位数,两个参数均是可选的。如果插入的字段数据超过指定位数,...
  • 今天想在修改oracle 中varchar2型的字段长度报" ORA-00904:无效的标识符" 错误, 原先的sql 是   alter table AC_ARCHIVESSCOPE modify SCOPE VARCHAR2(1000);   后来 把上面的 语句改成如下 修改...
  • 无数据:ALTER TABLE TABLENAME MODIFY COLNAME VARCHAR2(40);... Oracle中仅允许字段长度由小改大,如果要由大改小,则需要先将表中数据备份至临时表,之后重构该表,往回插入数据时使用SUBSTR(COLNAME,1,长度)函数。
  • CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你...
  • 更改物化视图字段长度

    千次阅读 2013-07-20 21:31:22
    原来物化视图也是可以更字段长度的 drop table test / drop materialized view t1 / create table test as select '1' as a from dual / create materialized view t1 refresh complete as select * from test / ...
  • Oracle 标识符长度限制

    2020-09-22 10:15:16
    Oracle 标识符长度Oracle 12.2 开始,标识符长度上限变为128字节。 Database Object Names and Qualifiers - 12.2 Oracle 12.1 是30个字节 Database Object Names and Qualifiers - 12.1 工作中遇到了标识符...
  • oracle中char、varchar、varchar2的区别如下 1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的...
  • 1、由于疏忽直接将字段类型的长度增加了,导致其他数据对应字段都增加了多余的空格 占满全部字节长度 对后续取出数据 造成了影响,不可能每次都要trim字段 去除空格。 2、将char类型的字段改成varchar2类型 长度...
  • hana 数据库修改字段长度

    千次阅读 2017-06-10 17:19:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Excel输出部分日期字段长度不正确,用Excel的len()函数发现多了两位长度,主要是因为字段转换时字符串和日期转换的误差。长度不一致会导致很多Excel函数在此字段无法使用。  修改RTF模板对应字段, 首先RTF模板...
  • 1.查数据库中 表的【字段类型】和【长度】SQL --column_name:列名称 --data_type : 列类型 -- DATA_LENGTH:列定义的长度 --all_tab_columns 所有表列 --table_name 表名 select column_name, data_type, DATA_...
  • NUMBER(precision,scale) precision表示数字中的有效位;如果没有指定precision的话,Oracle将使用38作为精度。 如果scale大于零,表示数字... NUMBER整数部分允许的长度为(precision- scale),无论scale是...
  • 今天在做表结构调整时,对一个表wvls增加字段长度时执行如下语句: ALTER table wvls modify pnl_id varchar2(10);出现如下错误提示: ORA-30556:functional index is defined on the column to be modified ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,388
精华内容 6,155
关键字:

oracle调整字段长度