Oracle存储过程详解(五)-嵌套

1. 嵌套块

-- Created on 2016/4/22 by ADMINISTRATOR 
declare 
  p_dname varchar2(50) := '微软';
  p_deptno number := 60;
  p_deptloc varchar2(100) := '米国';
  v_state varchar2(50);--状态
begin

    --内部嵌套块
  <<查询是否存在>>
  begin
    select dname into v_state from dept where deptno = p_deptno;
    dbms_output.put_line('部门名:' || v_state) ;
  end;

  --内部嵌套块(可访问外部变量,但外部不能访问内部变量)
  <<更新部门信息>>
  declare

  BEGIN
    UPDATE DEPT SET DNAME = p_dname,LOC = p_deptloc WHERE DEPTNO = p_deptno ;
    dbms_output.put_line('更新部门信息成功') ;
  END;

  --处理异常
  EXCEPTION
    WHEN NO_DATA_FOUND  THEN
      dbms_output.put_line('未找到部门,新建...:') ;
      --内部嵌套块
      <<插入一个新部门>>
      declare
      begin
        insert into dept(deptno,dname,loc) values(p_deptno,p_dname,p_deptloc);
        dbms_output.put_line('新建部门成功') ;

        exception
          when others then
            dbms_output.put_line('此过程彻底失败') ;
      end;

  --rollback;

END;

2. 循环

declare 
   v_number1 NUMBER;
   v_number2 NUMBER;
BEGIN
  --进行外部循环
  FOR v_number1 in 1 .. 9
    LOOP
      --进行内部循环
      FOR v_number2 in 1 .. v_number1
        LOOP
          --打印九九乘法口决表
          DBMS_OUTPUT.put(v_number1 
                              || '*'
                              ||v_number2
                              ||'='
                              ||v_number1*v_number2
                              ||'   ');
         END LOOP;
         DBMS_OUTPUT.put_line('');
   END LOOP;
  DBMS_OUTPUT.put_line('=====完成=========');
END;

结果:

1*1=1   
2*1=2   2*2=4   
3*1=3   3*2=6   3*3=9   
4*1=4   4*2=8   4*3=12   4*4=16   
5*1=5   5*2=10   5*3=15   5*4=20   5*5=25   
6*1=6   6*2=12   6*3=18   6*4=24   6*5=30   6*6=36   
7*1=7   7*2=14   7*3=21   7*4=28   7*5=35   7*6=42   7*7=49   
8*1=8   8*2=16   8*3=24   8*4=32   8*5=40   8*6=48   8*7=56   8*8=64   
9*1=9   9*2=18   9*3=27   9*4=36   9*5=45   9*6=54   9*7=63   9*8=72   9*9=81   
=====完成=========

3. 动态SQL

declare 
   sqlStr varchar2(200);
   v_empno number := 7902;
BEGIN

  <<一条普通查询>>
  begin
     --定义SQL语句
     sqlStr := 'select * from emp';
     --执行上面这名SQL
     execute immediate sqlStr;
     DBMS_OUTPUT.put_line('第一条成功!');

     exception
       when others then
         null;
  end;

  <<传值和返回值的查询>>
  declare
     v_ename varchar2(50);
     v_job varchar2(50);
     v_sal number;
  begin
     --定义SQL语句
     sqlStr := 'select ename,job,sal from emp where empno = :tempId ';
     --执行上面这名SQL,并传值我取返回值
     execute immediate sqlStr
                       into v_ename,v_job,v_sal
                       USING v_empno;
     DBMS_OUTPUT.put_line('工号:'||v_empno||'名字:'||v_ename||'职位:'||v_job||'工资:'||v_sal);

     exception
       when others then
         null;
  end;


  DBMS_OUTPUT.put_line('=====完成=========');
END;

结果:

第一条成功!
工号:7902名字:FORD职位:ANALYST工资:3000
=====完成=========
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle 存储过程是一种在 Oracle 数据库中创建的可重用代码块,它可以接收输入参数并生成输出参数,还可以执行 SQL 查询和 DML 操作(如插入、更新、删除)。存储过程可以被其他程序或存储过程调用,并且可以在数据库中进行存储和管理。 以下是一些关于 Oracle 存储过程的详细说明: 1. 存储过程的语法 存储过程的语法类似于 PL/SQL 的语法。以下是一个简单的例子: CREATE OR REPLACE PROCEDURE my_proc IS BEGIN -- 存储过程的代码 END; 存储过程可以包含输入参数、输出参数和异常处理部分。例如,下面是一个包含输入和输出参数的存储过程: CREATE OR REPLACE PROCEDURE my_proc( in_param1 IN VARCHAR2, in_param2 IN NUMBER, out_param OUT VARCHAR2 ) IS BEGIN -- 存储过程的代码 out_param := in_param1 || TO_CHAR(in_param2); END; 2. 存储过程的优点 存储过程的主要优点是可重用性和性能优化。由于存储过程可以被多个程序或存储过程调用,因此可以减少代码的重复性,提高代码的可读性和可维护性。此外,存储过程可以在数据库中进行编译和优化,因此可以提高查询和操作的性能。 3. 存储过程的使用场景 存储过程通常用于以下场景: - 执行复杂的查询和操作,例如联合查询、嵌套查询、分组查询等。 - 执行大量的 DML 操作,例如插入、更新、删除等。 - 提供可重用的代码块,例如计算、数据转换等。 - 与其他程序或存储过程进行交互,例如调用其他存储过程、触发器等。 4. 存储过程的管理 存储过程可以在 Oracle 数据库中进行存储和管理。可以使用 SQL Developer、SQL*Plus 或其他 Oracle 工具来创建、修改、删除和调用存储过程。此外,存储过程还可以与其他数据库对象(如表、视图、索引等)一起进行备份和恢复。 总之,Oracle 存储过程是一种非常有用的工具,它可以提高代码的可重用性和性能优化,并且可以在数据库中进行存储和管理。若有需要,可以在实际应用中灵活运用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值