oracle使用随机数插入表数据 oracle数据库的使用

1、create table testd(id int,name char(5));

begin
for i in 1..1000000 loop
insert intotestd values(
i, to_char(dbms_random.random()));
end loop;
commit;
end;
/

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

ERROR at line 1:
ORA-12899: value too large for column "BREIN"."TESTA"."NAME"(actual: 9, maximum: 5)
ORA-06512: at line 3

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

原因为name的字段宽度太小了

begin
for i in 1..3 loop
insert intotestd values(
i, to_char(dbms_random.random()));
end loop;
commit;
end;
/

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

ERROR at line 1:
ORA-12899: value too large for column "BREIN"."TESTA"."NAME"(actual: 9, maximum: 5)
ORA-06512: at line 3

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

还报同样的错误。

2、create table testd(id int,name char(500));

begin
for i in 1..1000000 loop
insert intotestd values(
i, to_char(dbms_random.random()));
end loop;
commit;
end;
/

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


PL/SQL procedure successfully completed.

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

3、create table testd(id int,name varchar2(20),addrvarchar2(20),dele varchar2(20),modi varchar2(20));

begin
for i in 1..1000000 loop
insert intotestd values(
i, to_char(dbms_random.random()),
dbms_random.random(), dbms_random.random(),
to_char(dbms_random.random()));
end loop;
commit;
end;
/

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

PL/SQL procedure successfully completed.

原来int型的可以默认插入字符型字段中去

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

参考文章

ORA-12899及UTF8字符集相关(汉字所在长度)2010-06-22 18:08
一般设计数据库的时候,我们都考虑一个汉字占用两个字节。所以设计数据库的时候,如果认为某字段最长要存四个汉字,该字段都会定义为varchar2(8)。

SQL> create table t1 (col1 varchar2(8));
Table created.

但是测试插入三个汉字的时候就报错了。
SQL> insert into t1 values('一二三');
insert into t1 values('一二三')
*
ERROR at line 1:
ORA-12899: value too large for column T1.COL1 (actual: 9,maximum:8)

检查相关参数及环境变量。
SQL> select * from nls_database_parameters whereparameter like 'NLS%CHARACTERSET';
PARAMETERVALUE
------------------------- --------------------
NLS_CHARACTERSETUTF8
NLS_NCHAR_CHARACTERSETUTF8

客户端NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。

原来数据库使用的是UTF8字符集,难怪一个汉字占用3个字节。这样一来原先按一个汉字占两个字节设计的数据库,应用的时候很多字段都会因长度不够,出现ORA-12899错误。
不能把数据库的字符集改成ZHS16GBK。因为系统要求不仅能支持中文,还要能支持其他亚洲字符。这样CHARACTERSET就只能设这成UTF8或AL32UTF8,这两种字符集每个汉字占用的字节数分别是3和4,都不是2。
更改所有CHAR/VARCHAR字段的长度也不现实。整套系统是从其他公司买的产品,内含上千张表,逐个去修改字段不太可能。


查看参数NLS_LENGTH_SEMANTICS。
Oracl文档中的说明:
Syntax: NLS_LENGTH_SEMANTICS = string
Range of values: BYTE | CHAR
NLS_LENGTH_SEMANTICS enables you to create CHAR and VARCHAR2columns using either byte or character length semantics. Existingcolumns are not affected.
NCHAR, NVARCHAR2, CLOB, and NCLOB columns are alwayscharacter-based. You may be required to use byte semantics in orderto maintain compatibility with existing applications.
NLS_LENGTH_SEMANTICS does not apply to tables in SYS and SYSTEM.The data dictionary always uses byte semantics.


查看数据库中该参数的设置。
SQL> select * from nls_database_parameters whereparameter like 'NLS%SEMANTICS';
PARAMETERVALUE
------------------------- --------------------
NLS_LENGTH_SEMANTICSBYTE

SQL> show parameternls_length
NAMETYPEVALUE
------------------------------------ ---------- -------
nls_length_semanticsstringBYTE


把该参数改成CHAR
SQL>alter system set NLS_LENGTH_SEMANTICS=BYTEscope=BOTH;

修改后查看参数。
SQL> show parameter nls_length
NAME TYPE VALUE
------------------------------------ ---------- -------
nls_length_semantics string CHAR

从新执行insert操作。
oracle使用随机数插入表数据 oracle数据库的使用
SQL> insert into t1 values('一二三');
insert into t1 values('一二三')
*
ERROR at line 1:
ORA-12899: value too large for column T1.COL1 (actual: 9,maximum:8)
还是出错!

新创建一张表,再测试。
SQL> create table t2 (col1 varchar2(8));
表已创建。

SQL> insert into t2values('一二三')
已创建 1 行。

SQL> select * fromt2;
COL1
----------------
一二三

OK了

再查看t1和t2的表结构,可以发现一些差别。
SQL> desc t1
名称是否为空? 类型
-------------------- ---------------------------------
COL1VARCHAR2(8)

SQL> desc t2
名称是否为空? 类型
-------------------- -------- -------------------------
COL1VARCHAR2(8 CHAR)


参数NLS_LENGTH_SEMANTICS改成CHAR以后,t2.col1列可以存储8个汉字,英文字符也只能存储8个。
SQL> insert into t2 values('一二三四五六七八');
已创建 1 行。

SQL> insert into t2values('abcdefgh');
已创建 1 行。

SQL> insert into t2values('abcdefghi');
insert into t2 values('abcdefghi')
*
ERROR 位于第 1 行:
ORA-12899: value too large for column T2.COL1 (actual: 9,maximum:8)

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/145161.html

更多阅读

小众有用技巧-EXCEL篇:3 插入表单控件

小众有用技巧-EXCEL篇:[3]插入表单控件——简介【 总引言:生活工作中,你也许经常使用OFFICE,但强大的OFFICE很多有用的功能被我们忽略了,这些小技巧也许对于某些任务非常有用,我将陆续推出OFFICE的小众有用技巧系列,敬请关注。适用于OFFICE

oracle数据库基础使用方法 精 oracle数据库基础教程

oracle数据库基础使用方法 精——简介ORACLE 数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的

oracle如何创建数据库 oracle数据库创建实例

oracle如何创建数据库——简介我们这里所说的创建是用图形化的界面来创建数据库的。oracle如何创建数据库——工具/原料oracle软件电脑oracle如何创建数据库——方法/步骤oracle如何创建数据库 1、从Windows桌面执行“开始”→“

VisualFoxPro6.0与大型数据库的无"数据源"连接 foxpro数据库

VisualFoxPro6.0与大型数据库的无"数据源"连接  Fox系列数据库产品作为一种开发信息管理系统的微机常用工具,而深受开发人员以及广大用户的喜爱,但由于微电子技术的飞速发展,CPU处理速度的快速提升,硬盘的容量、速度及其它性能的显著

声明:《oracle使用随机数插入表数据 oracle数据库的使用》为网友醉酒戏红顏分享!如侵犯到您的合法权益请联系我们删除