精华内容
下载资源
问答
  • oracle修改字段长度

    2020-04-09 16:09:29
    alter TABLE STUDENT modify(NAME VARCHAR2(100)); alter TABLE STUDENT modify(NAME VARCHAR2(100),ADDRESS VARCHAR2(500));
    alter TABLE STUDENT modify(NAME VARCHAR2(100));
    
    alter TABLE STUDENT modify(NAME VARCHAR2(100),ADDRESS VARCHAR2(500));

     

    展开全文
  • Oracle数据库中,表中已存在数据字段修改该字段长度,如有疑问可沟通联系,当积分自动提升到很高的时候欢迎联系,会把积分调低。
  • 我们知道,在9i对数据库进行DDl操作在高并发时或数据量大时会影响DML操作,比如添加,删除字段时,必须等到DDL完成时,DML操作才开始 ,以下例子为高并发时测试修改字段长度严重影响到生产性能:session 1;C:\Documents and...

    我们知道,在9i对数据库进行DDl操作在高并发时或数据量大时会影响DML操作,比如添加,删除字段时,

    必须等到DDL完成时,DML操作才开始  ,以下例子为高并发时测试修改字段长度严重影响到生产性能:

    session 1;

    C:\Documents and Settings\Paul Yi>sqlplus "/as sysdba"

    SQL*Plus: Release 9.2.0.4.0 - Production on Tue Apr 1 09:50:09 2008

    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

    Connected to:

    Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

    With the Partitioning, OLAP and Oracle Data Mining options

    JServer Release 9.2.0.4.0 - Production

    SQL> drop table test;

    Table dropped.

    SQL> create table test (a char(500),b char(500), c char(500));

    Table created.

    SQL> alter table test nologging;

    Table altered.

    SQL> insert /*+ append */ into test select 'a','b','c' from dba_objects;

    6174 rows created.

    SQL> commit;

    Commit complete.

    SQL> insert into test select * from test;

    6174 rows created.

    SQL> /

    12348 rows created.

    SQL> /

    24696 rows created.

    SQL> /

    49392 rows created.

    SQL> commit;

    Commit complete.

    SQL> select count(*) from test;

    COUNT(*)

    ----------

    98784

    SQL> alter session set events '10046 trace name context forever,level 12';

    Session altered.

    SQL> alter table test modify b char(1000);

    Table altered.

    SQL> alter session set events '10046 trace name context off';

    Session altered.

    SQL>

    session 2: --在修改字段的同时执行session 2的查询sql语句

    sql> select   *   from test ;  --此时阻塞

    session 3:

    SQL> select sid,event from v$session_wait;

    SID EVENT

    ---------- -------------------------------------------------------------

    1 pmon timer

    2 rdbms ipc message

    3 rdbms ipc message

    6 rdbms ipc message

    8 rdbms ipc message

    7 rdbms ipc message

    4 rdbms ipc message

    9 db file scattered read

    5 smon timer

    10 library cache lock   --等待事件

    13 SQL*Net message to client

    SID EVENT

    ---------- -------------------------------------------------------------

    14 SQL*Net message from client

    15 SQL*Net message from client

    13 rows selected.

    SQL> select sid,sql_hash_value from v$session where sid=10;

    SID SQL_HASH_VALUE

    ---------- --------------

    10      171085072

    SQL> select sql_text from v$sqlarea where hash_value='171085072';

    SQL_TEXT

    ------------------------------------------------------------------------

    select * from test       --可以查到阻塞的sql

    通过session 1跟踪10046事件可以看到,对以前数据也要修改长度和修改数据字典,所以主要等待时间在这里

    update "TEST" set "B"=sys_op_trtb("B",  9, 1000, 1000)

    update tab$ set ts#=:2,file#=:3,block#=:4,bobj#=decode(:5,0,null,:5),tab#=decode(:6,0,null,:6),intcols=:7,kernelcols=:8,clucols=decode(:9,0,null,:9),audit$=:10,flags=:11,pctfree$=:12,pctused$=:13,initrans=:14,maxtrans=:15,rowcnt=:16,blkcnt=:17,empcnt=:18,avgspc=:19,chncnt=:20,avgrln=:21,analyzetime=:22,samplesize=:23,cols=:24,property=:25,degree=decode(:26,1,null,:26),instances=decode(:27,1,null,:27),dataobj#=:28,avgspc_flb=:29,flbcnt=:30,trigflag=:31,spare1=:32,spare2=decode(:33,0,null,:33),spare4=:34,spare6=:35 where obj#=:1

    update col$ set intcol#=:3,segcol#=:4,type#=:5,length=:6,precision#=decode(:7,0,null,:7),scale=decode(:5,2,decode(:8,-127/*MAXSB1MINAL*/,null,:8),178,:8,179,:8,180,:8,181,:8,182,:8,183,:8,231,:8,null),null$=:9,fixedstorage=:10,segcollength=:11,col#=:12,property=:13,charsetid=:14,charsetform=:15,spare1=:16,spare2=:17,spare3=:18,deflength=decode(:19,0,null,:19),default$=:20 where obj#=:1 and name=:2

    update obj$ set obj#=:6,type#=:7,ctime=:8,mtime=:9,stime=:10,status=:11,dataobj#=:13,flags=:14,oid$=:15,spare1=:16, spare2=:17 where owner#=:1 and name=:2 and namespace=:3 and(remoteowner=:4 or remoteowner is null and :4 is null)and(linkname=:5 or linkname is null and :5 is null)and(subname=:12 or subname is null and :12 is null)

    展开全文
  • 对于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!}]] …

    展开全文
  •  //在修改字段开始的那一刻同时执行select session 3: SQL> select sid,event from v$session where event not like 'SQL%' and username is not null; SID EVENT ---------- -----------------------------------...

    测试过程,ddl阻塞select

    session 1:

    SQL> create table k(a char(1000),b char(1000),c char(1000),d char(1000));

    表已创建。

    SQL> alter table k nologging;

    表已更改。

    SQL> insert /*+ append */ into k select 'a','b','c','d' from dba_objects;

    已创建50116行。

    SQL> commit;

    提交完成。

    SQL> alter table k modify a char(2000);

    表已更改。

    session 2:

    select * from k;  //在修改字段开始的那一刻同时执行select

    session 3:

    SQL>  select sid,event from v$session where event not like 'SQL%' and username is not null;

    SID EVENT

    ---------- ----------------------------------------------------------------

    134 wait for unread message on broadcast channel

    139 Streams AQ: waiting for messages in the queue

    141 library cache lock

    152 db file scattered read

    SQL> select sid,sql_id from v$session where sid=141;  //等待library cache lock

    SID SQL_ID

    ---------- -------------

    141 9m7yb5xsppmbm

    SQL> select sql_text from v$sqlstats where sql_id='9m7yb5xsppmbm'; //被阻塞的语句是个select

    SQL_TEXT

    -----------------------------------------------------------------------------

    select * from k

    SQL> select prev_sql_id from v$session where sid=152;

    PREV_SQL_ID

    -------------

    1qmpkbpb9yqmx

    SQL> select sql_text from v$sqlstats where sql_id='1qmpkbpb9yqmx';

    SQL_TEXT

    -----------------------------------------------------------------------------

    alter table k modify a char(2000)

    展开全文
  • Oracle数据库修改字段长度

    千次阅读 2015-09-01 21:12:45
    本人小菜鸟一个 闲来没事 写一点点博客 方便以后查看 alter table user_test modify pad varchar2 (200); /*修改数据库字段长度*/ user_test 为数据库表 pad为表中的字段
  • oracle varchar2字段长度不够问题

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

    万次阅读 2018-08-24 17:36:18
    alter table 表名 modify (列名 数据类型(新长度));
  • 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....
  • 在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指定小数的位数,两个参数均是可选的。如果插入的字段数据超过指定位数,...
  • 无数据:ALTER TABLE TABLENAME MODIFY COLNAME VARCHAR2(40);... Oracle中仅允许字段长度由小改大,如果要由大改小,则需要先将表中数据备份至临时表,之后重构该表,往回插入数据时使用SUBSTR(COLNAME,1,长度)函数。
  • 不废话需求:在plsql中更改oracle数据库中的info_agency表中的county字段的数据类型 为varchar 长度为255实现:alter TABLE INFO_AGENCY MODIFY (county VARCHAR(255));亲用 则 可用 ...
  • CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你...
  • oracle中char、varchar、varchar2的区别如下 1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的...
  • 1、由于疏忽直接将字段类型的长度增加了,导致其他数据对应字段都增加了多余的空格 占满全部字节长度 对后续取出数据 造成了影响,不可能每次都要trim字段 去除空格。 2、将char类型的字段改成varchar2类型 长度...
  • 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 ...
  • ORACLE 修改NUMBER字段精度

    千次阅读 2017-06-23 10:33:00
    1.增加一个字段来保存数据 altertabletable_nameadd(col1number(14,2)) updatetable_namesetcol1=round(col,2) 2.altertabletable_namedropcolumncol 3.altertabletable_nameadd(colnumb...
  • 整理数据库文档是一个比较常见的工作,例如oracle数据库提供了很多内置视图,可以非常方便的查询出各种表信息,字段信息,大大提升生成数据库文档的效率,下面简单一种方式。 我们的目标是统计出数据库表中如下的...
  • Oracle实用操作(三)oracle 表名长度的限制 1、在新建oracle表的时候,经过查找相关资料oracle表名的最大长度是30,我加上了0331正好是30,多加2为就32了,当然报错了。 2、同时有网友说看看desc user_tables,看...
  • ORACLE数据库字段长度为number(19),在pl/sql中insert一个19位数字进去,显示为科学计数法. 解决方法:在pl/sql–>工具–>首选项–>sql窗口–>选中数字字段to_char即可 ...

空空如也

空空如也

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

oracle调整字段长度