工作记录:
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
阅读(1213) | 评论(0) | 转发(0) |