Archive for 三月, 2009
星期四, 三月 26th, 2009
由于公司业务的发展需要,最近会有很多台湾的数据过来。
台湾那边使用的字符集一般都包含繁体字,而我们的常用的字符处理的工具对繁体并不支持。
所以想开发个小函数,实现简体和繁体的互相转化。
由于简体和繁体的ASCII并没有特别的对照关系,所以考虑自己动手做一张简体繁体对照表。
sql> desc simple_complex
Name Null? Type
-------------------- ---------- ------------------
SIMPLE_KEY VARCHAR2(2)
COMPLEX_KEY VARCHAR2(2)
sql> select count(*) from simple_complex;
COUNT(*)
----------
2916
SQL> select * from simple_complex where rownum<11;
SIMP COMP
---- ----
别 別
槟 檳
鬓 鬢
剥 剝
博 愽
采 埰
参 蓡
灿 燦
册 冊
层 層
大概的结构就是这样的,SIMPLE_KEY表示这个字的简体形式,COMPLEX_KEY表示的是繁体形式。
只要有了这样的对照关系就可以简单的实现实现简体和繁体的互相转化。
比如“層次”这样的字符,我查询表simple_complex表找到“層”的简体形式“层”,就会进行替换,得到“层次”。
转化SQL如下:
--繁体转简体
function complex_to_simple(in_str varchar2) return varchar2 is
n_length number;
n_output varchar2(2000);
begin
n_length := length(in_str);
n_output := ...
Posted in oracle | No Comments »
星期三, 三月 25th, 2009
今天发现一个很好用的linux命令xxd,可以将普通文本转化成16进制文件或者将16进制文件转化成普通文件。
先vi生成一个普通文件1.txt。
dwapp@dbrac1:/home/dwapp/sunwg>cat 1.txt
你好
通过xxd将1.txt转化成16进制文件
dwapp@dbrac1:/home/dwapp/sunwg>xxd 1.txt 2.txt
dwapp@dbrac1:/home/dwapp/sunwg>cat 2.txt
0000000: c4e3 bac3 0a 你好
这个时候文件已经被转换成16进制的形式了。
你 ===> c4e3
好 ===> bac3
通过xxd将2.txt转化成回文本文件
dwapp@dbrac1:/home/dwapp/sunwg>xxd -r 2.txt 3.txt
dwapp@dbrac1:/home/dwapp/sunwg>cat 3.txt
你好
Posted in linux and unix | No Comments »
星期五, 三月 20th, 2009
昨天听同事说到个insert all时候开并行的bug,奇怪的很。
这个bug在10g,11g上都是存在的。
下面模拟下:
SQL> create table sunwg01 (id number);
Table created
SQL> create table sunwg02 (id number);
Table created
SQL> insert into sunwg02 values(1);
1 row inserted
SQL> insert into sunwg02 values(2);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from sunwg01;
ID
----------
SQL> select * from sunwg02;
ID
----------
1
2
SQL> insert into sunwg01 select * from sunwg02;
2 rows inserted
SQL> insert ...
Posted in oracle | No Comments »
星期五, 三月 20th, 2009
在我们使用start WITH...connect by的时候有时候会遇到ORA-30003的错误。
SUNWG> host oerr ora 30003
30003, 00000, "illegal parameter in SYS_CONNECT_BY_PATH function"
// *Cause:
// *Action: use a non-empty constant string as the second argument,
// then retry the operation.
大概的意思就是说 SYS_CONNECT_BY_PATH函数的第二个参数不能为空的字符。
下面模拟下错误:
SQL> create table sunwg(id1 number,id2 number);
Table created
SQL> insert into sunwg select rownum , rownum + 1 from dba_users where rownum<6;
5 rows inserted
SQL> ...
Posted in oracle | No Comments »
星期三, 三月 18th, 2009
通过树型查询实现同类字符拼接问题
这是同事提的一个需求,要实现将表中id相同的记录的key拼接在一起。
例如:
SQL> select * from test00;
ID NAME
---------- --------------------
1 mp3
1 mp4
1 mp5
2 kele
2 qixi
要得到这样的结果
ID PATH
---------- -------------------
1 /mp3/mp4/mp5
2 /kele/qixi
实现这个需求有好多种方式,最容易想到的就是通过编写PL/SQL利用游标实现。
不过使用游标的效率肯定比较差,最后想到了利用start WITH..connect BY..的树型结构来实现。
但是这个表中没有树型结构需要的父子关系,那么就自己创建吧。
那么创建父子结构可以使用row_number()或者直接使用rownum
两个SQL如下:
row_number()方式
SELECT id, path
FROM (SELECT id,
path,
row_number() OVER(PARTITION BY id ORDER BY LEVEL_id DESC) rn
from (select id,
sys_connect_by_path(NAME, '/') path,
level level_id
...
Posted in oracle | No Comments »