Oracle存储过程与游标详解

Oracle中用sql查询获取数据库的所有触发器,所有存储过程,所有视图,所有表

Select object_name From user_objects Where object_type='TRIGGER'; --所有触发器
Select object_name From user_objects Where object_type='PROCEDURE'; --所有存储过程
Select object_name From user_objects Where object_type='VIEW'; --所有视图
Select object_name From user_objects Where object_type='TABLE'; --所有表

存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

存储过程创建语法

create [or replace] procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围);
变量2 类型(值范围);
Begin
    Select count(*) into 变量1 from 表A where列名=param1;
 
    If (判断条件) then
       Select 列名 into 变量2 from 表A where列名=param1;
       Dbms_output.Put_line(‘打印信息’);
    Elsif (判断条件) then
       Dbms_output.Put_line(‘打印信息’);
    Else
       Raise 异常名(NO_DATA_FOUND);
    End if;
Exception
    When others then
       Rollback;
End;

带参数存储过程含赋值方式

create or replace procedure procQuery
    (sid_no in emp.id_no%type,   --传入参数
     sname out varchar, 		 --定义输出和输出类型
     sjob in out varchar) 		 --IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。
 as   
     icount number;
 begin  
      select count(*) into icount from emp where sal>isal and job=sjob;  
      if icount=1 then  
        ....  
      else  
       ....  
     end if;  
exception  
     when too_many_rows then  
     DBMS_OUTPUT.PUT_LINE('返回值多于1行');  
     when others then  
     DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');  
end;

%这个是取前面字段的类型,也就是说sjob的类型就是表emp的字段job的类型。这样在修改表emp的job类型后(从int变char,或者改变长度),不用修改存储过程。兼容性强。


存储过程中游标定义使用

as //定义(游标一个可以遍历的结果集)   
CURSOR cur_1 IS   
  SELECT area_code,area_name,SUM(sub_town)   
  FROM city_area   
  GROUP BY area_code;   
  begin 							--执行(常用For语句遍历游标)       	
FOR rec IN cur_1
 LOOP    --循环
  UPDATE xxxxxxxxxxx_T   
   SET sub_towm = rec.sub_town  
   WHERE area_code = rec.area_code   
   AND CMCODE = rec.CMCODE   
END LOOP;

游标的概念:
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。一定程度上避免频繁的磁盘数据交换带来降低效率的影响。

游标有两种类型:显式游标(用户自定义)和隐式游标。
在前述程序中用到的SELECT…INTO…查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标
如下

DML操作和单行SELECT语句会使用隐式游标,它们是:
插入操作:INSERT。
更新操作:UPDATE。
删除操作:DELETE。
单行查询操作:SELECT … INTO …


使用隐式游标的属性,判断对雇员工资的修改是否成功。
 SET SERVEROUTPUT ON    
        BEGIN  
        UPDATE emp SET sal=sal+100 WHERE empno=1234;   
         IF SQL%FOUND THEN    
        DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');   
        COMMIT;    
        ELSE  
        DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');   
         END IF;    
        END;
--通过SQL%FOUND属性判断修改是否成功,并给出相应信息

但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句
打开游标时,SELECT语句的查询结果就被传送到了游标工作区。

提取数据
在可执行部分,按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。
FETCH 游标名 INTO 变量名1[,变量名2…];

FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。

存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

你可能感兴趣的:(ORACLE)