◎筱米加步枪◎.Blog

Happy coding

Oracle 横表和纵表

前一段时间了解到的,今天有空写下,备忘~

先来说说横表和纵坐表的概念,先来看看以下两图:

第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式

第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。

从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。

在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。

Select student_no, 
        max(decode(field_name,'student_name',field_value)) As student_name,
        max(decode(field_name,'student_sex',field_value )) As student_sex 
    From cuc_student_y Group By student_no;

横转纵暂时不知~~望高人指点~~

Oracle 树状查询

在实际应用中,经常利用数据库保存树状结构的数据,通常用一张表中的两个字段表示,一个是自身的ID,一个是保存父类的ID。在这样具有这种关系中的数据,要求查出的数据具有我们想要的树状显示。这里需要引入Oracle的一个查询语句。

Select  *  from tablename
  start with [condition1]
  Connect By Prior  [condition2]
  where [condition3] 

condition1 通常是用于筛选某颗树或者多颗树的结点,这里所的树包括子树,

condtion2 通常是用于连接父结点和子结点的关系,prior 所表示的是上一条记录,通常用法:prior id = pid,(上一条的的ID号是本条记录的父类ID号)这样就把整个树状结构给建立起来了。

conditon3 就是我们通常的where语句,过滤某些记录。

现在看下具体例子。

其中Test_ID 表示本身的ID,Test_PID表示父类的ID

这边记录的描述成树状结构就是如下:

现在,假设我们查询的福州以及福州下的所有子东西,就可以这样查询,

只要取福州的根结点就可以,福州的根结点翻译成数据库中存的数据就是 test_id =1

因此得到的sql如下:

Select * From Test_ t 
  Start With Test_Id = 1
  Connect By Prior Test_Id = Test_Pid

查询结果:

用结构图表示就是如下信息:

因此想要查询某些信息,只要抓住根结点的条件就可以。。Over~~

远程连接Oracle10g数据库

百度之~在问问上搜到的答案并解决。

要进行远程连接Oracle数据库,首先需要对远程连接进行设置。具体做法如下:

【开始】>>【所有程序】>>【Oracle-OraDb10g_home1】>>【配置和移植工具】>>【Net Configuration Assistant】

选择【本地Net服务名配置】>>【添加】之后根据要连接的远程 数据库的IP 服务名 即可。之后就可以用PLSQL Developer进行登陆了。

具体操作可见下图:

1.选择Net Configuration Assistant

2.配置服务名

3.配置主机名

4.PLSQL Developer登录

PL/SQL笔记之table和record类型

今天,继续学了PL/SQL的语法,总结下table和record类型的知识:

①table类型(table有点 类似于可增长的数组)

    举两个例子:

/*
 *  ①定义一个user_table_type类型,
 *  这个类型中的元素属性类型是和t_user表中username字段一样的.
 */
Type user_table_type Is Table Of t_user.username%Type 
Index By Binary_Integer;

/* 声明一个user_table_type类型的变量user_table */
user_table  user_table_type


/*
 *  ②定义一个user_table_type类型,
 *  这个类型中的元素属性类型是和t_user表中一行记录类型一样的。
 */
Type user_table_type Is Table Of t_user%Type 
Index By Binary_Integer;

②record类型(可根据需要定义所想要的类型,一般是用于保存数据库中取出的行信息,有点类似于C语言中的结构体)

  举一个例子:

/*
 *  定义一个记录类型,是有number和varchar2(25)类型构成
 */
Type user_record_type IS RECORD
(  
    userid number,
    username varchar2(25)
);

/* 定义一个user_record_type类型的变量user_record */
 user_record user_record_type;

PS:table可以看作是多行单列,record可以看作是单行多列,二者合起来就是多行多列,可保存查询出来的记录。

PL/SQL笔记之%type和%rowtype

昨晚学习了下PL/SQL的基本语法~对于属性%type和%rowtype作了一些了解。笔记总结如下:

1.%type属性

declare     v_userid      t_user.userid%type 

/*** 表示声明一个变量v_userid,这个变量的类型是和t_user表中的userid属性一样。
使用%type属性的好处: v_userid的类型可以根据t_user.userid的类型动态的改变,当t_user.userid的类型改变时,而不用大量的去修改程序代码。 ***/

2.%rowtype属性

declare    v_userRecord         t_user%rowtype

/*** 表示v_userRecord是一个记录,该记录中的字段将与t_user表中的列相对应。
使用%rowtype的好处:v_userRecord记录的结构可以根据t_user表结构的改变而动态的改变。不用大量修改程序的代码。***/


PL/SQL之dbms_output.put_line不显示结果解决方法

今天练习PL/SQL的时候~想用dbms_output.put_line来输出变量的一些信息,却总是看不到结果~~百度之~~

得到解决方法:

原来要先输入以下代码才可以:

SQL>set serveroutput on

之后再用dbms_output.put_line输出就可以了~~