文档章节

Oracle之子程序(存储过程、方法、包)

o
 osc_1ee7cxmx
发布于 2018/08/06 20:56
字数 904
阅读 11
收藏 0

精选30+云产品,助力企业轻松上云!>>>

1.过程【存储过程】
    CREATE [OR REPLACE] PROCEDURE 
       <procedure name> [(<parameter list>)]
    IS|AS 
       <local variable declaration>
    BEGIN
       <executable statements>
    [EXCEPTION
       <exception handlers>]
    END;
    
    1.1无参存储过程
         写一个存储过程:实现向student表中插入10条记录的功能
    create or replace procedure  pro_student
    is 
     --声明变量
    begin
     -- 执行逻辑代码
        for i in 950..980 loop
           insert into student(id,name) values(i,'asasas');
           commit;
        end loop;
         --异常处理
    end;
    
    --注意:选中过程代码按齿轮提交并不是执行代码而是编译代码并保存在数据库中
            -- 保存在左侧菜单栏中的 procedures目录中
   调用存储过程:
           1.选中过程名称右键‘测试’选项执行
           2.通过plsql块调用
           
           begin
               pro_student();--如果没有参数 ()可以省略
           end;
    1.2 有参存储过程
    create or replace procedure pro_student2(
        p_id in number,-- 默认就是in 可以省略
        p_name in varchar2, --没有被out修饰的参数是常量,不能被改变
        p_result out student%rowtype   -- 接收返回信息

    )
    is 
    begin
       select * into p_result from student where id=p_id and name=p_name;
    end;


    declare 
        v_id student.id%type := '&请输入id';
        v_name student.name%type :='&请输入姓名';
        v_student student%rowtype;
    begin
        pro_student2(v_id,v_name,v_student);
        dbms_output.put_line(v_student.id);
        dbms_output.put_line(v_student.name);
        dbms_output.put_line(v_student.sex);
        dbms_output.put_line(v_student.birth);
        dbms_output.put_line(v_student.address);
             
    end;
    
    
    
    
    案例:请根据性别或名字查询相关记录,并把结果 返回来 打印了出来  提示用 sys_refcursor
    
    create or replace procedure pro_student3(
         v_name in student.name%type,
         v_sex in student.sex%type,
         mycursor out sys_refcursor
    )
    is 
    v_sql varchar2(100);
    begin
     
      v_sql:='select * from student where 1=1';
      if v_name is not null then
         v_sql := v_sql || 'name like ''%'||v_name||'%'''; 
      end if;
      if v_sex is not null then
         v_sql := v_sql || 'sex = '''||v_sex||''''; 
      end if;
      dbms_output.put_line(v_sql);
      open mycursor for v_sql;
      close mycursor;
    end;
    
    
    
    declare 
         v_cursor sys_refcursor;
         v_name student.name%type:='&请输入姓名';
         v_sex student.sex%type:='&请输入性别';
         v_student student%rowtype;
    begin
        pro_student3(v_name,v_sex,v_cursor);
        
        loop
          fetch v_cursor into v_student;
        exit when v_cursor%notfound;
        dbms_output.put_line(v_student.id||v_student.name);
        end loop;
        close v_cursor;
    end;
    
   
   
 2.函数【方法】:有显示的返回值
    CREATE [OR REPLACE] FUNCTION 
        <function name> [(param1,param2)]
      RETURN <datatype>  IS|AS 
        [local declarations]
      BEGIN
        Executable Statements;
        RETURN result;
      EXCEPTION
        Exception handlers;
      END;
 写一个方法实现根据班级编号获取班级名称
   create or replace function func_class(
      f_id number
   )return varchar2
   is
     v_name t_class.cname%type;
   begin
    select cname into v_name from t_class where cid = f_id;
    return v_name;
    
    exception
    when no_data_found then 
       dbms_output.put_line('找不到数据');
       return null;
    when others then 
     dbms_output.put_line('其他异常');
      return null;
   end;
   
   
     调用方法:
      1.通过工具测试
      2.通过plsql块执行
         begin
           dbms_output.put_line(func_class(1));
           end;
      3.通过SQL语句调用【方法中不能有DML操作】
        select fun_test1(102) from dual;
        select t.*,fun_test1(t.classid) from t_student t

    
    
    
    

 

方法和过程的区别:
1.DML相关的操作我们一般都使用存储过程实现
2.特定的公共的功能我们用方法实现
3.方法有显示的返回结果
4.方法中同样的也有 in out 关键字

create or replace package p_student is

  -- Author  : BOBO
  -- Created : 2018-08-06 11:29:41
  -- Purpose : 
  
  -- Public type declarations  定义一个类型
  --type <TypeName> is <Datatype>;
  --type myreftype is ref cursor;
  -- Public constant declarations -- 声明一个常量
  --<ConstantName> constant <Datatype> := <Value>;

  -- Public variable declarations
  --<VariableName> <Datatype>; -- 声明一个变量

  -- Public function and procedure declarations
  --function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;

  procedure insert_student(
    p_id t_student.id%type,
    p_name t_student.name%type
    );
  
  function getname(
    p_id t_student.id%type
    )return varchar2;

end p_student;

create or replace package body p_student is

  -- Private type declarations
  --type <TypeName> is <Datatype>;
  
  -- Private constant declarations
  --<ConstantName> constant <Datatype> := <Value>;

  -- Private variable declarations
  --<VariableName> <Datatype>;

  -- Function and procedure implementations
 -- function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is
    --<LocalVariable> <Datatype>;
 -- begin
    --<Statement>;
    --return(<Result>);
 -- end;

--begin
  -- Initialization
  --<Statement>;
  
  procedure insert_student(
    p_id t_student.id%type,
    p_name t_student.name%type
    )is
    begin
      insert into t_student(id,name)values(seq_t_student.nextval,p_name);
      commit;
    end;
  
  function getname1(
    p_id t_student.id%type
    )return varchar2
    is
      v_name t_student.name%type;
    begin
      select name into v_name from t_student where id = p_id;
      return v_name;
    end;
  
  function getname(
    p_id t_student.id%type
    )return varchar2
    is
      v_name t_student.name%type;
    begin
      select name into v_name from t_student where id = p_id;
      return getname1(p_id);
    end;
    
   
   
end p_student;

不在package中声明,直接在body中定义实现,是为了隐藏方法,同时给内部的其他方法或者存储过程调用

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

土木转行Python的几个方向? - 知乎

零、背景 近一段时间有不少土木或兄弟专业的朋友加微信问我,自学Python一段时间后又出现了迷茫期,怎么破?不知道接下来走向哪里?下面,我把我知道的告诉你,至于Python之父是不是廖雪峰,...

osc_2ak6wwpl
10分钟前
0
0
如何选购便宜的SSL证书

我们在购物的时候经常会货比三家,而价格会占主导因素,有时候价格太高会让我们望而却步。而在选购SSL证书的时候也是同样的道理,市面上可供选择的SSL证书品牌和类型繁多,价格有高有低,那么...

安信证书
11分钟前
0
0
Spark SQL 中 Broadcast Join 一定比 Shuffle Join 快?那你就错了。

本资料来自 Workday 的软件开发工程师 Jianneng Li 在 Spark Summit North America 2020 的 《On Improving Broadcast Joins in Spark SQL》议题的分享。 文章目录 1 背景 2 TPC-H 测试 3 Br...

osc_k8v7r34l
11分钟前
7
0
空间直线与球面相交算法

目录 1. 原理推导 1.1. 直线公式 1.2. 求交 2. 具体实现 3. 参考 1. 原理推导 1.1. 直线公式 在严格的数学定义中,直线是无线延长,没有端点的线;射线是一端有端点,另外一段没有端点无线延...

osc_nfjwhlc1
12分钟前
15
0
七天用Go写个docker(第六天)

今天主要来实现一下 go-docker ps 的功能,也就是查看当前有哪些容器,简单说下思路,当我们启动一个容器时就为该容器创建一个文件夹用来保存该容器的一些信息,如果我们给容器指定了名字,那...

osc_zsaazovz
13分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部