oracle存储过程的使用

一. 使用for循环游标:遍历全部职位为经理的雇员

1. 定义游标(游标就是一个小集合)

2. 定义游标变量

3. 使用for循环游标

declare
  -- 定义游标c_job
  cursor c_job is
    select empno, ename, job, sal from emp where job = ‘MANAGER‘;

  -- 定义游标变量c_row
  c_row c_job%rowtype;
begin
  -- 循环游标,用游标变量c_row存循环出的值
  for c_row in c_job loop
    dbms_output.put_line(c_row.empno || ‘-‘ || c_row.ename || ‘-‘ ||
                         c_row.job || ‘-‘ || c_row.sal);
  end loop;
end;

二. fetch游标:遍历全部职位为经理的雇员

使用的时候必须明白的打开和关闭

declare
  --定义游标c_job
  cursor c_job is
    select empno, ename, job, sal from emp where job = ‘MANAGER‘;

  --定义游标变量c_row
  c_row c_job%rowtype;
begin
  open c_job;
  loop
    --提取一行数据到c_row
    fetch c_job into c_row;

    --判读是否提取到值。没取到值就退出
    exit when c_job%notfound;
    dbms_output.put_line(c_row.empno || ‘-‘ || c_row.ename || ‘-‘ ||
                         c_row.job || ‘-‘ || c_row.sal);
  end loop;

  --关闭游标
  close c_job;
end;

三. 使用游标和while循环:遍历全部部门的地理位置

--3,使用游标和while循环来显示全部部门的的地理位置(用%found属性)
declare
  --声明游标
  cursor csr_TestWhile is select loc from dept;

  --指定行指针
  row_loc csr_TestWhile%rowtype;
begin
  open csr_TestWhile;
  --给第一行数据
  fetch csr_TestWhile into row_loc;

  --測试是否有数据,并运行循环
  while csr_TestWhile%found loop
    dbms_output.put_line(‘部门地点:‘ || row_loc.LOC);
    --给下一行数据
    fetch csr_TestWhile into row_loc;
  end loop;
  close csr_TestWhile;
end;

四. 带參的游标:接受用户输入的部门编号

declare
  -- 带參的游标
  cursor c_dept(p_deptNo number) is
    select * from emp where emp.deptno = p_deptNo;

  r_emp emp%rowtype;
begin
  for r_emp in c_dept(20) loop
    dbms_output.put_line(‘员工号:‘ || r_emp.EMPNO || ‘员工名:‘
                         || r_emp.ENAME || ‘工资:‘ || r_emp.SAL);
  end loop;
end;

五. 加锁的游标:对全部的salesman添加佣金500

declare
  --查询数据,加锁(for update of)
  cursor csr_addComm(p_job nvarchar2) is
    select * from emp where job = p_job for update of comm;
  r_addComm emp%rowtype;
  commInfo  emp.comm%type;
begin
  for r_addComm in csr_addComm(‘SALESMAN‘) loop
    commInfo := r_addComm.comm + 500;

    --更新数据(where current of)
    update emp set comm = commInfo where current of csr_addComm;
  end loop;
end;

六. 使用计数器:找出两个工作时间最长的员工

declare
  cursor crs_testComput is
    select * from emp order by hiredate asc;

  --计数器
  top_two      number := 2;
  r_testComput crs_testComput%rowtype;
begin
  open crs_testComput;
  fetch crs_testComput into r_testComput;
  while top_two > 0 loop
    dbms_output.put_line(‘员工姓名:‘ || r_testComput.ename ||
                         ‘ 工作时间:‘ || r_testComput.hiredate);
    --计速器减1
    top_two := top_two - 1;
    fetch crs_testComput into r_testComput;
  end loop;
  close crs_testComput;
end;

七. if/else推断:对全部员工按基本薪水的20%加薪。假设添加的薪水大于300就取消加薪

declare
  cursor crs_upadateSal is
    select * from emp for update of sal;
  r_updateSal crs_upadateSal%rowtype;
  salAdd      emp.sal%type;
  salInfo     emp.sal%type;
begin
  for r_updateSal in crs_upadateSal loop
    salAdd := r_updateSal.sal * 0.2;
    if salAdd > 300 then
      salInfo := r_updateSal.sal;
      dbms_output.put_line(r_updateSal.ename || ‘:  加薪失败。‘ ||
                           ‘薪水维持在:‘ || r_updateSal.sal);
    else
      salInfo := r_updateSal.sal + salAdd;
      dbms_output.put_line(r_updateSal.ENAME || ‘:  加薪成功.‘ ||
                           ‘薪水变为:‘ || salInfo);
    end if;
    update emp set sal = salInfo where current of crs_upadateSal;
  end loop;
end;

八. 使用case
when:按部门进行加薪

declare
  cursor crs_caseTest is
    select * from emp for update of sal;

  r_caseTest crs_caseTest%rowtype;
  salInfo    emp.sal%type;
begin
  for r_caseTest in crs_caseTest loop
    case
      when r_caseTest.deptno = 10 THEN
        salInfo := r_caseTest.sal * 1.05;
      when r_caseTest.deptno = 20 THEN
        salInfo := r_caseTest.sal * 1.1;
      when r_caseTest.deptno = 30 THEN
        salInfo := r_caseTest.sal * 1.15;
      when r_caseTest.deptno = 40 THEN
        salInfo := r_caseTest.sal * 1.2;
    end case;
    update emp set sal = salInfo where current of crs_caseTest;
  end loop;
end;

九. 异常处理:数据回滚

set serveroutput on;
declare
  d_name varchar2(20);
begin
  d_name := ‘developer‘;

  savepoint A;
  insert into DEPT values (50, d_name, ‘beijing‘);
  savepoint B;
  insert into DEPT values (40, d_name, ‘shanghai‘);
  savepoint C;

  exception when others then
    dbms_output.put_line(‘error happens‘);
	  rollback to A;
  commit;
end;
/

十. 基本指令:

set serveroutput on size 1000000 format wrapped; --使DBMS_OUTPUT有效,并设置成最大buffer,防止"吃掉"最前面的空格
set linesize 256; --设置一行能够容纳的字符数
set pagesize 50; --设置一页有多少行数
set arraysize 5000; --设置来回数据显示量,这个值会影响autotrace时一致性读等数据
set newpage none; --页和页之间不设不论什么间隔
set long 5000; --LONG或CLOB显示的长度
set trimspool on; --将SPOOL输出中每行后面多余的空格去掉
set timing on; --设置查询耗时
col plan_plus_exp format a120; --autotrace后explain plan output的格式
set termout off; --在屏幕上暂不显示输出的内容,为以下的设置sql做准备
alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘; --设置时间格式

小知识:

以下的语句一定要在Command Window里面才干打印出内容

set serveroutput on;
begin
dbms_output.put_line(‘hello!‘);
end;
/
时间: 2024-10-13 23:23:37

oracle存储过程的使用的相关文章

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

java怎样将一组对象传入Oracle存储过程

java怎样将一组对象传入Oracle存储过程.须要注意的是jar包是有要求的,假设使用不当会导致仅仅有数字能传过去,字符串传只是去.假设是Oracle11g则须要选用例如以下的jar包,F:\app\Administrator\product\11.2.0\dbhome_1\jlib\orai18n.jar. D:\program\weblogic\oracle_common\modules\oracle.jdbc_11.2.0\ojdbc6.jar 样例例如以下: CREATE OR REP

springMVC + oracle存储过程 构建高性能灵活易维护的java web架构

MVC让简单的业务也变得复杂 不知道你在使用MVC模式开发项目的时候是否觉得很麻烦,一个简单的增删改查动作却要涉及到多个文件操作. 以一条数据增加为例说明. 假设我们使用hibernate并且dao层是已经封装好的 从图中可以看出如果我们在系统中写一个增加功能需要自己动手写的地方至少是 jsp , action , service,servicesImpl 四层. 如果是复杂的添加操作那么我们很可能还会自己定义dao层的接口和方法,那样就是6层操作了. 如果使用mybatis 至少也是写4层,常

Oracle 存储过程

存储过程:就是一组用于完成特定数据库功能的SQL 语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作. Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. 1 create or replace procedure 过程名 2 as ...; --声明语句段 3 begin 4 ...; --执行语句段 5 exception --异常处理语句段 6 ...

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

jdbc调用 oracle 存储过程操作

创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,[返回多个值,演示out的用法]当返回2个或多个值,必须使用out符号当返回1个值,就无需out符号 create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return numberas psal emp.sal%type;begin select ename,sal into pename,

Oracle ——存储过程

1.带参数的存储过程CREATE OR REPLACE PROCEDURE sp_pro2 (spname VARCHAR2, newsal NUMBER) ISBEGIN     UPDATE emp SET sal = newsal WHERE ename=spname;END; --参数VARCHAR2不需要指定大小exec sp_pro2('SMITH',10);或者call sp_pro2('SMITH',10); Oracle --存储过程,布布扣,bubuko.com

面试概率极大的Oracle存储过程

1.什么是存储过程.存储过程是数据库服务器端的一段程序,它有两种类型.一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户.另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作.有的服务器允许同一个存储过程既可以返回数据又可以执行动作.2.什么时候需要用存储过程 如果服务器定义了存储过程,应当根据需要决定是否要用存储过程.存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的.在服务器上执行存储过程,可以改善应用程序的性能.这

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

Oracle存储过程的编写经验与优化措施

1.开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用"databsevv.dbo.table_name",因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验. 2.开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查. 3.高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a) SQL的使用规范: i. 尽量避免大事务操作,慎用ho