为了账号安全,请及时绑定邮箱和手机立即绑定

Oracle数据库开发必备利器之PL/SQL基础

难度初级
时长 3小时22分
学习人数
综合评分9.57
114人评价 查看评价
9.8 内容实用
9.4 简洁易懂
9.5 逻辑清晰
  • 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
    查看全部
    4 采集 收起 来源:SQL Developer安装

    2015-04-14

  • 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自动释放资源的机制
    查看全部
    2 采集 收起 来源:自定义例外

    2015-06-13

  • 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)将指针指向下一条记录
    查看全部
首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
亲,要学习本门课程只需要熟练使用Oracle的SQL语句就可以了,可以参考慕课网的课程《Oracle数据库开发必备利器之SQL基础》呦!
老师告诉你能学到什么?
1、能够熟练掌握PL/SQL的基本语法 2、能够熟练使用光标和例外 3、能够熟练使用PL/SQL进行开发

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!