`
8366
  • 浏览: 802421 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

oracle 存储过程学习

    博客分类:
  • DB
阅读更多

存储过程创建语法:

 

 create or replace procedure 存储过程名(param1 in typeparam2 out type

as

变量1 类型(值范围);

变量2 类型(值范围);

Begin

    Select count(*) into 变量1 from A where列名=param1

    If (判断条件) then

       Select 列名 into 变量2 from A where列名=param1

       Dbms_outputPut_line(打印信息);

    Elsif (判断条件) then

       Dbms_outputPut_line(打印信息);

    Else

       Raise 异常名(NO_DATA_FOUND;

    End if;

Exception

    When others then

       Rollback;

End;

注意事项:

1  存储过程参数不带取值范围,in表示传入,out表示输出

2  变量带取值范围,后面接分号

3  在判断语句前最好先用count*)函数判断是否存在该条操作记录

4  select 。。。into。。。给变量赋值

5  在代码中抛异常用 raise+异常名

以命名的异常

命名的系统异常                          产生原因

ACCESS_INTO_NULL                   未定义对象

CASE_NOT_FOUND                     CASE 中若未包含相应的 WHEN ,并且没有设置

ELSE

COLLECTION_IS_NULL                集合元素未初始化

CURSER_ALREADY_OPEN          游标已经打开

DUP_VAL_ON_INDEX                   唯一索引对应的列上有重复的值

INVALID_CURSOR                 在不合法的游标上进行操作

INVALID_NUMBER                       内嵌的 SQL 语句不能将字符转换为数字

NO_DATA_FOUND                        使用 select into 未返回行,或应用索引表未初始化的 

TOO_MANY_ROWS                      执行 select into 时,结果集超过一行

ZERO_DIVIDE                              除数为 0

SUBSCRIPT_BEYOND_COUNT     元素下标超过嵌套表或 VARRAY 的最大值

SUBSCRIPT_OUTSIDE_LIMIT       使用嵌套表或 VARRAY 时,将下标指定为负数

VALUE_ERROR                             赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED                           PL/SQL 应用程序连接到 oracle 数据库时,提供了不

正确的用户名或密码

NOT_LOGGED_ON                       PL/SQL 应用程序在没有连接 oralce 数据库的情况下

访问数据

PROGRAM_ERROR                       PL/SQL 内部问题,可能需要重装数据字典& pl./SQL

系统包

ROWTYPE_MISMATCH                宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

SELF_IS_NULL                             使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR                        运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID                         无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时 

实例学习:

1.    建立一个存储过程  一个入参,一个出参

create or replace procedure test_xg_p5(a in number,x out varchar2) is
begin
 if a=0 then
  select count(1) into x from log;
  else
  select count(1) into x from id_table;
   end if;
   exception
    when others then
    ROLLBACK;
end test_xg_p5;

sql 模式下运行 以上存储过程

调用方式 3

a.    windows 客户端 使用PLSQL Developer command模式 执行

 

b.在安装 oracle linux 客户机上使用 oracle 用户在控制台 使用sqlpuls 执行存贮过程

pd2

c. 使用java客户端

    /*oracle存储过程 返回一个 数字*/

       Connection conn=null;

       CallableStatement proc = null;

       conn= OracleJDBCTest.getConn();

       proc = conn.prepareCall("{call test_xg_p5(?,?)}");

       //传递0 返回1 传递1 返回106 两个表的记录数目不同

       proc.setInt(1,1);

       proc.registerOutParameter(2, Types.VARCHAR);

       proc.execute();

       System.out.println(proc.getString(2));

       conn.close();

 

2 建立一个存储过程  返回一个结果集合

  步骤:

  第一步: 首先建立一个包,定义游标类型

CREATE OR REPLACE PACKAGE TYPES AS
    TYPE BJ_CURSOR IS REF CURSOR;
 END;

 二步: 建立 中间存贮过程过程 返回游标
CREATE OR REPLACE PROCEDURE BJ_TEST_PROC
        (
               V_TEMP OUT TYPES.BJ_CURSOR,
                PID IN VARCHAR
        )
        AS
        BEGIN
                OPEN V_TEMP FOR select * from id_table t where t.quantity=PID;
      END BJ_TEST_PROC;

 

调用方式2

a.     sqlplus 控制台下 (貌似不能在 commond 模式下执行,不然var a refcursor会报错)

 

var a refcursor 

call BJ_TEST_PROC(:a,1); 

  print a;

 

pb3

 

b.     使用java客户端

   首先看下表名 为id_table的表结构

 

pd4

 

调用代码

    Connection conn=null;

       CallableStatement proc = null;

       conn= OracleJDBCTest.getConn();

       proc = conn.prepareCall("{call BJ_TEST_PROC(?,?)}");

       proc.setString(2,"1");

       proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

       proc.execute();  

          ResultSet rs = (ResultSet) proc.getObject(1);  

          while (rs.next()) {  

            System.out.println(rs.getString("TABLE_NAME"));   

          } 

       conn.close();

 

 

 

一个在eusp 项目中自己写的存储过程 以及 客户端调用代码

 

功能:给学校初始化 客户管理菜单

 

create or replace procedure pr_initCustManageMenu(flag in varchar2,sysOrg in varchar2,outPut out number) is

 

begin

-- 增加菜单 flag=0,删除菜单 flag=1

if flag='0' then

  insert into xs_menu (menu_name,menu_type,menu_icon,SYS_ORGANIZATION) values('客户管理','系统类','customer.gif',sysOrg);

  insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)

    select menu_id,'教职工管理','系统类','tecOrgCustPanel',sysOrg

    from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;

  insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)

    select menu_id,'临时人员管理','系统类','worOrgCustPanel',sysOrg

    from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;

  insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)

    select menu_id,'学生管理','系统类','stuOrgCustPanel',sysOrg

    from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;

  insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)

    select menu_id,'营业组管理','系统类','shoOrgCustPanel',sysOrg

    from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;

  insert into xs_menu (upper_menu_id,menu_name,menu_type,tech_type,SYS_ORGANIZATION)

    select menu_id,'设备管理','系统类','xxTermPanel',sysOrg

    from XS_MENU where XS_MENU.MENU_NAME='客户管理' and SYS_ORGANIZATION=sysOrg;

 

 

 --- 添加权限

insert into XS_LEVEL_SYSMODULE(MENU_ID,ROLE_ID)

 select m.menu_id,(select role_id from xs_role where name='ROLE_admin' and SYS_ORGANIZATION=sysOrg)

 from xs_menu m  where m.sys_organization=sysOrg start with

   m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)

connect by prior m.menu_id = m.upper_menu_id;

 

 -- 添加成功返回

 outPut:=0;

  commit;

 

  else

 

   -- 删除权限

   delete  from XS_LEVEL_SYSMODULE ls where exists

 (

 select menu_id from (

 (select m.menu_id from xs_menu m where m.sys_organization=sysOrg start with

   m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)

connect by prior m.menu_id = m.upper_menu_id)

) a where a.menu_id=ls.menu_id);

  

   -- 删除菜单

 

 delete  from xs_menu ls where exists

 (

 select menu_id from (

 (select m.menu_id from xs_menu m where m.sys_organization=sysOrg start with

   m.menu_id=(select m.menu_id from xs_menu m where m.menu_name='客户管理' and m.sys_organization=sysOrg)

connect by prior m.menu_id = m.upper_menu_id)

) a where a.menu_id=ls.menu_id and ls.sys_organization=sysOrg);

  

  

  --删除成功返回

   outPut:=0;

   commit;

   end if;

exception

  when others then

  ROLLBACK;

  --失败

    outPut:=1;

end pr_initCustManageMenu;

 

 

客户端调用代码:使用了springJdbcDaoSupport

@Override

    public int initCustManageMenu(final String flag, final String sysOrg) {

       String sql = "{call pr_initCustManageMenu(?,?,?)}";  

        Object obj=getJdbcTemplate().execute(sql,new CallableStatementCallback(){  

            public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {  

                cs.setString(1,flag);

                cs.setString(2,sysOrg);

                cs.registerOutParameter(3,Types.INTEGER);

                cs.execute();

                return  cs.getInt(3);

            }     

        });

        return Integer.valueOf(obj.toString());

    }

 

 

 

分享到:
评论

相关推荐

    oracle存储过程学习经典入门

    Oracle 存储过程学习经典入门 Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识...

    ORACLE存储过程学习源码

    这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...

    oracle存储过程学习经典

    oracle存储过程学习

    ORACLE存储过程学习

    存储过程学习、个人随笔、基本语法和流程控制。仅供参考

    oracle 存储过程学习

    快速学习函数创建和练习。 创建函数、存储过程、创建过程、调用存储过程、AUTHID、PRAGMA AUTONOMOUS_TRANSACTION、开发存储过程步骤、删除过程和函数、过程与函数的比较

    oracle存储过程学习经典(实例)

    这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何创建、执行和管理存储过程。 存储过程在数据库管理中扮演着关键角色,它可以提升系统的性能,通过减少网络流量和提供预编译的...

    oracle存储过程学习资料

    在本学习资料中,你将深入理解Oracle存储过程的创建、调用、调试以及优化等多个方面。 1. **存储过程的创建**: Oracle存储过程通过`CREATE PROCEDURE`语句来定义。你可以指定输入参数、输出参数、输入输出参数,...

    oracle存储过程学习

    在"Oracle存储过程学习"这个主题中,我们可以深入探讨以下几个关键知识点: 1. **定义与创建**: 存储过程通过`CREATE PROCEDURE`语句创建。例如: ```sql CREATE OR REPLACE PROCEDURE proc_name (param1 ...

    oracle存储过程学习经典[语法+实例+调用]

    在学习Oracle存储过程时,结合详细的文档如《oracle存储过程超详细使用手册.doc》和实例资料《oracle存储过程学习经典[语法+实例+调用].doc》会非常有帮助。这些文档通常会涵盖基础语法、实例解析、调用方法、异常...

    oracle存储过程学习经典[语法+实例+调用].doc

    oracle存储过程学习经典[语法+实例+调用].doc

    oracle 存储过程学习经典

    oracle 存储过程学习经典,主要适合初学oracle存储过程的.

    oracle存储过程学习经典[语法+实例+调用].pdf

    oracle存储过程学习经典[语法+实例+调用].pdf

    oracle存储过程学习笔记(四)

    在本篇“Oracle存储过程学习笔记(四)”中,我们将深入探讨存储过程的概念、创建、执行以及在实际应用中的优势。 1. **存储过程的概念** 存储过程是一组预先编译的SQL和PL/SQL语句,存储在数据库服务器中。当需要...

    oracle存储过程学习实例文档 创建调用

    在这个“Oracle存储过程学习实例文档”中,我们将深入探讨如何创建存储过程,以及如何在Java应用程序中调用这些过程。 1. **创建Oracle存储过程** 创建存储过程的基本语法如下: ```sql CREATE OR REPLACE ...

    oracle存储过程学习笔记

    1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字

    oracle存储过程学习经典入门.rar_oracle

    这个压缩包文件"oracle存储过程学习经典入门.rar_oracle"显然包含了帮助初学者理解并掌握Oracle存储过程的基础教程。下面将详细讲解Oracle存储过程的相关知识点。 首先,存储过程是预编译的SQL语句集合,它在数据库...

    Oracle 存储过程学习文档

    该文档比较详细地介绍了Oracle存储过程,有例子

Global site tag (gtag.js) - Google Analytics