??xml version="1.0" encoding="utf-8" standalone="yes"?>
create table article
(
id number primary key,
count varchar2(4000),
pid number,
isleaf number(1), --0 代表非叶子节点,1代表叶子节点
alevel number(2)
);
insert into article values(1,'蚂蚁大战大象',0,0,0);
insert into article values(2,'大象被打下',1,0,1);
insert into article values(3,'蚂蚁也不好过',2,1,2);
insert into article values(4,'瞎说',2,0,2);
insert into article values(5,'没有瞎说',4,1,3);
insert into article values(6,'怎么可能',1,0,1);
insert into article values(7,'怎么没有可能',6,1,2);
insert into article values(8,'可能性是很大?,6,1,2);
insert into article values(9,'大象q医院了',2,0,2);
insert into article values(10,'护士是蚂?,9,1,3);
commit;
蚂蚁大战大象
大象被打下?br />
蚂蚁也不好过
瞎说
没有瞎说
大象q医院了
护士是蚂?br />
怎么可能
怎么没有可能
可能性是很大?br />
--用存储过E展现树状结构?br />
create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is
cursor c is select * from article where pid = v_pid;
v_preStr varchar2(1024) := '';
begin
for i in 0..v_level loop
v_preStr := v_preStr || '****';
end loop;
for v_article in c loop
dbms_output.put_line(v_preStr ||v_article.cont);
if(v_article.isleaf=0) then
p(v_artile.id,v_levle +1);
end if;
end loop;
end;
create or replace trigger trig
after insert or delete or update on emp2 for each row
begin
if inserting then
insert into emp2_log values (USER,'insert',sysdate); --USER关键字,用户?br />
elsif updating then
insert into emp2_log values (USER,'update',sysdate);
elsif deleting then
insert into emp2_log values (USER,'delete',sysdate);
end if;
end;
update emp2 set sal = sal*2 where deptno = 30;
select * from emp2_log;
drop trigger trig;
--直接执行Ӟ出现q反完整U束条gQ已扑ֈ子记录?br /> update dept set deptno = 99 where deptno = 10;
--使用下面的,把子表一h新?br />
create or replace trigger trig
after update on dept for each row
begin
update emp set deptno =:NEW.deptno where deptno =:OLD.deptno;
end;
update dept set deptno = 99 where deptno = 10;
select * from emp;
rollback;
数据库定义的函数money_to_chinese Q把数字转换正中文输出?/span>
create or replace function money_to_chinese(money in VARCHAR2)
return varchar2 is
c_money VARCHAR2(12);
m_string VARCHAR2(60) := '分角圆拾C万拾C?;
n_string VARCHAR2(40) := '壹贰叁肆伍陆柒捌?;
b_string VARCHAR2(80);
n CHAR;
len NUMBER(3);
i NUMBER(3);
tmp NUMBER(12);
is_zero BOOLEAN;
z_count NUMBER(3);
l_money NUMBER;
l_sign VARCHAR2(10);
BEGIN
l_money := abs(money);
IF money < 0 THEN
l_sign := '? ;
ELSE
l_sign := '';
END IF;
tmp := round(l_money, 2) * 100;
c_money := rtrim(ltrim(to_char(tmp, '999999999999')));
len := length(c_money);
is_zero := TRUE;
z_count := 0;
i := 0;
WHILE i < len LOOP
i := i + 1;
n := substr(c_money, i, 1);
IF n = '0' THEN
IF len - i = 6 OR len - i = 2 OR len = i THEN
IF is_zero THEN
b_string := substr(b_string, 1, length(b_string) - 1);
is_zero := FALSE;
END IF;
IF len - i = 6 THEN
b_string := b_string || '?;
END IF;
IF len - i = 2 THEN
b_string := b_string || '?;
END IF;
IF len = i THEN
IF (len = 1) THEN
b_string := '零圆?;
ELSE
b_string := b_string || '?;
END IF;
END IF;
z_count := 0;
ELSE
IF z_count = 0 THEN
b_string := b_string || '?;
is_zero := TRUE;
END IF;
z_count := z_count + 1;
END IF;
ELSE
b_string := b_string || substr(n_string, to_number(n), 1) ||
substr(m_string, len - i + 1, 1);
z_count := 0;
is_zero := FALSE;
END IF;
END LOOP;
b_string := l_sign || b_string ;
RETURN b_string;
exception
--异常处理
WHEN OTHERS THEN
RETURN(SQLERRM);
END;
--执行Q?br /> exec p;
begin
p;
end;
--带参数的存储q程Qin传入参数Q默认ؓ传入Qout传出?/span>
create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a >v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp :=v_temp +1;
end;
declare
v_a number := 3;
v_b number := 4;
v_ret number;
v_temp number := 5;
begin
p(v_a,v_b,v_ret,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end;
declare
cursor c is
select * from emp;
v_emp emp%rowtype;
begin
open c;
fetch c into v_emp;
while(c%found) loop
dbms_output.put_line(v_emp.ename);
fetch c into v_emp;
--fetch c into v_emp; DW一条没有打华ͼ最后一条打?遍?br />
--dbms_output.put_line(v_emp.ename);
end loop;
close c;
end;
declare
cursor c is
select * from emp;
begin
for v_emp in c loop
dbms_output.put_line(v_emp.ename);
end loop;
end;
--带参数的游标
declare
cursor c(v_deptno emp.deptno%type,v_job emp.job%type)
is
select ename,sal from emp where deptno =v_deptno and job= v_job;
--v_temp c%rowtype;
begin
for v_temp in c(30,'CLERK') loop --for自动打开游标?br />
dbms_output.put_line(v_temp.ename);
end loop;
end;
--可更新的游标
declare
cursor c
is
select * from emp2 for update;
--v_temp c%rowtype;
begin
for v_temp in c loop
if(v_temp.sal <2000) then
update emp2 set sal = sal*2 where current of c;
elsif(v_temp.sal = 5000) then
delete from emp2 where current of c;
end if;
end loop;
commit;
end;
set serveroutput on;
-- 单的PL/SQL语句?/span>
declare
v_name varchar2(20);
begin
v_name :='myname';
dbms_output.put_line(v_name);
end;
/
--语句块的l成
declare
v_num number := 0 ;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error');
end;
/
--变量声明的规?br />
1、变量名不能够用保留字Q如from、select{?br />
2、第一个字W必L字母
3、变量名最多包?0个字W?br />
4、不要与数据库的表或者列同名
5、每一行只能声明一个变?/span>
--常用变量cd
1、binary_integerQ整敎ͼ主要用来计数而不是用来表C字D늱?br />
2、numberQ数字类?br />
3、charQ定长字W串
4、varchar2Q变长字W串
5、dateQ日?br />
6、longQ长字符Ԍ最?GB
7、booleanQ布类型,可以取值true、false和null?/span>
--变量声明
declare
v_temp number(1);
v_count binary_integer :=0;
v_sal number(7,2):= 4000.00;
v_date date:= sysdate;
v_pi constant number(3,2) := 3.14; --constant相当java的final帔R
v_valid boolean := false;
v_name varchar2(20) not null :='MyName';
begin
dbms_output.put_line('v_temp value:'|| v_temp);
end;
--变量声明Q?type属?br />
declare
v_empno number(4);
v_empno2 emp.empno%type;
v_empno3 v_empno2%type;
begin
dbms_output.put_line('Test');
end;
--单变量赋?br />
declare
v_name varchar2(20);
v_sal number(7,2);
v_sal2 number(7,2);
v_valid boolean :=false;
v_date date;
begin
va_name :='MyName';
v_sal :=23.77;
v_sal2 :=23.77;
v_valid:=(v_sal = v_sal2);
v_date:=to_date('1999-08-12 12:23:38','YYYY-MM-DD HH24:MI:SS');
end;
--Table变量cdQ定义一U新的类型,是数l?/span>
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empno type_table_emp_empno;
begin
v_empnos(0) := 7369;
v_empnos(2) := 7839;
v_empnos(-1) := 9999;
dbms_output.put_line(v_empnos(-1));
end;
--Record变量cd,cMjava的类的概c?/span>
declare
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
v_tmp type_record_dept;
begin
v_tmp.deptno := 50;
v_tmp.dname := 'aaaa';
v_tmp.loc := 'bj';
dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
end;
--使用%rowtype声明Record变量
declare
v_temp dept%rowtype;
begin
v_tmp.deptno := 50;
v_tmp.dname := 'aaaa';
v_tmp.loc := 'bj';
dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
end;
--SQL语句的运用,q回数据有且只有一条记录?br />
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno = 7369;
dbms_output.put_line(v_ename||''||v_sal);
end;
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno = 7369;
dbms_output.put_line(v_emp.ename);
end;
declare
v_deptno dept.deptno%type := 50;
v_dname dept.dname%type := 'aaaa';
v_loc dept.loc%type := 'bj';
begin
insert into dept2 values (v_deptno,v_dname,v_loc);
commit;
end;
declare
v_deptno emp2.deptno%type := 10;
v_count number ;
begin
--update emp2 set sal = sal/2 where deptno = v_deptno;
--select deptno into v_deptno from emp2 where empno = 7369;
select count(*) into v_count from emp2;
dbms_output.put_line(sql%rowcount||'条记录被影响');
commit;
end;
DDL语句Q?br />
begin
execute immediate 'create table T(nnn varchar2(20) default ''aaa'')';
end;
--if语句Q取?369的薪_如果<1200Q则输出'low'Q如?lt;2000则输?middle'Q否?high'
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7369;
if(v_sal < 1200) then
dbms_output.put_line('low');
elsif(v_sal < 2000) then
dbms_output.put_line('middle');
else
dbms_output.put_line('high');
end if;
end;
--循环
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i+ 1;
exit when (i >= 11);
end loop;
end;
declare
j binary_integer := 1;
begin
while j< 11 loop
dbms_output.put_line(j);
j := j+ 1;
end loop;
end;
begin
for k in 1..10 loop
dbms_output.put_line(k);
end loop;
for k in reverse 1..10 loop
dbms_output.put_line(k);
end loop;
end;
--错误处理
declare
v_temp number(4);
begin
select empno into v_temp from emp where deptno = 10;
exception
when too_many_rows then
dbms_output.put_line('太多记录?);
when others then
dbms_output.put_line('error');
end;
declare
v_temp number(4);
begin
select empno into v_temp from emp where empno = 2222;
exception
when no_data_found then
dbms_output.put_line('没数?);
end;
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);
create sequence seq_errorlog_id start with 1 increment by 1;
declare
v_deptno dept.deptno%type := 10;
v_errmsg varchar2(1024);
begin
delete from dept where deptno = v_deptno;
commit;
exception
when others then
rollback;
v_errcode := SQLCODE; --关键字,代表出错的代码?br />
v_errmsg := SQLERRM;
insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;
W一范式Q?NFQ:无重复的列?/span>
所谓第一范式Q?NFQ是指数据库表的每一列都是不可分割的基本数据,同一列中不能有多?/span>|卛_体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间ؓ一对多关系。在W一范式Q?NFQ中表的每一行只包含一个实例的信息。简而言之,W一范式是无重复的列?br />
数据库表中的字段都是单一属性的Q不可再分。这个单一属性由基本cd构成Q包括整型、实数、字W型、逻辑型、日期型{?/span>
说明Q在M一个关pL据库中,W一范式Q?NFQ是对关pL式的基本要求Q不满W一范式Q?NFQ的数据库就不是关系数据库?
W二范式Q?NFQ:属性完全依赖于主键[消除部分子函C赖]?br />
W二范式Q?NFQ是在第一范式Q?NFQ的基础上徏立v来的Q即满W二范式Q?NFQ必d?/span>第一范式Q?NFQ。第二范式(2NFQ要求数据库表中的每个实例或行必d以被惟一地区分。ؓ?/span>现区分通常需要ؓ表加上一个列Q以存储各个实例的惟一标识。例如员工信息表中加上了员工~号Qemp_idQ列Q因为每个员工的员工~号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称Z关键字或主键、主码?
W二范式Q?NFQ要求实体的属性完全依赖于d键字。所谓完全依赖是指不能存在仅依赖?/span>关键字一部分的属性,如果存在Q那么这个属性和d键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关pRؓ实现区分通常需要ؓ表加上一个列Q以存储各个实例?/span>惟一标识。简而言之,W二范式是属性完全依赖于主键?
W三范式Q?NFQ:属性不依赖于其它非d性[消除传递依赖]?/span>
满W三范式Q?NFQ必d满W二范式Q?NFQ。简而言之,W三范式Q?NFQ要求一个数据库表中不包含已在其它表中已包含的非d键字信息。例如,存在一个部门信息表Q其中每?/span>部门有部门编Pdept_idQ、部门名U、部门简介等信息。那么在的员工信息表中列出部门编号后?/span>不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,?/span>ҎW三范式Q?NFQ也应该构徏它,否则׃有大量的数据冗余。简而言之,W三范式是属性不?/span>赖于其它非主属性?br />
所谓传递函C赖,指的是如果存?A → B → C"的决定关p,则C传递函C赖于A?/span>
create table article
(
id number,
title varchar2(1024),
cont long
);
insert into article values(seq.nextval,'a','b');
select * from user_sequences; --查询序列
create sequence seq; --创徏序列seq对象
select seq.nextval from dual;
drop sequence seq;
视图的优点:
1、对数据库的讉KQ可以有选择性的选取数据库里的一部分信息Q?span style="color: #0000ff">整张表的信息不对外开?/span>?.用户通过单的查询可以从复杂查询中得到l果?br />
视图的缺点:
如果一个表的结构改了,相应的视囑֦果用C该表的字D,也要q行修改Q?span style="color: #0000ff">增加l护工作?/span>?/span>
单视图:只从单表里获取数据,不包含函数和数据l,可以实现DML操作?/span>
复杂视图Q从多表获取数据Q包含函数和数据l,不可以DML操作?br />
视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
其中Q?br />
OR REPLACEQ若所创徏的试囑ַl存在,ORACLE自动重徏该视图;
FORCEQ不基表是否存在ORACLE都会自动创徏该视图;
NOFORCEQ只有基表都存在ORACLE才会创徏该视图:
aliasQؓ视图产生的列定义的别名;
subqueryQ一条完整的SELECT语句Q可以在该语句中定义别名Q?br style="font-family: " />
WITH CHECK OPTION Q插入或修改的数据行必须满视图定义的约束;
WITH READ ONLY Q该视图上不能进行Q何DML操作?/span>
例如Q?br />
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
查询视图Q?span style="color: #008000">select * from user_views;
修改视图Q?span style="color: #008000">通过OR REPLACE 重新创徏同名视图卛_?/span>
删除视图Q?span style="color: #008000">DROP VIEW VIEW_NAME;
视图的定义原则:
1.视图的查询可以用复杂的SELECT语法Q包括连?分组查询和子查询Q?br />
2.在没有WITH CHECK OPTION?READ ONLY 的情况下Q查询中不能使用ORDER BY 子句Q?br />
3.如果没有为CHECK OPTIONU束命名Q系l会自动Z命名QŞ式ؓSYS_Cn;
4.OR REPLACE选项可以不删除原视图便可更改其定义ƈ重徏Q或重新授予对象权限?br />
视图上的DML操作Q应遵@的原则:
1.单视囑֏以执行DML操作Q?br />
2.在视囑含GROUP 函数QGROUP BY子句QDISTINCT关键字时不能删除数据行;
3.在视图不出现下列情况时可通过视图修改数据或插入数据:
a.视图中包含GROUP 函数QGROUP BY子句QDISTINCT关键字;
b.使用表达式定义的列;
c .ROWNUM伪列?br />
d.中未在视图中选择的其他列定义为非IZ无默认倹{?/p>
WITH CHECK OPTION 子句限定Q?br />
通过视图执行的INSERTS和UPDATES操作不能创徏该视图检索不到的数据?/span>Q因为它会对插入或修改的数据行执行完整性约束和数据有效性检查?br />
例如Q?br />
CREATE OR REPLACE VIEW vw_emp20
AS SELECT * FROM emp
WHERE deptno=20
WITH CHECK OPTION constraint vw_emp20_ck;
视图 已徏立?br />
查询l果Q?br />
SELECT empno,ename,job FROM vw_emp20;
EMPNO ENAME JOB
--------------------- -------------- -------------
7369 SMITH CLERK
7566 JONES MANAGER
7902 FORD ANALYST
修改Q?br />
UPDATE vw_emp20
SET deptno=20
WHERE empno=7902;
生错误:
UPDATE vw_emp20
*
ERROR 位于W一行:
ORA-01402Q视图WITH CHECK OPTION q反WHERE 子句
U束条g?个:非空、唯一、主键、外键、check?br />
create table stu
(
id number(6), --primary key
name varchar2(20) constraint stu_name_nn not null, --stu_name_nn别名
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4), --references class(id)
email varchar2(50),
--email varchar2(50) unique --字段U约束,不能有重复?br />
constraint stu_name_email_uni unique(name,email), --表U束
constraint stu_id_pk primary key(id), --表U束
constraint stu_class_fk foreign key(class) references class(id) --被参考字D必L主键
);
create table class
(
id number(4) primary key,
name varchar2(20) not null
)
alter table stu add(addr varchar2(100)); --对已存在的表新增字段
alter table stu modify(addr varchar2(150)); --对字D修?br />
alter table stu drop (addr); --删除一个字D?br />
alter table stu drop constraint stu_class_fk;
delete from class;
drop table class;
DMLQdata manipulation languageQ:它们是SELECT、UPDATE、INSERT、DELETEQ就象它的名字一Pq?条命令是用来Ҏ据库里的数据q行操作的语a?/p>
conn sys/sys as sysdba;
drop user pcisv6 cascade;
exp --备䆾scott用户下的?br />
--创徏用户,identified证相当是密码Qquota配额是分配I间?br />
create user pcisv6 identified by 11 default tablespace core6 quota 10M on corev6
grant create session,create table,create view to pcisv6; --授权Qsession是用于登录的
imp --导入scott用户下的?br />
SELECTQ?br />
select rownum r,ename from emp; --rownum行数Q目前只能?lt;?lt;=, 而没有直?gt;?的写法?br />
select ename, sal --求薪水最高的??br />
from (select ename, sal from emp order by sal desc)
where rownum <= 5;
--求薪水最高的??0?br />
select ename,sal,rownum r from emp order by sal desc; --r 排序混ؕ
select ename,sal,rownum r from (select ename,sal from emp order by sal desc); --此时r序号按新表排?br />
select ename, sal -- 此处为结?br />
from (select ename, sal, rownum r
from (select ename, sal from emp order by sal desc))
where r >= 6
and r <= 10;
UPDATEQ?br />
update emp2 set sal=sal*12,ename=ename||'-' where deptno=10;
DELETEQ?br />
delete from dept2 where deptno<25;
rollback;
TRANSACTIONQ?br />
transaction 起始一条dml语句Q在commit、rollback时完成?br />
transaction 在执行dml后,在其后有执行了ddl、dclӞ事务自动提交?br />
在正帔R出exitӞ事务自动提交?br />
在非正常退出时Q事务回滚?br />
------------------------------------------------------------
例子Q?br />
?个表SQCQSC
SQSNOQSNAMEQ代表(学号Q姓名)
CQCNOQCNAMEQCTEACHERQ代表(译֏Q课名,教师Q?
SCQSNOQCNOQSCGRADEQ代表(学号Q课hl)
问题Q?
1Q找出没选过“黎明”老师的所有学生姓名?
2Q列?门以上(?门)不及格学生姓名及q_成W?
3Q即学过1可E有学过2可所有学生的姓名?
L标准SQL语言写出{案Q方a也行Q请说明是用什么方aQ?
1.
select sname froms
join sc on (s.sno = sc.sno)
join c(c.cno = sc.cno)
where c.cteacher <> 'liming';
2.
select sname
where sno in (select sno
from sc
where scgrade < 60
group by sno
having count(*) >= 2);
3.
select sname
where sno in (select sno
from sc
where cno = 1
and sno in (select sno from sc where cno = 2));
--求部门中哪些人的薪水最?br />
select ename,sal from emp
join (select max(sal) max_sal,deptno from emp group by deptno) t
on (emp.sal = t.max_sal and emp.deptno = t.deptno);
--求部门^均薪水的{
select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal);
--求部门^均的薪水{
select avg(grade) from
(select deptno,ename,grade from emp join salgrade s on (emp.sal between s.losal and s.hisal )) t
group by deptno;
--雇员中有哪些人是l理?br /> select ename from emp where empno in (select distinct mgr from emp);
--不准用组函数Q求薪水的最高倹{采用的是自q接?br />
select distinct sal from emp where sal not in
(select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal));
--求^均薪水最高的部门的部门编受嵌套的l函数?br />
select deptno,avg_sal from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg(sal)),deptno from emp group by deptno;
--求^均薪水的{最低的部门的部门名U?br />
select dname,t1.deptno,grade,avg_sal from
(
select deptno,grade,avg_sal from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
)
t1
join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
select min(grade) from
(select deptno,grade,avg_sal from
(select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal)
)
)
--求^均薪水的{最低的部门的部门名U。采用视图?br />
conn sys/sys as sysdba;
grant create table,create view to scott;
create view v$_dept_avg_sal_info as
select deptno,grade,avg_sal from
(select deptno,grade,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on (t.avg_sal between s.losal and s.hisal);
select dname,t1.deptno,grade,avg_sal from
v$_dept_avg_sal_info t1
join dept on (t1.deptno = dept.deptno)
)
where t1.grade =
(
select min(grade) from v$_dept_avg_sal_info
)
-- 比普通员工的最高薪水还要高的经理h名称?br />
select ename from emp
where empno in (select distinct mgr from emp where mgr is not null)
and sal >
(
select max(sal) from emp where empno not in
(select distinct mgr from emp where mgr is not null)
)
--1999qsql标准,q接条g和过滤条件分开
select ename,dname,grade
from emp e join dept d on (e.deptno = d.deptno)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%';
select sal from emp where sal>to_number('$1,250.00','$9,999.99');
select ename,sal*12 + nvl(comm,0) from emp; --对空值处?br />
l函敎ͼ
select max(sal) from emp;
select min(sal) from emp;
select avg(sal) from emp;
select sum(sal) from emp;
select count(*) from emp; -- *求出总记录数, count(comm)求出该列不ؓI的倹{?br />
select deptno,job,max(sal) from emp group by deptno,job; --按照条gl合分组
select ename from emp where sal =(select max(sal) from emp); --子查?br />
update Web_Bas_Edr_Rsn set c_rsn_txt=REPLACE(c_rsn_txt,'天|','北京') where c_rsn_txt like '%天|%' --扚w替换
-- having对分l进行限Ӟwhere对单行限?/span>
select avg(sal) from emp where sal>1000 group by deptno having avg(sal) >1500 order by avg(sal) desc;
CREATE OR REPLACE PROCEDURE V6.P_WEB_CUS_CLINT_DPT
IS
--增量抽取客户信息数据
v_task_start_date date ;
v_task_end_date date ;
v_sql_code number :=0 ;
v_sql_msg VARCHAR2(4000) := '' ; --sql错误信息
V_Cus_Client Web_Cus_Client%rowtype ;
V_UPD_TM date;
V_APP_NO varchar2(50);
V_DPT_CDE varchar2(50);
V_COUNT number(4,0);
cursor CUR_WEB_CUS_ADD is
select *
from Web_Cus_Client
a where a.C_DPT_CDE is null;
BEGIN
SELECT SYSDATE INTO v_task_start_date FROM dual; --d开始时间和dl束旉
SELECT SYSDATE INTO v_task_end_date FROM dual;
v_sql_msg := '对WEB_CUS_CLENT机构为空的进行修?;
open CUR_WEB_CUS_ADD;
loop
fetch CUR_WEB_CUS_ADD into V_Cus_Client;
exit when CUR_WEB_CUS_ADD% notfound;
v_sql_msg := V_Cus_Client.c_Clnt_Cde||'对WEB_CUS_CLENT机构为空的进行修?;
V_COUNT :=0;
select count(1) into V_COUNT from WEB_PLY_APPLICANT a where a.C_APP_CDE=V_Cus_Client.c_Clnt_Cde;
if(V_COUNT>0) then
select max(T_CRT_TM) into V_UPD_TM from WEB_PLY_APPLICANT a where a.C_APP_CDE=V_Cus_Client.c_Clnt_Cde;
select max(C_APP_NO) into V_APP_NO from WEB_PLY_APPLICANT a where a.T_CRT_TM=V_UPD_TM and a.C_APP_CDE=V_Cus_Client.c_Clnt_Cde;
select C_DPT_CDE into V_DPT_CDE from web_PLY_BASE a where a.C_APP_NO=V_APP_NO;
update WEB_CUS_CLIENT a set a.C_DPT_CDE=V_DPT_CDE where a.C_CLNT_CDE=V_Cus_Client.c_Clnt_Cde;
end if;
commit;
end loop;
close CUR_WEB_CUS_ADD;
--写Q务日?br />
v_sql_code :=0;
v_sql_msg := 'NORMAL, SUCCESSFUL COMPLETION';
SELECT SYSDATE INTO v_task_end_date FROM dual;
INSERT INTO LOAD_HIS_LOG
( SYS
,JOBNAME
,START_DATE
,END_DATE
,RUN_DATE
,SQL_CODE
,SQL_STATE
)
VALUES
('V5_MID'
,'P_WEB_CUS_CLINT_DPT'
,v_task_start_date
,v_task_end_date
,to_char((v_task_end_date - v_task_start_date) * 86400)
,v_sql_code
,v_sql_msg
);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_sql_code := SQLCODE;
v_sql_msg := v_sql_msg || ' ' || ' : ' || SQLERRM;
SELECT SYSDATE INTO v_task_end_date FROM dual; --dl束旉
ROLLBACK;
INSERT INTO LOAD_HIS_LOG
( SYS
,JOBNAME
,START_DATE
,END_DATE
,RUN_DATE
,SQL_CODE
,SQL_STATE
)
VALUES
('V5_MID'
,'P_WEB_CUS_CLINT_DPT'
,v_task_start_date
,v_task_end_date
,to_char((v_task_end_date - v_task_start_date) * 86400)
,v_sql_code
,v_sql_msg
);
COMMIT;
END ;