`
Luob.
  • 浏览: 1592546 次
  • 来自: 上海
社区版块
存档分类
最新评论

Oralce 存储过程 和 函数

阅读更多
      
      
--____________________________________子程序(过程和函数)____________________________________________

--1.创建过程  :无参数
   create or replace procedure pro_del_dup_rec
   as [is]
   begin
      delete teb_test a where a.rowid=(select max(rowid) from tb_test b where a.a=b.a and a.b=b.b);
   end;
   
   
--2.带有IN的参数的过程  (输入参数)
   create or replace procedure pro_transit_station   
   (
     v_start_station tb_station.station_name%type,  --定义一个变量用于保存起点站
     v_end_station tb_station.station_name%type;   --定义一个变量用于保存终点站
     V_line_name tb_station.line_name%type:='536'  --定义变量把保存公交的车次
   )
   as
      v_start_forder tb_station.forder%type;    --定义变量用户保存起点站的序号
      v_end_forder tb_station.forder%type;   --定义变量用于保存终点站的序号
      v_station_line varchar2(100);    --定义变量用于保存起点到终点的线路
      type Station_name_table_type is table of tb_station.station_name%type;    --自定义一个索引表 用户保存一组车站的名字
      v_station_name_table Station_name_table_type;  --自定义类型的变量
   begin

--查询出起点和终点站的的序号  分别保存到变量中
      select fouder into v_start_forder from tb_station where line_name=v_line_name and station_name=v_start_station;
      select forder into v_end_forder from tb_station where line_name=v_line_name and station_name=v_end_station;
      
 --判断 如果终点站的序号必起点站的序号大  就说明是 去的路上
      if v_start_forder<=v_end_forder
         select staion_name bulk collect into v_station_name_table from tb_station 
            where line_name=v_line_name and forder>=v_start_forder and forder<=v_end_forder order by forder ;
      --否则 说明是回来的路上
      else
         select station_name bulk collect into v_station_name_table from tb_sataion 
            where line_name=v_line_name and forder>=v_end_forder and forder<=v_start_forder order by forder desc;
      END if;
      --输出 起点站和终点站的 开头 部分;
      DBMS_OUTPUT.put_line(v_line_name||'公交车【'||v_start_name||'->'||v_end_station||'】站的公交路线:');
      --循环遍历表中的数据
      for  i in v_station_name_table.first..v_station_name_table.last 
          LOOP  
             -- 累加 途中车站的名称
             v_station_line:=v_station_line||v_station_name_table(i)||'->';
          end LOOP;
          --去掉最后多的一个 '->'
          v_station_line=sbustr(v_station_line,0,length(v_station_line)-2);
          --输出途中的车站名称
          DBMS_output.put_line(v_station_line);
   Exception
      when no_data_found then
        DBMS_OUTPUT.put_line('请输入正确的公交车次路线!');
   END;   
   
   --调用此过程 (除了具有默认值的参数外,其他参数必须提供数值)
      Call pro_transit_station('常青路','武胜路','536');  --没有使用默认值
      --或者  
      Call pro_transit_station('常青路','武胜路');  --使用了默认值
      
      
--3.带有Out的过程 (有输出参数)
   --示例1
    create or replace procedure proc_query_em
    (
      param_empno numner,
      param_ename out varchar2(20),
      param_salary out number
    )
    as
    begin
      select ename,salary into param_ename,param_salary from emp where empno=param_empno;
    Exception
       when no_data_found then
         raise_application_error(-2000,'该雇员不存在!');
    END;
   
   --调用带有out 参数的的过程 必须定义变量接受输出参数的数据
    declare 
     v_empno emp.empno%type:=7788;
     v_ename emp.ename%type;
     v-salary emp.salary%type;
    Begin
     proc_query_emp(v_empno,v_ename,v_salary);
     DBMS_output.put_Line(v_ename||' '||v_salary);


--4.创建带有 in out 的参数 (in out 是值输入输出参数)
  --示例1
    create or replace procedure pro_eompute
    (
     param_num1 in out number,
     param_num2 in out number
    )
    as
     v1 number;
     v2 number;
    begin
      v1:=param_num1/param_num2;
      v2:=MOD(param_num1,param_num2);
      param_num1:=v1;
      param_num2:=v2;
    END;
   --调用 in out 过程 必须提供两个变量临时赋值
    declare 
       v_num1 number(2):=10;
       v_num2 number(2):=3
     begin
       proc_compute(v_num1,v_num2);
       DBMS_output.put_line(v_num1);
       DBMS_outPut.put_line(v_num2);
     end;
     
  --5.过程中的参数 使用 “按值传递” 和 “位置传递 ” 和 “组合传递”
      --1 定义过程
        delcare or replace procedure proc_add_dept
        (
          param_deptno number,
          param_dname varchar2(20),
          param_loc varchar2(20):=null
        )
        as
        begin
           insert into dept values(param_deptno,param_dname,param_loc);
        Exception
          when Dup_val_on_index then
            raise_application_error(-2000,'部门编号不能重复');
        END;
      --按值传递
           call proc_add_dept(60,'manager','beijing');  --没有使用默认值
           --或者
           call proc_add_dept(70,'product');  --使用默认值
           
      --按名称传递
           call proc_add_dept(param_dept=>80;param_dname=>'purchase',param_loc=>'wuhan');
      
      --按组合传递 (第一个参数要按位置传递)
           call proc_add_dept(90,'admin',param_loc=>'wuhan');
    


          
--__________________________________________函数(用于返回指定的值)_____________________________________
  
  --语法
      create [or replace] function function_name   --function_name :函数的名称
      (
           argument1 [model1] datatype1;  -- 函数的参数: 在指定函数参数类型时候,不能指定长度
           argument2 [model2] datatype2; 
           ....
      
      )  
      return datatype  --指定函数的返回类型   函数必须要有return  
      is|AS    --is|As 用于开始 一个 PL/SQL 语句块   
           声明部分
      begin
           执行部分  --在函数体内至少包含一条return 语句
      exception
           异常部分
      END;
   
   --示例1
      create or replace function fun_get_user
      return varchar2
      as
        v_user varchar2(100);
      begin 
        select username into v_user from tb_users;
        return v_user;
      end;
      --调用
       declare
         v_user varchar2(100);
       begin
         v_user:=fun_get_user;
         DBMS_outpur.put_line('当前用户是'||v_user);
       end;
          --或者 直接调用
       select fun_get_user 当前用户 from dual;
       
--1.创建带有 in 参数(输入)
    create or replace function fun_get_sal 
    (parm_name varchar2)  -- 定义了一个输入参数
    return number
    as
      v_sal emp%type;
    begin
      select sal into v_sal from emp where upper(param_name)=upper(sname);
      
    Exception
      when no_data_found then
       raise_application_error(-2000,'该雇员不存在!');
    END;
      --调用
    declare
           v_ename emp.ename%type:=&ename;
    begin
           DBMS_output.put_line(fun_get_sal(v_ename));
    end; 
    
    
--2.带有 out 参数的 函数
   declare or replace function fun_get_emp_info
   (  
      param_ename varchar2,  --输入参数 
      param_dname out varchar2   --输出参数
   )
   return varchar2
   as
     v_ejob emp.job%type;  --返回的变量
   begin
     select a.job,b.dname into v_job,param_dname from emp a,dept b where a.deptno=b.deptno and upper(a.ename) =upper(param_ename);
  return  --异常
     when no_data_found then
       raise_application_erroe(-2000,'该员工不存在!');
  END;
  
  --调用
    declare
        v_ename varchar2(20):=&v_ename;
        v_dname varchar(20);
        v_ejob varchar2(20);
     begin
        v_ejob:=fun_get_emp_info(v_ename,v_dname);
        DBMS_output.put_line('员工名称'||v_ename);
        DBMS_output.put_line('部门名称'||v_dname);
        DBMS_output.put_line('员工岗位'||v_ejob);
     End;
  
--3.带有in out 参数的函数
   create or replace function fun_compute
   (
     param_num1 number,
     param_num2 in out number ---定义 in out 参数
   )
   return number
   as
      v1 number;   --定义返回两个数相除的 结果
   begin
      v1:=param_num1/param_num2;
      param_num2:=MOD(param_num1,param_num2);   --两数相余 结果 重新赋值给param_num2;
      return v1;
    ENd;
  
  --调用的时候
    declare
        v_num1 number(2):=10;
        v_num2 number(2):=3;
        v_result number(2);
     begin
        v_resultL:=fun_compute(v_num1,v_num2);
        DBMS_output.put_line('余数'||v_num2);
        DBMS_output.put_line('商是'||v_result);
    End;


--4。过程和函数的 选用  
      过程: 返回多个值 或不返回值时候      
      函数: 返回一个值


--5.查看子程序的源码 
    --查看  函数 fun_computer 的源码
  select text from user_source where name=upper('fun_compute');
  
  
--6.查看当前用户所包含的所有过程和函数 (User_objects)
  col object_name format a20
  select object_name 对象名称,created 创建时间,status 状态(valid 有效,invalid 没效) from user_objects where object_type in ('function','procedure');
    
--7.列出子程序的编译错误 (show error)
   create or replace procedure  raise_salary  -- raise_salary : 对象依赖 
   (
     param_empno number,
     param_increase number
   )
   as
   begin
       -- emp  是这个 raise_salary 过程的 :引用对象
      update emp set sal=sal+param_increase where empno=param_empno  -- (故意少了一个结束 " ;" 符号)
   end;
   
   --使用 show error 确定错误的位置和原因
   show error procedure raise_salary;  --  raise_salary 是一个过程的名称

--8.列出对象的依赖关系(user_dependencies)  (创建的过程名和函数 :叫 对象依赖,  过程和函数中涉及的表名 :引用对象)
    
     --查询引用对象为 'emp' 的所有 对象依赖   包括 函数 过程  视图  
   select name,type from user_dependencies a where a.referenced_name='emp' ;
  

--9.重新编译子程序 (当我们修改了  引用对象(emp..)的结果后 所有的函数 过程 都会无效)
   --当函数中没有引用被修改的列时    :经过 PL/SQL 的自动重新编译(即惰性编译)后,就可以正常使用  否则 失败
   --此时就要手动重新编译(compile) (函数和过程)
    alter procedure  pro_query_emp comPile;  --这样就可以 正常使用了


--10.删除子程序  (如果不在需要  子程序 (函数 和过程))
    --删除 过程
      drop procedure pro_query_emp;
    --删除 函数
      drop function fun_get_sal;

分享到:
评论

相关推荐

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作)

    通过学习和实践这些Oracle存储过程和函数的实例,你可以更好地理解和掌握如何在实际项目中应用它们。Oracle 存储过程详解.doc文档可能包含了更多详细的步骤和示例,建议详细阅读,以深化对这一主题的理解。

    oracle存储过程和函数PPT

    综合这三个主题,Oracle数据库开发者可以通过学习和熟练运用存储过程、函数和PL/SQL,提升数据库应用程序的性能和可维护性。了解并掌握游标管理,可以帮助开发者更加高效地处理大数据量的情况。这些知识对于任何涉及...

    oracle存储过程和函数写法

    oracle 的存储过程和函数的语法 如下

    oracle存储过程函数生成DEMO

    Oracle存储过程和函数是数据库管理中的重要组成部分,它们允许开发者创建复杂的业务逻辑和数据处理流程。在这个"Oracle存储过程函数生成DEMO"中,我们主要关注如何在Oracle数据库环境中设计、编写、测试以及调用存储...

    java调用oracle存储过程或者函数

    以上就是Java调用Oracle存储过程或函数的主要知识点,实践中要根据具体情况进行适当的调整和优化。在处理过程中,参考Oracle的JDBC文档和官方示例,以及Java API文档,将有助于理解和解决问题。

    JAVA 与ORACLE 存储过程及函数

    在“JAVA与存储过程.txt”文件中,可能包含了具体的示例代码,解释了如何在Java中调用Oracle存储过程和函数,以及如何处理输入和输出参数。这些示例可能涉及到了`Connection`, `PreparedStatement`, `ResultSet`等...

    Oracle存储过程、函数和包

    ### Oracle存储过程、函数和包的关键知识点 #### 1. 存储过程和函数的认识 - **定义**:存储过程和函数是特定类型的PL/SQL块,它们被存储在数据库中,作为命名的对象存在。 - **命名存储**:与普通的PL/SQL块不同,...

    oracle存储过程_函数_语法_大全_详解

    通过以上介绍,我们可以看到Oracle存储过程和函数的强大功能。它们不仅可以帮助我们简化数据库操作,还能提高程序的可维护性和性能。掌握这些基础知识对于任何Oracle数据库开发者都是非常重要的。

    oracle实验8-存储过程与函数的创建.doc

    Oracle实验报告

    Oracle 存储过程,函数和包.doc

    Oracle 存储过程、函数和包 Oracle 存储过程和函数是 Oracle 数据库中的一种程序单元,它们可以执行...创建和删除存储过程、参数传递、存储过程的执行、应用、优点和缺点都是 Oracle 存储过程和函数的重要知识点。

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    ORACLE存储过程,函数,包,游标

    在《ORACLE存储过程,函数,包,游标》这个文本文件中,可能包含了关于如何定义、调用和管理这些对象的示例代码和实践指导。通过阅读和理解这个文件,开发者能够深入了解Oracle数据库的动态编程能力,提升其在数据库...

    Oracle存储过程、游标、函数的详解

    通过以上对Oracle存储过程、游标和函数的详细介绍,我们可以看到这些特性为Oracle数据库提供了一种强大而灵活的方式来处理数据。掌握这些技术对于开发高效的应用程序至关重要。在未来的学习和实践中,我们应该不断...

    java中调用oracle的存储过程和函数

    ### Java中调用Oracle的存储过程和函数 在Java应用程序中调用Oracle数据库中的存储过程或函数是一项常见的任务。这不仅能够提高代码的执行效率,还可以有效地管理事务处理,确保数据的一致性和完整性。本文将详细...

    Oracle编程存储过程、函数和包

    讲解了oracle的编程存储过程、函数和包

    hibernate query调用oracle存储过程

    以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....

    存储过程、函数、触发器和包

    存储过程、函数、触发器和包

    oracle函数调用存储过程

    在Oracle数据库中,**存储过程**是一组预编译的SQL语句和过程式PL/SQL代码块,存储在数据库服务器上,并作为一个单元执行。它能够接收输入参数、执行复杂的业务逻辑,并且可以返回多个输出值或影响数据库状态。 **...

    oracle存储过程函数和程序包.ppt

    Oracle 存储过程函数和程序包 Oracle 存储过程函数和程序包是 Oracle 数据库中的一种核心组件,用于实现复杂的业务逻辑和数据处理。以下是 Oracle 存储过程函数和程序包的知识点总结: 一、游标的概念和类型 游标...

    oracle存储过程、函数和程序包.pptx

    Oracle存储过程、函数和程序包 Oracle存储过程、函数和程序包是数据库管理系统中的一种机制,允许开发者在数据库服务器上创建和执行自定义的代码,以提高数据库的性能和安全性。本文将对Oracle存储过程、函数和程序...

Global site tag (gtag.js) - Google Analytics