oracle的学习历程 2017/9/1

来源:互联网 发布:java web访问日志记录 编辑:程序博客网 时间:2024/06/05 23:55

过程

相当于java中的方法类,这就是oracle中用pl/sql程序写的一些方法块,一次编译后方便以后使用。
这类程序包括过程、函数、包、触发器。

创建过程:

基本语法【】代表可以写可以不写
create 【or replace】 procedure 过程名
(参数名 in / out type,
 参数名 in / out type, ...
) is
begin
  

end 过程名;               参数中IN是表示输入,out表示输出 

举例子:

create or replace procedure pro_1( a invarchar2,b out varchar2)

is

str varchar2(100);

begin

 str:='Your input is '||a;

 b:=str;

dbms_output.put_line(b);

end;

调用过程

调用过程的命令:execute

上面的函数可以这样使用:EXECUTE pro_1('S',b);



删除过程

当一个过程不再需要的时候,我们可以将其删除并释放内存空间。
例如:drop procedure pro_1;

修改过程

同名的过程可以不必删除后再创建,只需要修改就可以。具体在create语句后面加上or replace关键字
比如create or replace procedure 同名的过程名



过程的参数类型以及传递

in 代表这个参数是输入类型的参数,这个参数值输入给过程
out代表这个参数是输出类型的参数,这个参数在过程中被赋值,从而传递给过程以外的部分或环境。
in out 这种类型是包含了上述两种方式,既可以是输入又可以是输出。



函数

函数一般用于计算和返回一个值,可以将经常用到的计算写成函数,这个就比如excel里面的函数。
但是函数的调用是表达式的一部分,而过程的调用时一条pl/sql语句。
调用函数必须用表达式,不像过程调用只需要过程名。
函数必须有一个返回值,但过程可以没有。

语法如下: create or replace function function_name

  (

  参数名 [方式1] 数据类型1,

  参数名2 [方式2] 数据类型2, ........

  )

  return 函数要返回的值

  is|as

  begin

  end;

注意事项: 如果表达式类型与定义不相同的时候,白哦大师可以被转换成函数定义子句return中指定的类型。同时,控制将立即返回调用环境。
                   函数中可以有一个以上的return语句,但是如果函数结束时还没有遇到return,则会发生错误。
                   通常,函数里只有in。


执行

可以通过定义一个全局变量来接受返回值
比如

var v1 varchar2(100)

  exec :v1:=function_name

也可以在程序中调用函数

declare 

   m number;

    f  number;

begin

      m:=count('m');

end;


删除函数:

drop function 函数名;
也可以使用相同名称重新定义的方法:
create or replace function 函数名


举个完整的例子

create or replace function get_sal(empnamein varchar2) return number is

  Result number;

  begin

  select sal into Result from emp where ename=empname;

  return(Result);

  end get_sal;


执行:

SQL> var sal number

SQL> exec :sal:=get_sal('scott');


程序包

用于将逻辑相关的pl/sql块或(变量、常量、自定义数据类型、异常、过程、函数、游标)等组织在一起,作为一个完整的单元存储在数据库中,来标识成程序包。类似于java中的类。其中变量相当于类中的成员变量,过程和函数相当于类的方法


基本原理

程序包有两个部分,一个是说明部分和包体部分,这两个部分都独立的存储在数据字典中。

说明部分是包与应用程序之间的接口,只是过程,函数,游标等名称或者首部。

包体才是这些过程、函数、游标的具体实现。

一般处理方法是:先独立的进行过程和函数的编写,待较为完善后,再逐渐按照逻辑相关性进行打包。

应该尽可能的减少说明部分。因为对包体的更新不会导致重新编译包的应用程序。而对说明部分的更新则需要重新编译每个调用包的应用程序。


创建包

1、包说明部分:

他是对包内所有的不见进行一个简单的说明,每个部件可以被外界应用程序访问,其中的过程,函数,变量,常量游标都是公共的。

创建格式:

         create  package 包名

         is

         变量,常量,以及数据类型定义;

         游标定义头部;

          函数、过程的定义和参数列表以及返回类型;

end 包名;

举个例子:

CREATE OR REPLACE

package p_stu

as

   --定义结构体

   type re_stu is record(

       rname student.name%type,

       rage  student.age%type

   );

   --定义游标

   type c_stu is ref cursor;

   --定义函数

   function numAdd(num1 number,num2 number)return number;

   --定义过程

   procedure GetStuList(cid in varchar2,c_st out c_stu);

end;

包体部分:

create package body 包名

as 

游标、函数、过程的具体定义;

end 包名;

举个例子:

CREATE package body p_stu

as

   --游标和结构体,包规范中已声明,包体中不用再声明,直接使用。

   --实现方法  

   function numAdd(num1 number,num2 number)return number

   as

       num number;

   begin

       num:=num1+num2;

       return num;

   end;

   --实现过程

   procedure GetStuList(cid varchar2,c_st out c_stu)

   as

       r_stu re_stu; --直接使用包规范中的结构

   begin

       open c_st for select name,age from student where classid=cid;

      -- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。

      -- loop

      --     fetch c_st into r_stu; 

      --     exit when c_st%notfound;

      --     dbms_output.put_line('姓名='||r_stu.rname);

      -- end loop;

   end;

end;

调用包:

方式:包名.变量名(常量名)【游标名】【函数名】【过程名】

举个例子:

SQL> var sal number

SQL> exec :sal:=my_package.F_count_num('M');

删除包

drop package 包名

create or replace package 已存在的包名











原创粉丝点击