在这篇文章中,我们将带领您了解OracleVarchar2字段转成Clob字段的全貌,包括oracle将varchar2转换为clob的相关情况。同时,我们还将为您介绍有关charvarcharnva
在这篇文章中,我们将带领您了解Oracle Varchar2 字段转成Clob字段的全貌,包括oracle将varchar2转换为clob的相关情况。同时,我们还将为您介绍有关char varchar nvarchar varchar2 nvarchar2的区别、char varchar varchar2 的区别 、LONG 数据类型转换为 VARCHAR2 并相互转换、MyBatis 对 Oracle 的 CHAR 和 VARCHAR2 的处理的知识,以帮助您更好地理解这个主题。
本文目录一览:- Oracle Varchar2 字段转成Clob字段(oracle将varchar2转换为clob)
- char varchar nvarchar varchar2 nvarchar2的区别
- char varchar varchar2 的区别
- LONG 数据类型转换为 VARCHAR2 并相互转换
- MyBatis 对 Oracle 的 CHAR 和 VARCHAR2 的处理
Oracle Varchar2 字段转成Clob字段(oracle将varchar2转换为clob)
今天碰到一个问题,想将oracle数据库的varchar 字段修改为 clob 字段,先开始直接修改是报错的,后来搜索资料才知道需要先修改为 long 类型,才能在long类型基础上修改为 clob类型。
语句:
alter table <your table name> modify (<column name> long;)
alter table <your table name> modify (<column name> clob;)
char varchar nvarchar varchar2 nvarchar2的区别
1.charchar的长度是固定的,最大支持2000个字节。
char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节;
char是区分中英文的,中文在char中占两个字节,而英文占一个,所以char(20)你只能存20个字母或10个汉字。
char适用于长度比较固定的,一般不含中文的情况
2.varchar/varchar2
varchar是长度不固定的,最大支持4000个字节。
varchar是长度不固定的,比如说,你定义了varchar(20),当你插入abc,则在数据库中只占3个字节。
varchar同样区分中英文,这点同char。
varchar的效率低于char。
varchar2基本上等同于varchar,它是oracle自己定义的一个非工业标准varchar,不同在于,varchar2用null代替varchar的空字符串
varchar/varchar2适用于长度不固定的,一般不含中文的情况
3.nvarchar/nvarchar2
nvarchar和nvarchar2是长度不固定的
nvarchar不区分中英文,比如说:你定义了nvarchar(20),你可以存入20个英文字母/汉字或中英文组合,这个20定义的是字符数而不是字节数
nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占两个字节
nvarchar/nvarchar2适用于存放中文
orcale 中varchar2 和nvarchar2的区别
在sql ref书中介绍到
1 VARCHAR2(size)
[BYTE | CHAR]
Variable-length character string having maximum
length size bytes or characters. Maximum size is
4000 bytes, and minimum is 1 byte or 1 character.
You must specify size for VARCHAR2.
BYTE indicates that the column will have byte
length semantics; CHAR indicates that the column
will have character semantics.
1 NVARCHAR2(size) Variable-length character string having maximum
length size characters or bytes, depending on the
choice of national character set. Maximum size is
determined by the number of bytes required to store
each character, with an upper limit of 4000 bytes.
You must specify size for NVARCHAR2.
中文大意:
VARCHAR2(size),可变长度的字符串,其最大长度为 size 个字节。size 的最大值是 4000,而最小值是 1。您必须指定一个 VARCHAR2 的 size。
NVARCHAR2(size),可变长度的字符串,依据所选的国家字符集,其最大长度为 size 个字符或字节。size 的最大值取决于存储每个字符所需要的字节数,其上限为 4000 个字节。您必须为 NVARCHAR2 指定一个 size。
相同点:都是可变长度字符串(char类型是不变长度),都必须指定大小
不同点:VARCHAR2存放的英文字符只占一个字节,而nvarchar2依据所选的字符集,大多为两个
char varchar varchar2 的区别
char varchar varchar2 的区别
区别:
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。
2.CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。
何时该用CHAR,何时该用varchar2?
CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。
LONG 数据类型转换为 VARCHAR2 并相互转换
-- 方法 1,支持表
--plsql 中将 long 类型隐式转换为 varchar2,但是 sql 不能
CREATE OR REPLACE FUNCTION LONG_TO_CHAR(
in_rowid rowid,
in_owner varchar,
in_table_name varchar,
in_column varchar2)
RETURN varchar AS
text_c1 varchar2(32767);
sql_cur varchar2(2000);
--set serveroutput on size 10000000000;
begin
DBMS_OUTPUT.ENABLE (buffer_size=>null);
sql_cur := ''select ''||in_column||'' from ''||in_owner||''.''||in_table_name||'' where rowid = ''||chr(39)||in_rowid||chr(39);
dbms_output.put_line (sql_cur);
execute immediate sql_cur into text_c1;
text_c1 := substr(text_c1, 1, 4000);
RETURN TEXT_C1;
END;
/
--------------------------------------
--test
-- 参数分别为 rowid,用户,表名,字段名
DROP TABLE VI.TEST1;
CREATE TABLE VI.TEST1(ID NUMBER,V_CLOB CLOB,V_LONG LONG DEFAULT ''create or replace view v_t'',V_SYSDATE DATE DEFAULT SYSDATE);
INSERT INTO VI.TEST1(ID) SELECT 1 FROM DUAL;
COMMIT;
select LONG_TO_CHAR(ROWID, ''VI'', ''TEST1'', ''V_LONG'') FROM TEST1;
-------------------------------------------------------------------------------------------------------------------------------------------------
-- 方法 2,支持表和视图
--long 查询结果转换为 varchar2 类型
/* 来自 Thomas Kyte 《Oracle9i/10g/11g 编程艺术》 12 章节中。由于 long 的操作限制,那么在操作 long 之前可以将该类型的结果转换为 varchar2,
然后再使用 long_help.substr_of,基本意思是将 long 结果的的前 4000 字节转换为 varchar2 类型。如果 long 的数据超过了 4000 字节,那么可以将循环调用此函数
*/
create or replace package long_help
authid current_user
as
function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL
)
return varchar2;
end;
/
create or replace package body long_help
as
g_cursor number := dbms_sql.open_cursor;
g_query varchar2(32765);
procedure bind_variable(
p_name in varchar2,
p_value in varchar2
)
is
begin
if ( p_name is not null) then
dbms_sql.bind_variable( g_cursor, p_name, p_value );
end if;
end;
function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL)
return varchar2 as
l_buffer varchar2(4000);
l_buffer_len number;
begin
if ( nvl(p_from,0) <= 0 ) then
raise_application_error(-20002, ''From must be >= 1 (positive numbers)'');
end if;
if ( nvl(p_for,0) not between 1 and 4000 ) then
raise_application_error (-20003, ''For must be between 1 and 4000'' );
end if;
if ( p_query <> g_query or g_query is NULL ) then
if ( upper(trim(nvl(p_query,''x''))) not like ''SELECT%'') then
raise_application_error(-20001, ''This must be a select only'' );
end if;
dbms_sql.parse( g_cursor, p_query, dbms_sql.native );
g_query := p_query;
end if;
bind_variable( p_name1, p_bind1 );
bind_variable( p_name2, p_bind2 );
bind_variable( p_name3, p_bind3 );
bind_variable( p_name4, p_bind4 );
dbms_sql.define_column_long(g_cursor, 1);
if (dbms_sql.execute_and_fetch(g_cursor)>0) then
dbms_sql.column_value_long(g_cursor, 1, p_for, p_from-1,l_buffer, l_buffer_len );
end if;
return l_buffer;
end substr_of;
end;
/
-- 使用方法:
-- 查询 DBA_TAB_PARTITIONS 中的 LONG 类型:HIGH_VALUE
SELECT * FROM(
SELECT TABLE_OWNER,TABLE_NAME,PARTITION_NAME,
LONG_HELP.SUBSTR_OF(''SELECT HIGH_VALUE FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER=:TABLE_OWNER AND TABLE_NAME=:TABLE_NAME AND PARTITION_NAME=:PARTITION_NAME'',
1,
4000,
''TABLE_OWNER'',
TABLE_OWNER,
''TABLE_NAME'',
TABLE_NAME,
''PARTITION_NAME'',
PARTITION_NAME) HIGH_VALUE
FROM DBA_TAB_PARTITIONS
);
-- 查询 long 类型数据
SELECT LONG_HELP.SUBSTR_OF(''SELECT V_LONG FROM TEST1'',1,4000) FROM TEST1;
-- 查询 DBA_VIEWS 视图的 TEXT 时报错:ORA-01006:绑定变量不存在 (原因可能是不支持视图,应该在外层写筛选条件)
-------------------------------------------------------------------------------------------------------------------------------------------------
-- 方法三,支持表
select sys.dbms_metadata_util.long2varchar(100,''scott.t1'',''name'',rowid) from scott.t1;
-------------------------------------------------------------------------------------------------------------------------------------------------
--varchar2 转化为 long,撰写的 procedure 案例如下
create table erpmainbom(
location varchar2(4000),
locationplus long,
parentpn varchar2(4000),
pn varchar2(4000),
plant varchar2(4000)
);
--location 字段空格之前的字符重新复制给 location,从空格开始的之后的字符拼接 locationplus(long 类型)字段并复制给 locationplus
Create or replace PROCEDURE P_UPDATELOCALPLUS(
strMitm in varchar2,
strSubITEM in varchar2,
strPlant in varchar2)
as
lLocationPlus long;
strLocation varchar2(4000);
strSubLoc varchar2(50);
lTempLoct long;
i number;
Begin
Select location,locationplus into strLocation,lLocationPlus from erpmainbom Where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
If length(strLocation)=4000 then
i:=1;
strSubLoc:=substr(strLocation,4000,i);
While InStr(strSubLoc, '' '') = 0 Loop
i := i + 1;
strSubLoc := substr(strLocation,4000-i,i);
End Loop;
--i:=i+1;
strSubLoc := substr(strLocation,4000-i,i+1);
strLocation := substr(strLocation,1, 4000 - Length(strSubLoc));
lTempLoct:=strSubLoc;
End if;
lLocationPlus:=lTempLoct||lLocationPlus;
update erpmainbom set location=strLocation,locationplus=lLocationPlus where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
commit;
EXCEPTION When others then
Rollback;
end;
/
MyBatis 对 Oracle 的 CHAR 和 VARCHAR2 的处理
今天发现一个非常奇怪的现象,同样的 SQL 语句,在 PL/SQL 中能查询到结果,放到 MyBatis 下怎么也查不出东西。后来仔细研究,发现如下问题:
1、如果数据库中定义的字段为 CHAR (20),而传入的参数只有 18 位,在 PL/SQL 中会该工具应该会自动的去除空格或者添加空格以便进行匹配;
2、但是在 MyBatis 中,没有这样的功能,使用 =#{paramName} 根本查询不到结果。
3、所以解决方式是:使用 like ''${paramName}%'' 来处理或者把对应的数据字段更改为 VARCHAR2 类型。
今天关于Oracle Varchar2 字段转成Clob字段和oracle将varchar2转换为clob的讲解已经结束,谢谢您的阅读,如果想了解更多关于char varchar nvarchar varchar2 nvarchar2的区别、char varchar varchar2 的区别 、LONG 数据类型转换为 VARCHAR2 并相互转换、MyBatis 对 Oracle 的 CHAR 和 VARCHAR2 的处理的相关知识,请在本站搜索。
本文标签: