--1、编写一个程序块从emp表中显示为'SMITH'的雇员的薪水和职位
declare 
v_job emp.job%type;
v_sal emp.sal%type;
begin
select job,sal into v_job,v_sal from emp where ename='SMITH';
dbms_output.put_line('SMITHD的职位是:'||v_job||'薪金:'||v_sal);
end;
--2、编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在地
declare
v_dname dept.dname%type;
v_location dept.loc%type;
begin
select dname,loc into v_dname,v_location from dept
where deptno=&dnamber;
dbms_output.put_line('部门名称:'||v_dname||'部门地址:'||v_location);
end;
--3、编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪金(即:薪水+佣金)
declare
v_empno emp.empno%type;
v_sumsal emp.sal%type;
begin
select 12*(sal + nvl(comm,0)) into v_sumsal from emp where empno=&v_empno;
dbms_output.put_line('该员工的总的薪金:'||v_sumsal);
end;
select * from emp;
--4、编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(薪水+佣金)
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=&雇员号;
dbms_output.put_line(v_emp.sal+nvl(v_emp.comm,0));
end;
--5、 5.某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:
             -- Designation    Raise
              -----------------------
             -- Clerk          500
              --Salesman       1000
              --Analyst        1500
              --Otherwise      2000
--编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理。
declare 
    v_emp emp%rowtype;
 begin
      select * into v_emp from emp where ename='&name';
      if v_emp.job='CLERK' then
         update emp set sal=sal+500 where empno=v_emp.empno;
      elsif v_emp.job='SALESMAN' then
         update emp set sal=sal+1000 where empno=v_emp.empno; 
      elsif v_emp.job='ANALYST' then
         update emp set sal=sal+1500 where empno=v_emp.empno; 
      else  
         update emp set sal=sal+2000 where empno=v_emp.empno;  
      end if;
      commit;
end;
--6、编写一个程序块,将emp表中雇员名全部显示出来

--解法一
declare
cursor emp_cursor is select ename from emp;
v_ename emp.ename%type;
begin
open emp_cursor;
loop
  fetch emp_cursor into v_ename;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename);
end loop;
close emp_cursor;
end;
--解法二
declare
cursor emp_cursor is select ename from emp;--得到多个cursor
begin
for v_name in emp_cursor
loop
dbms_output.put_line(v_name.ename);--遍历多个cursor
end loop;
end;

--7、编写一个程序块,将emp表中前5人中名字显示出来
--解法一
declare
cursor emp_cursor is select ename from emp where rownum<6;
begin
for v_name in emp_cursor
loop
dbms_output.put_line(v_name.ename);
end loop;
end;
--解法二
declare
   cursor v_cursor is select * from emp;
   v_count number :=1;
   begin
    for v_emp in v_cursor
       loop
        dbms_output.put_line(v_emp.ename);
        v_count := v_count+1;
        exit when v_count>5;
       end loop;   
   end;
----------------------------------异常处理

--8、编写一个程序块,接受一个雇员名,从emp表中显示该雇员的工作岗位和薪水,若输入的雇员名不存在
--显示'该雇员不存在'信息
declare 
   v_emp emp%rowtype;
   my_exception Exception;
 begin
   
   select * into v_emp from emp where ename='&name';
   raise my_exception;
   
   exception
         when no_data_found then
              dbms_output.put_line('该雇员不存在!');
         when others then
          dbms_output.put_line(v_emp.job||'---'||v_emp.sal);
 end;

--9、接受两个数相除并且显示结果,如果第二个数为0,则显示消息“除数不能为0”。
declare
  v_dividend float;
  v_divisor float;
  v_result float;
  my_exception Exception;
  begin
        v_dividend:=&被除数;
        v_divisor:=&除数;
        v_result:=v_dividend/v_divisor;
        raise my_exception;
        exception
      when my_exception then
        dbms_output.put_line(v_result);
      when others then
        dbms_output.put_line('除数不能为0');
  end;

--二.声明和使用游标
-- 使用游标属性 
-- 使用游标For循环工作
-- 声明带参数的游标
--(使用FOR UPDATE OF和CURRENT OF子句工作)

--1、通过使用游标来实现dept表中的部门名称
declare
cursor dept_cursor is select dname from dept;
begin
for one_dept_cursor in dept_cursor
loop
dbms_output.put_line(one_dept_cursor.dname);
end loop;
end;

select dname from dept;

--2、使用for循环,接受一个部门号,从emp表中显示该部门的所有雇员的姓名,工作和薪水
declare
cursor emp_cursor is select ename,job,sal from emp where deptno=&dno;
begin
for one_emp_cursor in emp_cursor
loop 
dbms_output.put_line(one_emp_cursor.ename||one_emp_cursor.job||one_emp_cursor.sal);
end loop;
end;

--3、使用带参数的游标(实现第2题)
declare
cursor emp_cursor(dno number) is select ename,job,sal from emp where deptno=dno;
v_deptno number(10);

begin
v_deptno:= &部门号;
for one_emp_cursor in emp_cursor(v_deptno)
loop
dbms_output.put_line(one_emp_cursor.ename||one_emp_cursor.job||one_emp_cursor.sal);
end loop;
end; 
--4、编写一个pl/sql程序块,从emp表中名字以'A'或'S'开始的所有库员按他们基本薪水的 10%100给他们加薪
declare
cursor emp_cursor is select * from emp where ename like 'A%' or ename like 'S%';
begin
   for one_cursor in emp_cursor
loop
update emp set sal=sal*1.1 where ename=one_cursor.ename;
-- dbms_output.put_line(one_cursor.ename);
end loop;
end;

select * from emp where ename like 'A%' or ename like 'S%';
select * from emp;

--5、emp表中对所有雇员按他们基本薪水的10%给他们加薪,如果增加后的薪水大于5000,则取消加薪

declare
cursor emp_cursor is select * from emp;
begin
    for one_emp in emp_cursor
loop
if one_emp.sal*1.1<5000
then update emp set sal=sal*1.1 where empno=one_emp.empno;
end if;
end loop;
end;

select * from emp where sal*1.1<5000;

--三,创建PL/SQL记录和PL/SQL表
--   创建过程
--   创建函数

--3、创建一个过程,能像dept表中添加一个新纪录(in参数)
create or replace procedure insert_dept(dept_no in number,dept_name in varchar2,dept_loc in varchar2)
is
begin
insert into dept values(dept_no,dept_name,dept_loc);
end;
--调用存储过程:
declare
begin
insert_dept(50,'人事部','南京');
end;
select * from emp;
select * from dept;
--4、创建一个过程,从emp表中带入雇员的姓名,返回该雇员的薪水值(out参数),然后调用过程
create or replace procedure
 find_emp3(emp_name in varchar2,emp_sal out number)
 is
     v_sal number(5);
 begin
      select sal into v_sal from emp where ename = emp_name;
      emp_sal:=v_sal;
 end;
 
declare
mysal number;
begin
  find_emp3('SMITH',mysal);
dbms_output.put_line(mysal);
end;
--5、编写一个程序块,接受一个雇员号与一个百分数,从emp表中将该雇员的薪水增加输入的百分比。

create or replace procedure
   update_sal(emp_no in number,parsent in float)
 is
   begin
     update emp set sal=sal+sal*parsent where empno=emp_no;
   end;

begin
  update_sal(7937,0.5);
 end;

select * from emp;

--7、创建一个函数,他以部门号作为参数传递并且使用函数显示那个部门名称与位置,然后调用此函数

create or replace function
  find_dept(dept_no number)
  return dept%rowtype
  is
   v_dept dept%rowtype;
   begin
    select * into v_dept from dept where deptno=dept_no;
    return v_dept;
  end;

--调用
declare
  v_dept dept%rowtype;
  begin
         v_dept:=find_dept(50);
         dbms_output.put_line(v_dept.dname||'---'||v_dept.loc);
 end;

--四,创建程序包
   -- 创建程序件
   -- 创建触发器
 
 
--6、创建一个语句级别触发器,不允许用户在"Sundays"使用emp表
create or replace trigger control_emp
before update or delete or insert on emp

begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN') in ('SUM') 
then raise_application_error(-20001,'不允许在星期天操作emp表');
end if;
end;

select to_char(sysdate,'day','nls_date_language=AMERICAN') from dual;--英文星期
select to_char(sysdate,'day') from dual;--中文星期
select to_char(sysdate,'hh24:mi') from dual;
 if to_char(sysdate,'day') in ('星期六','星期日') or 
 to_char(sysdate,'hh24:mi') not between '08:30' and '18:00'

--5.创建一个行级别触发器,停止用户删除雇员名为"SMITH"的记录。
   create or replace trigger delete_smith
     before delete on emp 
     for each row
     when (old.ename='SMITH')
     begin
     raise_application_error(-20001,'不能删除该条信息!');
     end;
 
 --4.创建一个行级别触发器,将从emp表中删除的记录输入到ret_emp表中。
create or replace trigger delete_emp
      after delete on emp 
     for each row
      begin
       insert into ret_emp values(:old.empno,:old.ename,:old.job,
         :old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
       end;

--1.创建在dept表中插入和删除一个记录的数据包,它且有一个函数(返回插入或删除的部门名称)和两个过程。
然后调用包。
create or replace package pack_1
 is
  procedure find_emp(emp_no in number,emp_name out varchar2);
  procedure find_emp1(emp_name in varchar2,emp_no out number);
  function find_dname(dept_no number)
  return varchar2;
  end pack_1;
    
create or replace package body pack_1
is
 function find_dname(dept_no number)
 return varchar2
is 
 v_dname varchar2(20);
 begin 
  select dname into v_dname from dept where deptno=dept_no;
  retrun v_dname;
  end;
end pack_1;

--调用包:
declare
  v_dname varchar2(20);
  begin
   v_dname:=pack_1.find_dname(50);
   dbms_output.put_line(v_dname);
   end;

oracle数据库block、tigger、function、package相关推荐

  1. java连接数据库 oracle,Oracle数据库之一分钟教你学会用java连接Oracle数据库

    本文主要向大家介绍了Oracle数据库之一分钟教你学会用java连接Oracle数据库,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. package java_jdbc; // ...

  2. oracle数据库的拼接字符串,Oracle数据库拼接字符串

    Ora-03113\Ora-03114与Oracle In 拼接字符串的问题 刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将 ...

  3. 导出Oracle数据库用户Procedure和Function为文本文件的小工具

    Oracle的Procedure和Function导出方法有很多,通过exp的User Mode或者Full Mode可以整体导出,当然也有较傻的PL/SQL或Toad一个个导出的方法,其实Oracl ...

  4. 关于Oracle数据库19c中的关键字和保留字的说明

    关于Oracle数据库中的关键字和保留字的说明 官方文档节选: ​ You cannot use Oracle SQL reserved words as nonquoted identifiers. ...

  5. Oracle corrupt block(坏块) 详解

    转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...

  6. Pre-Upgrade Utility---下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1)

    如何下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1) 文档内容 目标 脚本来源 解决方案 脚本指导 下载并安装说明 请参阅下表以确定您需要的pre-upgrade脚本的版 ...

  7. oracle数据库系统ppt,oracle数据库入门(培训课件).ppt

    ORACLE数据库介绍- 常用工具-SQL LOADER 在DOS窗口下使用SQL*Loader命令实现数据的输入 C:\>sqlldr userid=system/manager contro ...

  8. Oracle数据库中的数据加密

    Oracle数据库中的数据加密 / Oracle数据库DES加密 有个需求,需要对某些敏感信息字段进行脱敏,要求在数据库中不能显示明文.如果目的侧重保护数据而非脱敏的话,可以考虑用表空间透明数据加密( ...

  9. Oracle数据库错误消息

    导出错误消息 l EXP-00000导出终止失败 原因:导出时产生Oracle错误. 操作:检查相应的Oracle错误消息. l EXP-00001数据域被截断 - 列长度=数字,缓冲区大小=数字,实 ...

最新文章

  1. device.cpp
  2. net.sf包JSONArray与JSONObject遍历
  3. 给自己的Unity添加声音文件
  4. Kafka生产者发送消息的三种方式
  5. phpstudy如何安装景安ssl证书 window下apache服务器网站https访问
  6. C++ 一键关闭屏幕
  7. python如何运行源文件_Python如何运行
  8. 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(一)
  9. CentOS Linux 7绑定静态IP方法
  10. In addition, Microsoft is also developing
  11. tcp丢包率_网络编程 | TCP/IP基础知识
  12. 机械电子工程用不用学c语言,机械电子工程到底学什么 毕业以后能干什么
  13. surfacepro3运行C语言,【微软 Surface PRO3使用总结】C面|D面|噪音|材质_摘要频道_什么值得买...
  14. 消融实验(Ablation study)的最佳解释
  15. ../和./和/的区别
  16. 你学了多久 Python 并能正式工作?
  17. 16个时髦的扁平化设计的 HTML5 CSS3 网站模板
  18. 【Java虚拟机】第一章、Java虚拟机是如何产生的
  19. 计算机网络 IP地址基础知识
  20. Linux能ping通IP,ping不通域名

热门文章

  1. Robert Sedgewick左倾红黑树论文翻译
  2. 计算机打开页面恢复默认大小,win10怎样恢复Windows窗口默认的大小?
  3. 于晓津外头游荡了半天
  4. bucket list java,Java AmazonS3.deleteBucket方法代码示例
  5. ios点击大头针气泡不弹出_高德 ios 自定义气泡添加点击事件无效问题
  6. 微信、支付宝付款码规则
  7. floorplan 和 place的区别
  8. 【mac/windows】Microsoft Office LTSC 2021
  9. zabbix监控系统进阶专题篇(企业微信报警,邮箱报警,电话报警,监控数据库,监控磁盘性能)
  10. 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(一)创建项目和画界面