Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131831
  • 博文数量: 16
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 10:25
文章分类

全部博文(16)

文章存档

2010年(16)

我的朋友

分类: Oracle

2010-01-08 01:30:20

工作记录:

1 外连接的简单使用
2 查询阻塞一个session的原因

1 外连接的简单使用


实验记录:

    测试数据创建:

        DROP TABLE person_info PURGE;
        DROP TABLE salary_info PURGE;

        CREATE TABLE person_info(
            ID NUMBER, 
            NAME VARCHAR(20), 
            CONSTRAINT pk_person_info 
            PRIMARY KEY (ID));

        CREATE TABLE salary_info(
            ID NUMBER, 
            months VARCHAR2(6), 
            salary_class VARCHAR2(20),  
            SALARY NUMBER(8, 2), 
            CONSTRAINT pk_salary_info 
            PRIMARY KEY (ID, months,salary_class));

        INSERT INTO person_info
        VALUES(1,'Cuizl');

        INSERT INTO person_info
        VALUES(2,'Thinkaw');

        INSERT INTO person_info
        VALUES(3,'None');

        INSERT INTO salary_info
        VALUES(1,'200912','Basic',2000);

        INSERT INTO salary_info
        VALUES(1,'200912','Extra',400);

        INSERT INTO salary_info
        VALUES(2,'200912','Basic', 1800);

        SELECT * FROM person_info;

        SELECT * FROM salary_info;

    问题:

查询所有员工在200912月的工资,如果没有的话显示为0
          ID 姓名 工资总额
        SELECT A.ID, A.NAME, nvl(C.SUM_SALARY,0)
          FROM PERSON_INFO A,
               (SELECT B.ID ID, SUM(B.SALARY) SUM_SALARY
                  FROM SALARY_INFO B
                 WHERE B.MONTHS = '200912'
                 GROUP BY B.ID) C
         WHERE A.ID = C.ID(+);

         注:这里需要注意的是对于外连接中的被连接表,需要考虑数据记录不为一的情况(假如如例子所示),person_info中的ID 1对应salary_info中200912月有两条记录,但是我们可能只需要一条,这是就需要对salary_info做SUM操作。这就是自己今天程序出的问题,当时考虑的不周到,特此记录。

2 查询阻塞一个session的原因

问题描述:

    如果一个SESSION,执行中出现异常,比如本来应该很快执行完毕的,但是却显示一直在执行,目前自己的理解就是系统资源不足,或者该SESSION被其他SESSION阻塞,今天遇到第二种情况。

实验如下:

    我们用第1个问题中的测试数据。
    -----------------------
    SESSON ONE
    -----------------------
    SQL> select distinct sid from v$mystat;

           SID
    ----------
           938
    
    --更新特定记录的工资,但是没有commit

    SQL> update salary_info
      2     set salary = 2200
      3   where id = 1
      4     and months='200912'
      5     and salary_class='Basic';

    已更新 1 行。

    ---------------------------------
    SESSION TWO
    ---------------------------------
    SQL> select distinct sid from v$mystat;

           SID
    ----------
           999

    --更新同SESSION ONE同一条记录(行级锁),一直处于等待状态
    SQL>update salary_info
      2     set salary = 2100
      3   where id = 1
      4     and months='200912'
      5     and salary_class = 'Basic'
    SQL> /
    ----------------------------------
    SESSION THREE
    ----------------------------------

    set linesize 120
    col machine for a30
        SELECT SID,
            SERIAL#,
            BLOCKING_SESSION_STATUS,
            BLOCKING_INSTANCE,
            BLOCKING_SESSION,
            MACHINE
        FROM V$SESSION
        WHERE SID IN ('938','999')

           SID    SERIAL# BLOCKING_SE BLOCKING_INSTANCE BLOCKING_SESSION MACHINE
    ---------- ---------- ----------- ----------------- ---------------- -----------------------
           938      36360 NO HOLDER                                      WORKGROUP\CUIZL
           999      32028 VALID                       1              938 WORKGROUP\CUIZL

    注:可以清楚的看到SESSION TWO(999)被SESSION ONE(938)阻塞。

补充:

    V$SESSION

阅读(1220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~