oracle怎样才能把特殊字符存到数据库里面去了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎样才能把特殊字符存到数据库里面去了相关的知识,希望对你有一定的参考价值。

网站需要存储一些特殊的规则放到数据库里面去,里面包含有&和‘这样的特殊字符。现在都是用||把这些特殊字符连接起来放到数据里面的,但是这样的话,读出这些规则的时候,又需要把这些||处理掉,严重影响性能,怎样才能把特殊字符直接放到数据库里面去啊。

单引号用两个就可以了:
SQL> select '''' from dual;

'
-
'

&是SQLPLUS里才用到的特殊字符,做宏替换用的,编程语言应该不受影响。如果你用不到它,可以干脆禁掉:
SQL> show define
define "&" (hex 26)
SQL> set define off
SQL> select '&aaaaa' from dual;

'&AAAA
------
&aaaaa

你实在都要用就用chr(38)
参考技术A 方法一:在SQL语句中将'&'替换成chr(38),因为chr(38)是‘&’的ASCII码
SQL> Select 'Tom' || chr(38) || 'Jerry' from dual;
方法二:分拆原来的字符串
SQL> Select 'Tom' || '&' || 'Jerry' from dual;
备注:如果是在命令行执行,可以设置 ”Set define OFF“,之后在正常执行sql语句即可。
参考技术B 直接用一个varchar2类型的字段存储就可以 了。mysql下测试无误。 参考技术C 用asc码来插入吧

譬如&的asc码是chr(38) '的是chr(39)

你要是插入'&的话
insert into 表 (字段) values (chr(39)||chr(38))
参考技术D 查相应的ASCII,用chr(xx)代替,比如 chr(13)

Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中

现在有一张表
设备属地 设备名称 设备IP 结果
北京 和丰中心局ME60 222.83.19.109 FF0000]CR56LPUF400A,210305498910J7000268,03054989;CR56LPUF100B0,210305377710H3000190,03053777;CR56LPUF100B0,210305377710G1000861,03053777(这是一个字段)
上海 80局华为NE80E 222.83.19.158 CR52EAGF0,0386751073000124,PIC;CR52EAGF,0278671073000167,LPU;CR52EAGF0,0386751068000350,PIC;CR52EAGF,0278671067000055,LPU;CR52SRUA0,0391091073000356,MPU;CR52SRUA0,0391091073000342,SFU
...... ......... ........... ........
其中结果这个字段很长,我只是截取了部分粘贴的,现在要将结果这个字段进行拆分,第一次拆成:
CR56LPUF400A,210305498910J7000268,03054989
CR56LPUF100B0,210305377710H3000190,03053777
CR56LPUF100B0,210305377710G1000861,03053777
第二次拆分
CR56LPUF400A 210305498910J7000268 03054989
CR56LPUF100B0 210305377710H3000190 03053777
CR56LPUF100B0 210305377710G1000861 03053777
然后将拆分的字段存到另外的一张表中表,如下
设备属地 设备名称 设备IP 单板类型 单板编码 单板描述
北京 和丰中心局ME60 222.83.19.109 CR56LPUF400A 210305498910J7000268 03054989
北京 和丰中心局ME60 222.83.19.109 CR56LPUF100B0 210305377710H3000190 03053777
北京 和丰中心局ME60 222.83.19.109 CR56LPUF100B0 210305377710G1000861 03053777
上海 80局华为NE80E 222.83.19.158 CR52EAGF0 0386751073000124 PIC
上海 80局华为NE80E 222.83.19.158 ... ... ...
... ... ... ... ... ...
现在需要使用oracle存储过程来实现,本人初学,不知道怎么做,麻烦哪位大佬给指点下,在线等,谢谢

--通过游标遍历调用方法拆取存表:

--方法

create or replace function f_test_substr(
prm1 varchar2,    --地
prm2 varchar2 ,   --名称
prm3 varchar2,    --IP
prm4 varchar2    --结果
)
return varchar2
as
v_n int:=0;  --第几次取
v_l int;  --:截取次数
v_s varchar2(2000);  --处理拆分字符串
v_s1 varchar2(200);  --本次拆分
v_s2 varchar2(200);  --本次剩余
v_type varchar2(100);  --设备类型
v_code varchar2(100);  --设备编号
v_desc varchar2(100);  --设备描述
v_errmsg varchar2(200);
begin
v_l:=length(prm4)-length(replace(prm4,';',''));
v_s:=prm4||';';
v_s1:=substr(v_s,1,instr(v_s,';',1,1));
v_s2:=replace(v_s,v_s1,'');
while v_n<=v_l loop
v_s2:=replace(v_s2,v_s1,'');
v_s1:=substr(v_s1,1,length(v_s1)-1);
v_type:=substr(v_s1,1,instr(v_s1,',',1,1)-1);
v_code:=substr(v_s1,instr(v_s1,',',1,1)+1,instr(v_s1,',',1,2)-instr(v_s1,',',1,1)-1);
v_desc:=substr(v_s1,instr(v_s1,',',1,2)+1,instr(v_s1||',',',',1,3)-instr(v_s1,',',1,2)-1);
insert into t_test_str(a,b,c,d,e,f) values(prm1,prm2,prm3,substr(v_type,instr(v_type,']',1)+1),v_code,v_desc);
v_n:=v_n+1;
v_s1:=substr(v_s2,1,instr(v_s2,';',1,1));
end loop;
commit;
return '成功';

exception
when others then
v_errmsg:=substr(sqlerrm,1,200);
return v_errmsg ;

end;

--存过

create or replace procedure p_test_substr1(o_result out varchar2)

as
v_a varchar2(20);
v_b varchar2(20);
v_c varchar2(20);
v_d varchar2(2000);
v_num int;
cursor c_str is
SELECT * from t_test_substr
;
begin
select count(1) into v_num from t_test_substr;
while v_num>0 loop
open c_str;
loop
FETCH c_str INTO
v_a,v_b,v_c,v_d;
EXIT WHEN c_str%NOTFOUND;

o_result:=f_test_substr(v_a,v_b,v_c,v_d);
v_num:=v_num-1;
end loop;
CLOSE c_str;
end loop;
end;

效果见图:

参考技术A

在过程里把处理的结果插入新表就行

追问

关键是数据库里不止这两条数据啊有很多的,我只是列举了这两条数据,后面很多数据怎么处理啊,大佬存储过程会不,给讲解下

本回答被提问者采纳

以上是关于oracle怎样才能把特殊字符存到数据库里面去了的主要内容,如果未能解决你的问题,请参考以下文章

php 怎么把上传的图片路劲存到mysql数据库,然后再在页面读取出来?

JAVA中存文件到ORACLE数据库里怎么做?

Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中

在java中如何把字节数组存储到数据库?

为啥存到数据库里面是乱码

怎么样才能把特殊字符®®(商标)插入到sqlserver数据库中,不能出现乱码。求解?