Archive for the ‘oracle’ Category

ORACLE按照笔画、部首、拼音排序的实现

公司自定义表格过多,不好查找,需要按拼音查询,网上找到此文。

Oracle9i之前,中文是按照二进制编码进行排序的。在oracle9i中新增了按照拼音、部首、笔画排序功能。

1、设置NLS_SORT参数值
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序

2、Session级别的设置,修改ORACLE字段的默认排序方式:
按拼音:alter session set nls_sort = SCHINESE_PINYIN_M;
按笔画:alter session set nls_sort = SCHINESE_STROKE_M;
按偏旁:alter session set nls_sort = NLS_SORT=SCHINESE_RADICAL_M;

3、语句级别设置排序方式:
按照笔划排序
select * from dept order by nlssort(name,’NLS_SORT=SCHINESE_STROKE_M’);
按照部首排序
select * from dept order by nlssort(name,’NLS_SORT=SCHINESE_RADICAL_M’);
按照拼音排序,此为系统的默认排序方式
select * from dept order by nlssort(name,’NLS_SORT=SCHINESE_PINYIN_M’);

4、修改系统参数(数据库所在操作系统):
set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT (sh)
setenv NLS_SORT SCHINESE_RADICAL_M (csh)
HKLC\SOFTWARE\ORACLE\home0\NLS_SORT (win注册表)

Oracle 官方说明

NLS_SORT NLS_SORT specifies the collating sequence for ORDER BY queries. NLS_COMP NLS_COMP specifies the collation behavior of the database session.

Property Description
Parameter type String
Syntax NLS_SORT = { BINARY | linguistic_definition }
Default value Derived from NLS_LANGUAGE
Modifiable ALTER SESSION
Range of values BINARY or any valid linguistic definition name
  • If the value is BINARY, then the collating sequence for ORDER BY queries is based on the numeric value of characters (a binary sort that requires less system overhead).
  • If the value is a named linguistic sort, sorting is based on the order of the defined linguistic sort. Most (but not all) languages supported by the NLS_LANGUAGE parameter also support a linguistic sort with the same name.Note:

    Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer. BINARY is the exception because indexes are built according to a binary order of keys. Thus the optimizer can use an index to satisfy the ORDER BY clause when NLS_SORT is set to BINARY. If NLS_SORT is set to any linguistic sort, the optimizer must include a full table scan and a full sort in the execution plan.

You must use the NLS_SORT operator with comparison operations if you want the linguistic sort behavior.

Property Description
Parameter type String
Syntax NLS_COMP = { BINARY | LINGUISTIC | ANSI }
Default value BINARY
Modifiable ALTER SESSION
Basic No

Values:

  • BINARY

Normally, comparisons in the WHERE clause and in PL/SQL blocks is binary unless you specify the NLSSORT function.

  • LINGUISTIC

Comparisons for all SQL operations in the WHERE clause and in PL/SQL blocks should use the linguistic sort specified in the NLS_SORT parameter. To improve the performance, you can also define a linguistic index on the column for which you want linguistic comparisons.

  • ANSI

A setting of ANSI is for backwards compatibility; in general, you should set NLS_COMP to LINGUISTIC

来源

 

在 windows 7 上安装 oracle 10g

需要下载

Oracle Database 10g Release 2 (10.2.0.3/10.2.0.4)
Enterprise/Standard Edition for Microsoft Windows Vista and Windows 2008

解压下载下来的zip文件,打开两个目录下的refhost.xml

10203_vista_w2k8_x86_production_db\db\Disk1\stage\prereq\db\refhost.xml

10203_vista_w2k8_x86_production_db\db\Disk1\stage\prereq\db_prereqs\db\refhost.xml

两个文件修改需要修改的内容一样,

在<CERTIFIED_SYSTEMS>节点里面加入以下内容:

<OPERATING_SYSTEM>
<VERSION VALUE=”6.1″/>
</OPERATING_SYSTEM>

最终内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <CERTIFIED_SYSTEMS>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.0"/>
      <SERVICE_PACK VALUE="1"/>
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.1"/>
      <SERVICE_PACK VALUE="1"/>
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.2"/>
    </OPERATING_SYSTEM>
    <!--Microsoft Windows Vista-->
    <OPERATING_SYSTEM>
      <VERSION VALUE="6.0"/>
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
    <VERSION VALUE="6.1"/>
    </OPERATING_SYSTEM>
  </CERTIFIED_SYSTEMS>
 

jquery.treeview插件绑定数据库(php+oracle)

公司的HOA系统有个人员组织选定的功能,用的是MzTreeView这个js库,后台的人员信息表也是根据MzTreeView来设计的,也就是任意一条记录有一个id来唯一标识这条记录和一个parentId来记录它的父节点。

mztreeview

最近在学习jquery,找到了很多实用的插件,比如今天要说的是jquery.treeview

打算将jquery.treeview插件绑定到数据库,从数据库中取数据,用的脚本是php,后台数据库将就系统本来的oracle。

在功能上其实mztreeview比jquery.treeview要强大一些,效率还高点。唯一好点就是js压缩后只有6k,而mztreeview有20多k。总之没事干,just 4 fun。

表结构:

Name Type Nullable Default Comments
————- ————- ——– ——- ——–
ID_ROLE NUMBER(10)
CHAR_ROLENAME NVARCHAR2(30)
INT_ROLETYPE NUMBER(10)
ID_UPLEVEL NUMBER(10)
CHAR_REMARK VARCHAR2(50) Y
B_DELETE NUMBER(2)
INT_ORDER NUMBER(10) Y
DEPT_CODE NVARCHAR2(30) Y ’se’

ID_ROLE是unique id,ID_UPLEVEL是parent id。

jquery下载下来之后,解压放到web目录,然后把下面的脚本文件放入demo目录。
php脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

    <meta http-equiv="content-type" content="text/html; charset=gb2312"/>
    <title>treeview test on hoa</title>
   
    <link rel="stylesheet" href="../jquery.treeview.css" />
    <link rel="stylesheet" href="../red-treeview.css" />
    <link rel="stylesheet" href="screen.css" />
   
    <script src="../lib/jquery.js" type="text/javascript"></script>
    <script src="../lib/jquery.cookie.js" type="text/javascript"></script>
    <script src="../jquery.treeview.js" type="text/javascript"></script>
   
    <script type="text/javascript">
    $(document).ready(function(){
        $("#browser").treeview({  //调用jquery.tree的代码
            collapsed:true,  //默认把组织树收缩起来
        });
    });
    </script>
    </head>
    <body>
   
    <h1 id="banner"> Demo</h1>
    <div id="main">
    <ul id="browser" class="treeview-red">
    <?php

function read($uplevel){ //递归函数,用来遍历树
    $conn = oci_connect('ora_user', 'ora_pass', 'orcl');  
    if(!$conn)
    {
        print ("conn error");
    }
    $query = "SELECT * FROM sa_role where id_uplevel=".$uplevel." and b_delete='0' order by id_role";
    //echo $query;
    $stid = oci_parse($conn, $query);

    $r = oci_execute($stid, OCI_DEFAULT);
    while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS))
    {  
        if($row[2]==2) //$row[2]是INT_ROLETYPE,2是下面有子节点,1是叶子(就是没有子节点的节点)
        {  
            print "<li> <span class=\"folder\">";
            print $row[1]."</span> \n"; //$row[1]是节点内容,这个字段是CHAR_ROLENAME
            print "\n\t<ul>";
            $uplevel=$row[0];
            read($uplevel); //再调用自己继续读节点
        }
        if($row[2]==1) //如果是叶子
        {  
           
            print "<li> <span class=\"file\">";
            print $row[1]."</span> ";
            print "</li>";  
        }
    }
    print "</ul>";
    oci_close($conn);
}
read(-1);//假设根节点id为-1
print "</li>";
?>
    </ul>  
    </div>
 
</body></html>

其中修改

1
<ul id="browser" class="treeview-red">

中class的值为treeview-red,treeview-default,treeview-black,treeview-gray,treeview-famfamfam,这些是jquery.treeview自带的样式。

可以在

1
2
        $("#browser").treeview({  
        });

中,可以加入参数自定义,具体参数用法参照:http://docs.jquery.com/Plugins/Treeview/treeview#options
参数解释:
animated: “fast” 树的展开速度为快
collapsed: true 收缩树的所有节点
unique: true 保持每次展开1个节点,关闭之前打开的兄弟节点
persist: “location” 把进入的节点位置通过url保存

1
2
3
4
        branches = $("<li class='closed'><span class='folder'>New Sublist</span><ul><li><span class='file'>Item1</span></li><li><span class='file'>Item2</span></li></ul></li>").prependTo("#folder21");
        $("#browser").treeview({
            add: branches
        });

插入新节点

persist: “cookie” 把进入的节点位置通过cookie保存,需要jquery插件jquery.cookie.js
cookieId: “treeview-black” 设置cookie名
control: “#treecontrol” 把树的控制交给id为treecontrol

toggle: function() {
window.console && console.log(“%o was toggled”, this);
}
设定一个交替函数

———
最后效果:
jquery.treeview.demo

这里只做到了树的查看,还有有些问题需要解决,比如节点插入,删除,编辑与数据库的交互,貌似需要用到牛逼的ajax。

 

上班生活开始了

上周二跑到我哥的公司去面试,最后录用了,应该是看在哥的面子上。

公司主要的产品是医院办公自动化系统和信息管理系统,比较专业的说法叫HOA和HIS,用asp+oracle/sqlserver开发的。还有考勤机、一卡通等产品。

已经上班有个星期了,主要的工作就是读HOA系统代码,方便以后系统的修改。

星期五上午到歌乐山胸科医院去给别个装HOA系统,导入数据库的时候出现了问题:

ora-01400:无法将Null插入

IMP-00019:由于 ORACLE 错误 1400 而拒绝行

IMP-00003:遇到 ORACLE 错误 1400

ORA-01400:无法将 Null 插入(“DB”.”TABLE”.”ID”)

屏幕不停的滚动,后来才知道那个表有11万多行,就这样不停的报错,就算是加入ignore=y参数,导入数据库也要1个小时才能搞定。

最不解的是回家用电脑查询ID字段没有一个记录为Null的,看样子应该不是导入数据库的问题。

这个星期一换了一个干净点的数据库终于把这个问题给解决了,但是系统还是有点问题,服务器开机后,客户机无法登陆进OA系统。但是登陆进服务器之后再注销一次就可以了,相当不解的问题。

很巧合的时候,我们上歌乐山那天正好是“11.27”大屠杀纪念日,很多人都去了红岩广场。

去的时候也非常不方便,从小龙坎走到陈家湾,然后坐807到烈士墓,然后做长安车上山。

不知道是不是我们公司HOA系统的bug,我到了公司可以登陆进HOA系统,回到寝室就完全没反应了,但是用sqlplus就可以连接到数据库。应该和本地连接有一点的联系。

看了大概一个星期的代码,我最大的感受就是代码质量不高,不符合MVC开发模式。代码和样式完全是混合的,再加上table的布局,还有一些不规范的变量申明(比如iii,kkk无意义字符,错误的英文单词),确实看起来很恼火。不过我都将我读代码发现的问题,需要改进的,还自己不知道的都记录下来,需要以后有机会能用上它重写这个系统。

公司用了dll来加密系统,这方面的知识我还是空白,不过可以尝试分析一下dll源代码,但是貌似没人给我。

今天星期二,考试科目”internet开发”,说白了就是asp.net,没啥好说的,很水儿。

考完了,在工行存了点钱,然后在网上买了本书:“SQL语法范例大全(SQL Server 、Oracle通解)”,选择这本书的原因是不仅讲了oracle,还讲了sqlserver,包括存储过程的编写(这个是以后要求的)。希望对我现在的工作有帮助。

SQL语法范例大全(SQL Server 、Oracle通解)

感觉上班和上课生活有相似的有不同的。相似的是都是坐在电脑前面,不同的是作息时间。

我现在真正的成为了IT民工,工薪一族,虽然听说公司最近数月都没发工薪了。

家里人叫我去考公务员,铁饭碗,稳定。其实我一点兴趣也没有。唉,必须得看出点成绩才能改变家里人的“铁饭碗”思想。