-
create table dep( dno number(2), dname varchar2(30), director number(4), tel varchar(8) ); create table teacher( tno number(4), tname varchar2(10), title varchar2(20), hiredate date, sal number(7,2), bonus number(7,2), mgr number(4), deptno number(2) ); create table student( sno number(6), sname varchar2(8), sex varchar2(2), birth date, passwd varchar2(8), dno number(2) ); create table course( cno varchar2(8), cname varchar2(20), credit number(1), ctime number(2), quota number(3) ); create table sc( sno number(6), cno varchar2(8), grade number(3) );查看全部
-
pl/spl的优点是操作oracl数据库最快的一个工具,目前大公司基本都用的是oracl] 中型的企业一般使用SqlServer PL/SQL的基本结构是 --单行注释/*...*/多行注释 --打开输出开关 set serceroutput on declare --说明部分,以及定义变量 begin --程序 --使用dbms_output.put_line()这个方法进行系统输出 dbms_output.put_line('输出的内容'); --以end;/结束程序 end; /查看全部
-
Oracle sql Deveploper http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html查看全部
-
insert into teacher values(9468,'CHARLES','PROFESSOR','17-Dec-17',8000,1000,null,10); insert into teacher values(9469,'SMITH','PROFESSOR','17-Dec-17',5000,1000,9468,10); insert into teacher values(9470,'ALLEN','ASSOCIATE PROFESSOR','20-Feb-16',4200,500,9469,10); insert into teacher values(9471,'WARD','LECTURER','22-Feb-17',3000,300,9469,10); insert into teacher values(9581,'JONES','PROFESSOR','2-Apr-2016',6500,1000,9468,20); insert into teacher values(9582,'MARTIN','ASSOCIATE PROFESSOR','28-Sep-2018',4000,800,9581,20); insert into teacher values(9583,'BLAKE','LECTURER','1-May -2019',3000,300,9581,20); insert into teacher values(9791,'CLAKE','PROFESSOR','9-Jun-2016',5500,null,9468,30); insert into teacher values(9792,'SCOTT','ASSOCIATE PROFESSOR','09-Dec-17',4500,null,9791,30); insert into teacher values(9793,'BAGGY','LECTURER','17-Nov-2017',3000,null,9791,30);查看全部
-
insert into dep values(10,'计算机学院',9469,'62785234'); insert into dep values(20,'自动化学院',9581,'62775234'); insert into dep values(30,'无线电学院',9791,'62778932'); insert into dep values(40,'信息管理学院',9611,'62785520'); insert into dep values(50,'微纳电子学院',2031,'62797686');查看全部
-
alter table dep add(constraint pk_deptno primary key(dno)); alter table dep add(constraint dno_number_check check(dno>=10 and dno<=50)); alter table dep modify(tel default 62795032); alter table student add(constraint pk_sno primary key(sno)); alter table student add(constraint sex_check check(sex='男' or sex='女')); alter table student modify(birth default sysdate); alter table course add(constraint pk_cno primary key(cno)); alter table sc add(constraint pk_key primary key(cno,sno)); alter table teacher add(constraint pk_tno primary key(tno)); alter table sc add(foreign key(cno) references course(cno)); alter table sc add(foreign key(sno) references student(sno)); alter table student add(foreign key(dno) references dep(dno)); alter table teacher add(foreign key(deptno) references dep(dno));查看全部
-
对于SCOPE讲的不太明白。特意百度了一下: Oracle 里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle 的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。更改参数的时候,有4种scope选项。scope就是范围 ++ scope=spfile 仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等下次数据库启动生效。有一些参数只允许用这种方法更改 ++ scope=memory 仅仅更改内存,不改spfile。也就是下次启动就失效了 ++ scope=both 内存和spfile都更改 ++ 不指定scope参数,等同于scope=both.查看全部
-
能不操作数据库就不操作数据库。查看全部
-
-------------------PL/SQL程序设计方法-------------------
--瀑布模型
/*
1.需求分析
2.设计
1)概要设计
2)详细设计
3.编码 (Coding)
4.测试(Testing)
5.上线
SQL语句
变量:
1.初始值是多少
2.最终值如何得到
*/
------案例1、统计每年入职的员工人数-----
--SQL语句
select to_char(hiredate,'yyyy') from emp;
--> 游标 --> 循环 --> 退出条件:notfound
/*
变量:1.初始值 2.如何得到
每年入职的员工人数:
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
*/
set serveroutput on;
declare
cursor cemp is select to_char(hiredate,'yyyy') from emp; --定义游标,从表中取出员工入职年份
phiredate varchar2(4);
--每年入职的员工人数:
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
begin
open cemp;
loop
fetch cemp into phiredate; --取出一个员工的入职年份
exit when cemp%notfound; --取不到退出
--判断入职年份
if phiredate = '1980' then count80 := count80 + 1;
elsif phiredate = '1981' then count81 := count81 +1;
elsif phiredate = '1982' then count82 := count82 +1;
else count87 := count87 + 1;
end if;
end loop;
close cemp;
--输出结果
dbms_output.put_line('Total:'||(count80 + count81 + count82 + count87));
dbms_output.put_line('1980:'||count80);
dbms_output.put_line('1981:'||count81);
dbms_output.put_line('1982:'||count82);
dbms_output.put_line('1987:'||count87);
end;
/
/*
---案例2、为员工涨工资。从最低工资涨起,每人涨10%,单工资总额不能超过5万元,请计算涨工资的人数和涨工资后的工资总额,并输出涨工资人数及工资总额。
SQL语句
select empno,sal from emp order by sal;
-- > 游标 --> 循环 --> 退出条件: 1.工资总额>5w 2.%notfound
变量:1.初始值 2.如何得到
涨工资的人数: countEmp number := 0;
涨后的工资总额:salTotal number;
1.select sum(sal) into salTotal from emp;
2.涨后的工资总额=涨前的工资总额 + sal * 0.1
*/
set serveroutput on;
declare
cursor cemp is select empno,sal from emp order by sal; --定义游标
pempno emp.empno%type; --定义员工编号变量
psal emp.sal%type; --定义员工工资变量
countEmp number := 0; --涨工资人数计数器
salTotal number; --涨后的工资
begin
select sum(sal) into salTotal from emp; --给合计工资赋值
open cemp;
loop
exit when salTotal >50000; --合计工资大于5w退出循环
fetch cemp into pempno,psal; --从游标取值赋值到变量
exit when cemp%notfound; --取不到值退出循环
if salTotal + psal * 0.1 <= 50000 then --涨后的工资小于5w才执行涨工资
update emp set sal = sal * 1.1 where emp.empno = pempno; --执行涨工资
countEmp := countEmp + 1; --统计张工资的人数
salTotal := salTotal + psal * 0.1; --涨后的工资总额
end if;
end loop;
close cemp;
--commit; 提交最终涨工资事务
dbms_output.put_line('涨工资的人数为:'||countEmp);
dbms_output.put_line('涨工资后的工资总额为:'||salTotal);
end;
/
/*
案例3、用PL/SQL语言编写程序,实现按部门分段(6000以上、(6000、3000)3000以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)
SQL语句
1.有哪些部门
select deptno from dept; --游标 --> 循环 --> 退出条件:notfound
2.部门中员工的薪水
select sal from emp where deptno = ? 带一个参数的游标 --> 循环 --> 退出条件:notfound
变量:1.初始值 2.如何得到
每个段的员工人数:
count1 number;
count2 number;
count3 number;
每个部门的工资总额: 有2中方式获取
saltotal number;
1.select sum(sal) into saltotal from emp where deptno = ???
2.累加
*/
--创建一张表保存各工资段数据
create table msg(
deptno number,
count1 number,
count2 number,
count3 number,
saltotal number);
SELECT * FROM msg;
--程序第一种实现方式,SQL统计
DECLARE
CURSOR cdept IS SELECT deptno FROM dept; --定义游标,取出部门
pdeptno dept.deptno%TYPE; --定义部门变量
CURSOR cemp(dno NUMBER) IS SELECT sal FROM emp WHERE deptno = pdeptno; --部门中员工的薪水
psal emp.sal%TYPE; --员工薪水
--每个段的员工人数
count1 NUMBER;
count2 NUMBER;
count3 NUMBER;
--每个部门的工资总额
saltotal NUMBER;
BEGIN
OPEN cdept; --打开部门游标
LOOP
--取出一个部门
FETCH cdept INTO pdeptno;
EXIT WHEN cdept%NOTFOUND;
--初始化的工作
count1 := 0;
count2 := 0;
count3 := 0;
--得到部门的工资总额
SELECT SUM(sal) INTO saltotal FROM emp WHERE deptno = pdeptno;
--取部门中员工的薪水
OPEN cemp(pdeptno); --打开员工游标
LOOP
FETCH cemp INTO psal;
EXIT WHEN cemp%NOTFOUND;
IF psal < 3000 THEN count1 := count1 + 1;
ELSIF psal >= 3000 AND psal < 6000 THEN count2 := count2 + 1;
ELSE count3 := count3 + 1;
END IF;
END LOOP;
CLOSE cemp; --关闭员工游标
INSERT INTO msg VALUES (pdeptno, count1, count2, count3, nvl(saltotal,'0'));
END LOOP;
CLOSE cdept; --关闭部门游标
--COMMIT;
dbms_output.put_line('统计完成');
END;
/
--程序第二种实现方式,算数累加
DECLARE
CURSOR cdept IS SELECT deptno FROM dept; --定义游标,取出部门
pdeptno dept.deptno%TYPE; --定义部门变量
CURSOR cemp(dno NUMBER) IS SELECT sal FROM emp WHERE deptno = pdeptno; --部门中员工的薪水
psal emp.sal%TYPE; --员工薪水
--每个段的员工人数
count1 NUMBER;
count2 NUMBER;
count3 NUMBER;
--每个部门的工资总额
saltotal NUMBER;
BEGIN
OPEN cdept; --打开部门游标
LOOP
--取出一个部门
FETCH cdept INTO pdeptno;
EXIT WHEN cdept%NOTFOUND;
--初始化的工作
count1 := 0;
count2 := 0;
count3 := 0;
saltotal := 0;
--取部门中员工的薪水
OPEN cemp(pdeptno); --打开员工游标
LOOP
FETCH cemp INTO psal;
EXIT WHEN cemp%NOTFOUND;
saltotal := saltotal + psal;
IF psal < 3000 THEN count1 := count1 + 1;
ELSIF psal >= 3000 AND psal < 6000 THEN count2 := count2 + 1;
ELSE count3 := count3 + 1;
END IF;
END LOOP;
CLOSE cemp; --关闭员工游标
INSERT INTO msg VALUES (pdeptno, count1, count2, count3, nvl(saltotal,'0'));
END LOOP;
CLOSE cdept; --关闭部门游标
COMMIT;
dbms_output.put_line('统计完成');
END;
/
SELECT * FROM msg;
/*
案例3、用plsql语言编写一个程序。按系(系名)分段统计(成绩小于60分,60-85分,85分以上)“大学物理”课程各分数段的学生人数,及各系学生的平均成绩。
1.SQL.语句
1).得到有哪些系
select dno,dname from dep; --> 游标 -- 循环 --> 退出条件:notfound
2).得到系中,选修了“大学物理”课程学生的成绩
select grade from sc where cno = (select cno from course where cname = ???)
and sno in (select sno from student where dno = ???);
--> 带参数的光标 --> 循环 --> 退出条件:notfound
2.变量:1).初始值 2).如何得到
count1 number; count2 number; count3 number; 每个分数段的人数
avggrade number; 每个系选修了“大学物理”学生平均成绩
1.算术运算
2.select avg(grade) into avggrade from sc where cno = (select cno from course where cname=???)
and sno in (select sno from student where dno = ???);
*/
--创建一个表存储结果
CREATE TABLE msg1(
coursename VARCHAR2(20),
dnma VARCHAR2(20),
count1 NUMBER,
count2 NUMBER,
count3 NUMBER,
avggrade NUMBER
);
--程序
SET serveroutput ON;
DECLARE
--定义系的游标
CURSOR cdept IS select dno,dname from dep;
pdno dep.dno%TYPE;
pdname dep.dname%TYPE;
--定义成绩游标
CURSOR cgrade(coursename VARCHAR2, depno NUMBER)
IS select grade from sc where cno = (select cno from course where cname=coursename)
and sno in (select sno from student where dno = depno);
pgrade sc.grade%TYPE;
count1 number; count2 number; count3 number; --每个分数段的人数
avggrade NUMBER; --每个系选修了“大学物理”学生平均成绩
pcourseName VARCHAR2(20) := '大学物理'; --课程名称
BEGIN
OPEN cdept; --打开系的游标
LOOP
--取出一个系的信息
FETCH cdept INTO pdno,pdname;
EXIT WHEN cdept%NOTFOUND;
count1 := 0; count2 := 0; count3 := 0; --初始值
--系的平均成绩
select avg(grade) into avggrade from sc where cno = (select cno from course where cname=pcourseName)
and sno in (select sno from student where dno = pdno);
--取出系中,选修了大学物理的学生成绩
OPEN cgrade (pcourseName,pdno);
LOOP
--取出一个学生的成绩
FETCH cgrade INTO pgrade;
EXIT WHEN cgrade%NOTFOUND;
--判断成绩范围
IF pgrade < 60 THEN count1 := count1 + 1;
ELSIF pgrade >= 60 AND pgrade < 85 THEN count2 := COUNT2 + 1;
ELSE count3 := count3 + 1;
END IF;
END LOOP;
CLOSE cgrade;
--保存当前的结果
INSERT INTO msg1 VALUES(pcourseName,pdname,count1,count2,count3,avggrade);
END LOOP;
CLOSE cdept;
--COMMIT;
dbms_output.put_line('统计完成');
END;
/
SELECT * FROM msg1;
查看全部 -
-- 统计每年员工的入职人数 DECLARE -- 每年员工入职人数 pcount NUMBER := 0; -- 年份 pyear VARCHAR2(4); -- 员工总人数 pnum NUMBER := 0; -- 定义游标 CURSOR cemp IS SELECT to_char(hiredate,'YYYY') AS hireyear,COUNT(*) FROM emp GROUP BY to_char(hiredate,'YYYY'); BEGIN -- 打开游标 OPEN cemp; --遍历 LOOP FETCH cemp INTO pyear,pcount; -- 循环开始立即检测数据 EXIT WHEN cemp%NOTFOUND; -- 打印每年员工入职人数 dbms_output.put_line(pyear || ' -> ' || pcount); -- 统计总人数 pnum := pnum + pcount; END LOOP; dbms_output.put_line('员工总人数:' || pnum); -- 关闭游标 CLOSE cemp; END; /查看全部
-
process monitor是一个oracle自动释放资源的机制查看全部
-
set serveroutput on;
declare
cursor c1 is select dno,dname from dep;
pdno dep.dno%TYPE;
pdname dep.dname%type;
cursor c2(aa varchar2,bb number) is select grade from sc where cno=(select cno from course where cname=aa)
and sno in (select sno from student where dno=bb);
pgrade sc.grade%type;
count1 number;count2 number;count3 number;avgg number;
coursename varchar2(100):='大学物理';
begin
open c1;
loop
fetch c1 into pdno,pdname;
exit when c1%notfound;
count1 :=0;count2 :=0;count3 :=0;
select avg(grade) into avgg from sc where cno=(select cno from course where cname=coursename)
and sno in (select sno from student where dno=pdno);
open c2(coursename,pdno);
loop
fetch c2 into pgrade;
exit when c2%notfound;
if pgrade <60 then count1:=count1+1;
elsif pgrade >60 and pgrade <=80 then count2:=count2+1;
else count3:=count3+1;
end if;
end loop;
close c2;
insert into msg values (coursename,pdname,count1,count2,count3,avgg);
end loop;
close c1;
dbms_output.put_line('统计完成');
end;
/
查看全部 -
对于oracle,默认的事务隔离级别是read committed,因此对数据进行更改后,需要在末尾加上commit才能生效。 事务的ACID(原子性、一致性、隔离性、持久性)。 操作oracle数据库,效率最高的是pl/sql程序。查看全部
-
事物的ACID: 1.A:原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2.C:一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 3.I:隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 4.D:持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。查看全部
-
光标(游标):就是一个结果集 CURSOR 光标名[(参数名 数据类型[,参数名 数据类型]...)] IS SELECT 语句; 例如 cursor c1 is select ename from emp; 1.打开光标: open c1;打开光标执行查询 2.关闭光标: close c1;关闭游标释放资源 3.取一行光标的值: fetch c1 into pename;取一行到变量中 fetch的作用:1)把当前指针指向的记录返回 2)将指针指向下一条记录查看全部
举报