`

oracle 调用存储过程

 
阅读更多

转载自:http://ajax-xu.iteye.com/blog/1199993

 

SQL中调用存储过程语句: 
call procedure_name(); 
调用时”()”是不可少的,无论是有参数还是无参数。 
定义对数据库过程的调用时    无参数过程:{ call procedure_name()}   仅有输入参数的过程:{call procedure_name(?,?...)}     这里?表示输入参数,创建存储过程时用in表示输入参数 
   仅有输出参数的过程:{ Call procedure_name(?,?...)}     这里的?表示输出参数,创建存储过程时用out表示输入参数 
   既有输入参数又有输出参数的过程            {call procedure_name(?,?...)}     这里的?有表示输出参数的,也有表示输入参数的 
下面将会对这4种情况分别举出实例!!! 

参数过程实例 
无参数存储过程: 
create or replace procedure stu_proc as 
pname varchar2(25); 
begin 
  select sname into pname from student where sno=1; 
  dbms_output.put_line(pname); 
end; 
或者 
create or replace procedure stu_proc as 
pname student.sname%type; 
begin 
  select sname into p_name from student where sno=1; 
  dbms_output.put_line(pname); 
end; 




参数过程实例 
仅有输入参数的过程 
create or replace procedure stu_proc1(pno in student.sno%type) as 
pname varchar2(25); 
begin 
  select sname into pname from student where sno=pno; 
  dbms_output.put_line(pname); 
  end; 

参数过程实例 
仅有输出参数的存储过程 
create or replace procedure stu_proc2(pname out student.sname%type) as 
begin 
  select sname into pname from student where sno=1; 
  dbms_output.put_line(pname); 
  end; 
此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明 

参数过程实例 
有输入\输出参数的存储过程: 
create or replace procedure stu_proc3 
(pno in student.sno%type,pname out student.sname%type) as 
begin 
  select sname into pname from student where sno=pno; 
  dbms_output.put_line(pname); 
  end; 
此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明 

Oracle函数调用存储过程 
我们已经学习了oracle函数,下面就针对参数的4种情况分别举出实例说明函数对存储过程的调用 
函数调用存储过程实例 
对无参数过程的调用: 
--函数 
create or replace function get_pname return varchar2 is 
  pname varchar2(20); 
  begin 
   stu_proc; 
   select sname into pname from student where sno=1; 
    return pname; 
    end; 
--调用 
declare 
begin 
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname); 
end; 

函数调用存储过程实例 
对有输入参数过程的调用: 
create or replace function get_pname1(pno in number) return varchar2 is 
  pname varchar2(20); 
  begin 
  stu_proc1(pno in student.sno%type) 
  select sname into pname from student where  sno=pno; 
    return pname; 
    end; 
--调用 
declare 
begin 
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname1(2)); 
end; 

函数调用存储过程实例 
对有输出参数过程的调用: 
create or replace function get_pname2(pname out varchar2) return varchar2 is 
  begin 
  stu_proc2(pname out student.sname%type); 
    return pname; 
    end; 
--调用 
declare 
pname student.sname%type; 
begin 
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname2(pname)); 
end; 

函数调用存储过程实例 
对有输入\输出参数过程的调用: 
create or replace function get_pname3(pno in number,pname out varchar2) return varchar2 is 
  begin 
stu_proc3(pno in student.sno%type,pname out student.sname%type); 
    return pname; 
    end; 
--调用 
declare 
pname student.sname%type; 
begin 
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname3(2,pname)); 
end; 

JAVA调用数据库存储过程 
前面我们已经讲述了有关oracle数据库的存储过程的几种形式,以及oracle函数对存储过程的调用,下面我将根据上面存储过程的实例来举出JAVA对oracle存储过程的调用 
JAVA调用实例 
仅有返回值的过程: 
public static void main(String[] args) { 
Connection conn=BBConnection.getConnection(); 
String sql="{call stu_proc2(?)}"; 
try { 
CallableStatement statement=conn.prepareCall(sql); 
statement.registerOutParameter(1,Types.VARCHAR); 
statement.execute(); 
String pname=statement.getString(1); 
System.out.println(pname); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 




JAVA调用实例 
既有输入参数又有输出参数的过程 
public static void main(String[] args) { 
        Connection conn=BBConnection.getConnection(); 
        String sql="{call stu_proc3(?,?)}"; 
        try { 
                CallableStatement statement=conn.prepareCall(sql); 
                statement.setInt(1, 1); 
                statement.registerOutParameter(2,Types.VARCHAR); 
                statement.execute(); 
                String pname=statement.getString(2); 

                System.out.println(pname); 
         } catch (SQLException e) { 
               e.printStackTrace(); 
         } 

JAVA调用实例 
下面将举出无out参数的调用实例 
这种参数不适于用在查询语句上,因为查询语句需要有返回值才能被JAVA调用 
返回到 OUT 参数中的值可能会是JDBC NULL。当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。对于 ResultSet 对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase 

JAVA调用实例 
仅有参数的过程: 
public static void main(String[] args) { 
Connection conn=BBConnection.getConnection(); 
String sql="{call stu_proc1(?)}"; 
try { 
CallableStatement statement=conn.prepareCall(sql); 
statement.setInt(1, 1); 
statement.execute(); 
System.out.println(statement.execute()); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}finally{ 
try { 
conn.close(); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 





JAVA调用实例 
无参数过程: 
public static void main(String[] args) { 
Connection conn=BBConnection.getConnection(); 
String sql="{call stu_proc()}"; 
try { 
CallableStatement statement=conn.prepareCall(sql); 
statement.execute(); 
System.out.println(statement.execute()); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}finally{ 
try { 
conn.close(); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}           


通过调用数据库函数调用存储过程 
下面将举一个通过数据库函数来调用存储过程: 
public static void main(String[] args) { 
Connection conn=BBConnection.getConnection(); 
String sql="{?=call get_pname1(?)}"; 
try { 
CallableStatement statement=conn.prepareCall(sql); 
statement.registerOutParameter(1, Types.VARCHAR); 
statement.setInt(2, 1); 
statement.execute(); 
System.out.println(statement.getString(1)); 


} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
}finally{ 
try { 
conn.close(); 
} catch (SQLException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 




?表示函数return的值, get_pname1是数据库函数名 
存储过程的out和in都是以参数传进,这就是函数和存储过程的区别之一 
存储过程的异常处理 
为了提高存储过程的健壮性,避免运行错误,当建立存储过程时应包含异常处理部分。 
异常(EXCEPTION)是一种PL/SQL标识符,包括预定义异常、非预定义异常和自定义异常; 
预定义异常是指由PL/SQL提供的系统异常;非预定义异常用于处理与预定义异常无关的Oracle错误(如完整性约束等);自定义异常用于处理与Oracle错误的其他异常情况。 
RAISE_APPLICATION_ERROR用于自定义错误消息,并且消息号必须在-20000~-20999之间 
存储过程的异常处理实例 
Oracle数据库中提供了一些异常处理的方法,下面通过一个实例来说明 
create or replace procedure stu_proc6(pno in student.sno%type,pname out student.sname%type) 
       is 
       begin 
          select sname into pname from student where sno=pno; 
       EXCEPTION 
                 when NO_DATA_FOUND then 
                RAISE_APPLICATION_ERROR 
(-20011,'ERROR:不存在!'); 
end; 
Oracle提供的异常处理 
     命名的系统异常          产生原因 
ACCESS_INTO_NULL         未定义对象 
CASE_NOT_FOUND         CASE 中若未包含相应的 WHEN ,并且没有设置 
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 在等待资源时超时 
存储过程的异常处理实例 
自定义异常处理: 
create or replace procedure stu_proc7(pno in student.sno%type, 
       pon in student.sno%type 
       ) 
       is 
           v_raise exception; 
           v_name student.sname%type; 
       begin 
         if pno=101 then 
           raise v_raise; 
           end if; 
           select sname into v_name from student where sno=111111; 
       exception 
           when v_raise then 
             RAISE_APPLICATION_ERROR(-20010,'ERROR:not existed!'); 
           when no_data_found then 
             RAISE_APPLICATION_ERROR(-20011,'ERROR:不存在!'); 
end; 
存储过程的事务处理 
事务用于确保数据的一致性,由一组相关的DML语句组成,该组DML语句所执行的操作要么全部确认,要么全部取消。 
当执行事务操作(DML)时,Oracle会在被作用的表上加锁,以防止其他用户改变表结构,同时也会在被作用的行上加行锁,以防止其他事务在相应行上执行DML操作。 
当执行事务提交或事务回滚时,Oracle会确认事务变化或回滚事务、结束事务、删除保存点、释放锁。 
存储过程的事务处理 
提交事务(COMMIT)确认事务变化,结束当前事务、删除保存点,释放锁,使得当前事务中所有未决的数据永久改变。 
保存点(SAVEPOINT)在当前事务中,标记事务的保存点。 
回滚事务(ROLLBACK)回滚整个事务,删除该事务所定义的所有保存点,释放锁,丢弃所有未决的数据改变。 
回滚事务到指定的保存点(ROLLBACK TO SAVEPOINT)回滚当前事务到指定的保存点,丢弃该保存点创建后的任何改变,释放锁。 
存储过程的事务处理 
当执行DDL、DCL语句,或退出SQL*PLUS时,会自动提交事务; 
事务期间应避免与使用者互动; 
查询数据期间,尽量不要启动事务; 
尽可能让事务持续地越短越好; 
在事务中尽可能存取最少的数据量。 

事务处理实例 
存储过程事务处理实例: 
create or replace procedure stu_proc8 
       is 
       begin 
         insert into student values(102,'sky','m',22,'gong'); 
         savepoint savepoint1; 
         insert into student values(102,'good','w',20,'wang'); 
         dbms_output.put_line('error'); 
         update student set sno=103 where sname='good'; 
         commit; 
         exception 
           when dup_val_on_index then 
             rollback to savepoint savepoint1; 
             RAISE_APPLICATION_ERROR(-20010,'ERROR:违反唯一索引约束!'); 
        end; 
数据库函数和存储过程的包 
创建包(package) 
函数: 
create or replace package 包名 as 函数 
注意:as后可加多个函数 
存储过程: 
Create or replace package 包名 as 存储过程 
注意:as后可加多个存储过程 
包的调用 
函数的包调用: 
call 包名.函数名; 
存储过程的包调用: 
call 包名.存储过程名; 
THE  END

分享到:
评论

相关推荐

    oracle调用存储过程

    综上所述,Oracle调用存储过程涉及到许多方面,从创建、调用到参数管理和异常处理,都需要对Oracle的PL/SQL语法和数据库管理有深入理解。通过熟练掌握这些知识点,开发者可以更有效地利用存储过程来提升应用程序的...

    oracle调用存储过程实现分页

    总的来说,Oracle调用存储过程实现分页是一种有效的方法,它允许我们封装复杂逻辑,提高代码复用性,并且可以通过优化SQL来提升查询效率。在Web应用中,配合适当的调用方式,可以实现与前端的无缝对接,为用户提供...

    Oracle调用存储过程总结

    ### Oracle调用存储过程详解 在Oracle数据库管理与开发中,存储过程是一种非常重要的数据库对象,它可以被看作是一组SQL语句与控制流语句的集合,预先编译并存储于数据库中,用于实现特定的功能。通过调用存储过程...

    springboot mybatis 动态调用oracle存储过程,通过存储过程名称,就能动态调用存储过程、java动态调用or

    能不能写个动态的业务,只输入存储过程名称,自动获取存储过程参数,并且参数的数据从前台传递过来...只根据输入不同的存储过程名称、参数内容,自动调用不同的存储过程。 已经使用在多个项目中 全开源项目 请放心下载

    Springboot调用Oracle存储过程的几种方式.docx

    在转换SSH项目到Spring Boot的过程中,遇到了由于连接池默认配置限制(默认连接数为10)导致的问题,即频繁调用存储过程后,数据库连接无法得到正确释放,从而引发项目崩溃。以下是对这三种调用方式的详细解释: 1....

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    delphi调用Oracle的存储过程

    - 如果连接成功,则通过`ADOStoredProc1`组件调用存储过程`pkg_test.get`。 - 创建输入参数`p1`,并为其赋值1。 - 最后,执行存储过程。 通过以上步骤,我们可以在Delphi中成功调用Oracle的存储过程,并获取其...

    ORACLE的存储过程的异步调用

    ORACLE 存储过程的异步调用 本文讨论了 ORACLE 存储过程的异步调用方法,旨在解决...为了测试异步调用存储过程的方法,需要建立测试环境,包括创建模拟大业务处理存储过程、读取管道动态了解处理状态的存储过程等。

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    JAVA调用ORACLE存储过程通用类

    - **queryProcedure**方法:该方法是核心处理方法,用于调用存储过程,并获取结果集。 - 参数列表: - `List list`:包含要传递给存储过程的参数值列表。 - `String strStoredProcedureName`:存储过程的名称。 ...

    C#调用oracle方法(包括调用存储过程)

    ### C#调用Oracle方法(包括调用存储过程) 在.NET框架中,使用C#语言进行数据库操作是一项常见的任务。本文将详细介绍如何使用C#语言连接Oracle数据库,并演示如何调用Oracle存储过程,特别是带有输出参数的情况。...

    hibernate query调用oracle存储过程

    在Hibernate中,调用存储过程通常通过Session对象的createNativeQuery()方法实现,这个方法用于创建原生SQL查询,可以方便地调用数据库的自定义SQL或者存储过程。以下是一个简单的示例,展示了如何调用一个不带参数...

    调用Oracle数据库中的存储过程需要两步走

    调用Oracle存储过程通常涉及两个主要步骤:定义存储过程和调用存储过程。 **第一步,Oracle定义存储过程** 在Oracle中,存储过程的定义包括以下几个关键点: 1. **创建包(Package)**:Oracle存储过程可能需要...

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    Delphi中调用oracle的存储过程返回数据集

    在 Delphi 中调用 Oracle 的存储过程返回数据集需要遵循一定的规则和格式,包括创建 Oracle 包和存储过程、使用 AdoConnection 和 AdoDataSet 组件连接到 Oracle 数据库、调用存储过程并返回数据集等步骤。

    oracle定时器调用存储过程

    oracle定时器调用存储过程

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

    调用Oracle函数的过程与调用存储过程类似,但创建CallableStatement时的SQL语句略有不同。由于函数会返回一个值,所以格式通常是`{? = call function_name(?, ?, ...)}`。在执行后,通过`CallableStatement....

    润乾报表调用oracle存储过程案例说明

    5. **报表取值与正常报表设置一样**:报表的其他设置(如表格、图表等)与普通报表无异,主要的区别在于数据来源是调用存储过程。 6. **Tomcat中的数据源设置**:在Tomcat服务器的配置文件(通常为`context.xml`)...

    oracle触发器调用存储过程

    "Oracle触发器调用存储过程" Oracle触发器可以调用存储过程,以实现业务逻辑的自动化执行。然而,在触发器中调用存储过程时,需要注意事务的隔离性,以避免出现锁定和死锁的问题。Oracle自治事务(Autonomous ...

Global site tag (gtag.js) - Google Analytics