sql修仙吧 关注:4贴子:81
  • 4回复贴,共1

救赎计划 2017/12/7

取消只看楼主收藏回复

全代码集成
1, 拷贝SCOTT用户的部门表dept和员工表emp到新用户,并添加相应约束。
1) 使用scott用户登录,并授予新用户对象权限,即新用户对dept表和emp表的查看权限
grant select on emp to Avv;
grant update on emp to Avv;
grant delete on emp to Avv;
grant select on dept to Avv;
grant update on dept to Avv;
grant delete on dept to Avv;
2) 使用新用户登录,执行语句:createtable dept as select * from scott.dept;
用同样方法创建emp表。
create table emp as select * from scott.emp;
create table dept as select * from scott.dept;
3)分别给dept和emp表添加主键约束:约束名称分别是:pk_dept和pk_emp,主键分别是deptno和empno。
alter table emp
add constraint PK_emp primary key(empno);
alter table dept
add constraint PK_dept primary key(deptno);
4) 给emp表的部门号(deptno)添加外键约束:约束名称是fk_dept_emp,来自dept的部门号(deptno)
alter table emp
add constraint FK_dept_emp foreign key(deptno)referencesdept(deptno);
5)给表emp 添加检查约束,使工资sal>0,约束名称ck_emp
alter table emp addconstraint ck_emp check(sal>0);


IP属地:广东1楼2017-12-07 10:04回复
    匿名块
    1)编写程序访问emp表,接收用户输入的部门号,并根据部门号显示该部门的员工数量。
    set serveroutput on
    declare
    v_deptno emp.deptno%type;
    total number;
    begin
    v_deptno:=&deptno;
    select count(deptno) into total from emp wheredeptno = v_deptno;
    dbms_output.put_line(v_deptno||'部门总人数是: '||total);
    end;
    2)编写程序访问emp表,接收用户输入的员工号,根据工种给员工增加佣金, 'CLERK'加佣金50元,'SALESMAN'加佣 金60元,'ANALYST’加佣金150,其他加佣金20,显示该员工号和增加的佣金。
    set serveroutput on
    declare
    v_empno emp.empno%type;
    v_addcomm emp.comm%type;
    v_job emp.job%type;
    begin
    v_empno:=&empno;
    select empno,job into v_empno,v_job from empwhere empno=v_empno;
    if v_job='CLERK' then v_addcomm:=50;
    elsif v_job='SALESMAN' then v_addcomm:=60;
    elsif v_job='ANALYST' then v_addcomm:=150;
    else v_addcomm:=20;
    end if;
    dbms_output.put_line(v_empno||'增加的佣金为:'||v_addcomm);
    end;
    3)编写程序访问emp表,计算4到6月入职的员工数,并显示输出。
    Declare
    total number;
    begin
    select count(*) into total from emp whereto_char(hiredate,'MM') between '04' and '06';
    dbms_output.put_line('4到6月的入职员工数:'||total);
    end;
    4)编写程序,用以提示用户输入姓名。此代码应检查用户输入的姓名长度,如果长度小于4,则引发异常并显示消息“请输入正确的姓名”,否则显示“欢迎”。
    setserveroutput on
    declare
    usernamevarchar2(20);
    e1exception;
    begin
    username:='&name';
    iflength(username)<4 then raise e1;
    elsedbms_output.put_line('欢迎');
    end if;
    exception
    when e1then dbms_output.put_line('请输入正确的姓名');
    end;
    5) 编写程序,输入一个数,判断该数是否是素数。
    declare
    prime number;
    begin
    prime:= &pri;
    if prime=0 then dbms_output.put_line('不是');
    elsif prime=1 then dbms_output.put_line('不是');
    elsif prime=2 then dbms_output.put_line('是');
    elsif prime mod 2 = 1 thendbms_output.put_line('是');
    else
    dbms_output.put_line('不是');
    end if;
    end;
    6)编写程序,根据输入的员工编号,使用变量存储emp表某员工的ename和job列数据,然后输出,程序要求有错误处理。
    declare
    v_empnoEMP.EMPNO%type;
    v_empnameEMP.ENAME%type;
    v_empjobEMP.JOB%type;
    begin
    v_empno:=&empno;
    selectempno,ename,job into v_empno,v_empname,v_empjob from emp where empno=v_empno;
    dbms_output.put_line('员工号为:'||v_empno||'的姓名和工作分别是:'||v_empname||','||v_empjob);
    exception
    whenno_data_found then DBMS_OUTPUT.PUT_LINE('查无此部门');
    end;
    7)编写并执行pl/sql块,使用%rowtype变量存储部门表的一行数据,然后使用dbms_output.put_line 输出,程序要求有错误处理。
    declare
    dept_adept%rowtype;
    begin
    select *into dept_a from dept where deptno=10;
    dbms_output.put_line('部门号为:'||dept_a.deptno||'部门名是:'||dept_a.dname||'部门地址'||dept_a.loc);
    exception
    whenno_data_found then DBMS_OUTPUT.PUT_LINE('查无此部门');
    end;
    8)编写一程序块,计算1到n(<10)的阶乘(n从键盘交互输入)。
    declare
    jc number:=1;
    n number;
    begin
    n:=&n;
    for i in 1..n
    loop
    jc:=jc*i;
    end loop;
    dbms_output.put_line('1到'||n||'的阶乘是'|| jc);
    end;
    9)编写程序,输入员工号,程序要求有错误处理
    1,计算该员工的工资和佣金的总和,并输出。
    declare
    a number;
    b number;
    cvarchar2(20);
    begin
    a:=&a;
    selectsum(sal+ nvl(comm,0)) into b from emp where empno=a;
    dbms_output.put_line(a||'工资和佣金总和是:'||b);
    end;
    2,计算员工所在部门名称,输出。
    declare
    v_empnoemp.empno%type;
    v_deptnodept.deptno%type;
    v_dnamedept.dname%type;
    begin
    v_empno:=&empno;
    selecte.empno,d.deptno,d.dname into v_empno,v_deptno,v_dname from dept d,emp e wheree.DEPTNO = d.DEPTNO and e.empno=v_empno;
    dbms_output.put_line(v_empno||'编号所在的部门编号为'||v_deptno||',部门名称为'||v_dname);
    end;
    10)编写一程序,输出100以内能被3整除的数,每行10个数,输出。
    setserveroutput on
    declare
    numnumber;
    begin
    num:=1;
    loop
    if num mod3 = 0 then dbms_output.put(num||' ');
    if num mod10 = 0 then dbms_output.put_line('');
    end if;
    end if;
    num:=num+1;
    exit whennum>100;
    end loop;
    dbms_output.put_line('');
    end;


    IP属地:广东2楼2017-12-07 10:05
    回复
      2026-03-06 21:19:37
      广告
      不感兴趣
      开通SVIP免广告
      游标(匿名块)
      1)使用显式游标检索出版物titles表按出版日期降序排列的所有数据,包括:出版物名称、作者、价格和出版日期。
      declare
      cursor seltit is select *from titles order by pubdate desc;
      begin
      for tit in seltit loop
      dbms_output.put_line(tit.titlename||''||tit.author||' '||tit.price||' '||tit.pubdate);
      end loop;
      end;
      2) 使用显式游标检索emp表的某部门数据,包括员工号、员工名、入职日期和工资,并按工资降序排列,部门号为参数。
      declare
      cursor seld(dno number) is
      select * from emp wheredeptno=dno order by sal;
      dno number;
      begin
      dno:=&n;
      for cemp in seld(dno) loop
      dbms_output.put_line('员工号:'||cemp.empno||'员工名:'||cemp.ename||'入职日期:'||cemp.hiredate||'工资:'||cemp.sal);
      end loop;
      end;
      3)使用游标for循环检索出版社表(publishers)全部数据,并输出数据包括出版社代码、出版社名称和地址。
      declare
      cursor pp is select * frompublishers;
      begin
      for pub in pp loop
      dbms_output.put_line('出版社代码:'||pub.pubcode||'出版社名称:'||pub.pubname||'地址:'||pub.address);
      end loop;
      end;
      4)使用显式游标输出部门表的数据,以部门号降序排列。
      declare
      cursor cdept is select deptno,dname,loc from deptorder by deptno desc;
      begin
      for cd in cdept loop
      dbms_output.put_line('部门号:'||cd.deptno||'部门名称:'||cd.dname||'地址:'||cd.loc);
      end loop;
      end;
      4)使用隐式游标向dept插入一条记录,如果成功插入一条记录,提交,并输出”输入成功!”,
      否则回滚,显示“输入失败!”。
      begin
      insert intodept(deptno,dname,loc)values(99,'aaa','ads');
      if sql%found = true then
      dbms_output.put_line('输入成功');
      commit;
      else
      dbms_output.put_line('输入失败');
      rollback;
      end if;
      end;


      IP属地:广东3楼2017-12-07 10:05
      回复
        存储过程(带名块)
        1)创建带in参数的存储过程pro_emp1,要求根据用户输入的员工号,返回员工的姓名、入职日期和佣金并输出,编写匿名块调用此过程。(使用emp表为数据源,后续根据情况自己判断)
        create or replace procedure pro_emp1(ep number)
        as
        en emp.ename%type;
        eh emp.hiredate%type;
        ec emp.comm%type;
        begin
        select ename,hiredate,nvl(comm,0) into en,eh,ecfrom emp where empno=ep;
        dbms_output.put_line('姓名:'||en||' 入职日期:'||eh||' 佣金:'||ec);
        end;
        declare
        eno number;
        begin
        eno:=&n;
        pro_emp1(eno);
        end;
        2)创建带in参数的存储过程pro_emp2访问emp表,根据输入的员工号,求该员工所在的部门名称和部门位置并输出,编写匿名块调用该存储过程。
        create or replace procedure pro_emp2(ep number)
        as
        dn dept.dname%type;
        dl dept.loc%type;
        begin
        select d.dname,d.loc into dn,dl from emp e,dept dwhere empno=ep and e.deptno=d.deptno;
        dbms_output.put_line('部门名称:'||dn||'部门位置:'||dl);
        end;
        declare
        eno number;
        begin
        eno:=&n;
        pro_emp2(eno);
        end;
        3)创建带out参数的存储过程pro_emp3访问emp表,根据输入的员工工种,求出从事该工作的员工人数并输出,编写匿名块调用此过程。
        create or replace procedure pro_emp3(ejemp.job%type,ec out number)
        as
        begin
        select count(*) into ec from emp wherejob=upper(ej);
        dbms_output.put_line(upper(ej)||'人数:'||ec);
        end;
        declare
        jobs emp.job%type;
        jsum number;
        begin
        jobs:='&n';
        pro_emp3(jobs,jsum);
        end;
        4)创建带out参数的存储过程pro_emp4,要求根据输入的部门号,计算该部门的平均工资 并输出,编写匿名块调用此过程。
        create or replace procedurepro_emp4(dp emp.deptno%type,avge out number)
        as
        begin
        select avg(sal) into avgefrom emp where deptno=dp;
        dbms_output.put_line('部门号:'||dp||'平均工资:'||avge);
        end;
        declare
        dno number;
        avgsal number;
        begin
        dno:='&n';
        pro_emp4(dno,avgsal);
        end;
        5)创建带in out参数模式的过程,给定两个数为参数,实现两个数进行交换。
        create or replace procedurejh(a in out number,b in out number)
        as
        tp number;
        begin
        tp:=a;
        a:=b;
        b:=tp;
        dbms_output.put_line('a:'||a||'b:'||b);
        end;
        declare
        a number;
        b number;
        begin
        a:=&a;
        b:=&b;
        dbms_output.put_line('a:'||a||'b:'||b);
        jh(a,b);
        end;
        6)编写一个过程,使10号部门员工薪水上涨10%,20号部门员工薪水上涨20%,其它部门员工薪水保持不变。( 注意使用commit)
        create or replace procedure upsal
        as
        begin
        update emp set sal=sal*1.1 where deptno=10;
        dbms_output.put_line('10号部门员工薪水上涨10%');
        update emp set sal=sal*1.2 where deptno=20;
        dbms_output.put_line('20号部门员工薪水上涨20%');
        dbms_output.put_line('其它部门员工薪水保持不变');
        commit;
        end;
        begin
        upsal;
        end;
        7)创建一个函数,以员工号为参数,输出其部门内工资最高的员工姓名。
        create or replace function dmax(eno number)
        return varchar2
        is
        maxname varchar2(100);
        cursor dsmax
        is
        select * from emp where sal>=(
        select max(sal) from emp group by deptno having deptno=(
        select deptno from emp where empno=7369))
        and deptno=(select deptno from emp where empno=7369);
        --and rownum=1;
        begin
        maxname:=eno||'所在部门中,拥有着最高工资的有';
        for maxs in dsmax loop
        maxname:=maxname||maxs.ename||' ';
        end loop;
        return maxname;
        end;
        select dmax(7788) from dual;
        7.2)创建一个过程,以员工号为参数,输出其部门内工资最高的员工姓名。
        create or replace procedure dmaxa(eno number)
        is
        cursor dsmax
        is
        select * from emp where sal>=(
        select max(sal) from emp group by deptno having deptno=(
        select deptno from emp where empno=eno))
        and deptno=(select deptno from emp where empno=eno);
        begin
        for maxs in dsmax loop
        dbms_output.put_line(maxs.ename);
        end loop;
        end;
        begin
        dmaxa(7788);
        end;
        8)创建一函数,函数有两个数字类型参数,实现功能为返回该数的n次幂,调用该函数。
        create or replace function mi1(x number,n number)
        return number
        is
        px number;
        begin
        select power(x,n) into px from dual;
        return px;
        end;
        declare
        p number;
        begin
        p:=mi1(2,4);
        dbms_output.put_line(p);
        end;
        9)创建带一参数的函数,员工号为参数,计算该员工所属部门的平均工资,并调用此函数。
        createor replace function avgsals(eno number)
        returnnumber
        is
        avgsumnumber;
        begin
        selectavg(sal) into avgsum from emp
        wheredeptno=(select deptno from emp where empno=eno);
        returnavgsum;
        end;
        selectavgsals(7521) from dual;
        10) 创建一带两个参数的函数:函数返回截取的字符串长度,第一个参数为输入的字符串,第二个参数为要截取字符串的长度,函数返回被截取的子字符串,调用该函数。
        create orreplace function jq(sr varchar2,jq1 number)
        returnvarchar2
        is
        jgvarchar2(10);
        begin
        selectsubstr(sr,1,jq1) into jg from dual;
        return jg;
        end;
        select jq('123456',3)from dual;
        11) 创建带in参数的存储过程带3个参数,实现向部门表dept插入数据,判断如果插入数据成功则提交,否则回滚。
        create orreplace procedure din3(dn dept.dname%type,dp dept.deptno%type,dl dept.loc%type)
        as
        begin
        insert intodept(dname,deptno,loc)values(dn,dp,dl);
        ifsql%found=true then
        commit;
        dbms_output.put_line('成功');
        else
        rollback;
        dbms_output.put_line('失败');
        end if;
        exception
        when OTHERSthen
        rollback;
        dbms_output.put_line('失败');
        end;
        begin
        din3('dasdsa',80,'adasd');
        end;
        12)创建一个函数以圆半径为参数,实现计算圆的面积。
        create orreplace function ymj(r number)
        return number
        is
        mj number;
        begin
        mj:=acos(-1)*r*r;
        return mj;
        end;
        select ymj(10)from dual;
        13)创建存储过程,根据员工编号输出该员工所在的部门名称、所在部门的平均工资;
        create or replace procedure d_avg(eno number)
        as
        dno number;
        savg number;
        begin
        select deptno,avg(sal) into dno,savg from emp wheredeptno=(select deptno from emp where empno=eno) group by deptno;
        dbms_output.put_line(dno||'部门的平均工资为'||savg);
        end;
        begin
        d_avg(7369);
        end;
        14) 创建一个函数,根据员工编号返回该员工的工作年限。
        create or replace function getyear(eno number)
        return number
        is
        wy number;
        begin
        select round(months_between(sysdate,hiredate)) into wy
        from emp where empno=eno;
        return wy;
        end;
        select getyear(7369) from emp where empno=7369;


        IP属地:广东4楼2017-12-07 10:05
        回复
          新建用户+目前用到的所有权限给予
          create user sonic121 identified by 123456;
          grant connect,resource to sonic121;
          grant create session to sonic121;
          grant create sequence to sonic121;
          grant create any index to sonic121;
          grant create synonym to sonic121;


          IP属地:广东5楼2017-12-07 10:09
          回复