iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么调用Oracle存储过程
  • 603
分享到

怎么调用Oracle存储过程

2024-04-02 19:04:59 603人浏览 八月长安
摘要

这篇文章给大家介绍怎么调用oracle存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Oracle的存储过程语法如下:create procedure 存储过

这篇文章给大家介绍怎么调用oracle存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Oracle的存储过程语法如下:

create procedure 存储过程名称(随便取) 
is
    在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量
begin
    执行部分
end;

(2)带参数的存储过程语法:

create procedure 存储过程名称(随便取) (变量1 数据类型,变量2 数据类型,...,变量n 数据类型)
is
    在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量
begin
    执行部分
end;

(3)带输入、输出参数的存储过程语法:

create procedure 存储过程名称(随便取) (变量1 in(或out) 数据类型,变量2 in(或out) 数据类型,...,变量n in(或out) 数据类型)
is
    在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量
begin
    执行部分
end;

注意:用上面的语法创建存储过程时可能会碰到数据库中已经有了同名的存储过程,这样Oracle就会弹框报错,说名字已被现有对象使用。解决方法有两种:

   方法一:换个存储过程名

   方法二:在最开头的create procedure 之间加上 or replace 关键字,例如:create or replace procedure 存储过程名称。但是这种方法不建议使用,因为这种方法会把之前同名的存储过程替换为你当前写的这个

存储过程案例一:没参数的存储过程

create replace procedure procedure_1
is
begin
    dbms_output.put_line('procedure_1.......');
end;

存储过程案例二:带参数的的存储过程

create procedure procedure_2(v_i number,v_j number)
is
    v_m number(5);
begin
    dbms_output.put_line('procedure_2.......');
    v_m := v_i + v_j;
    dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);
end;

存储过程案例三:带输入、输出参数的存储过程

存储过程的参数分为输入参数和输出参数,

输入参数:输入参数一般会在变量名和数据类型之间加in来表示该参数是输入参数

输出参数:输出参数一般会在变量名和数据类型之间加out来表示该变量是输出参数

不写in和out的话,默认为输入参数

create procedure procedure_3(v_i in number,v_j in number ,v_m out number)
is
begin
    dbms_output.put_line('procedure_3.......');
    v_m:=v_i - v_j;
    dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);
end;

PL/SQL块中调用存储过程

下面以调用上面三个存储过程为例

declare
    v_param1 number(5):=2;
    v_param2 number(5):=8;
    v_result number(5);
begin
    --调用上面案例一的存储过程
    procedure_1(); 
    --调用上面案例二的存储过程
    procedure_2(v_param1,v_param2); 
    --调用上面案例三的存储过程
    procedure_3(v_param1,v_param2,v_result);
    dbms_output.put_line(v_result);
end;

procedure_1.......
procedure_2.......
2 + 8 = 10
procedure_3.......
2 - 8 = -6
10

java调用存储过程

案例一:java调用没有返回值的存储过程

要求:编写一个像数据库emp表插入一条编号为6666,姓名为张三,职位为MANAGER的记录


create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )
is
begin
    insert into emp (empno,ename,job) values (v_empno,v_ename,v_job);
end;

//java调用存储过程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  //java调用存储过程
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger");
    cs=conn.prepareCall("{call procedure_4(?,?,?)}");
    //给输入参数赋值
    cs.setInt(1, 6666);
    cs.setString(2, "张三");
    cs.setString(3, "MANAGER");
    cs.execute();//执行
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//关闭资源
  }  
}
//执行后就会向数据库的emp表中插入一条编号为6666,姓名为张三,职位为MANAGER的记录

案例二:java调用返回单列单行的存储过程

要求:编写一个根据员工编号查找员工姓名的存储过程,并用java调用该存储过程


create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)
is
begin
    select ename into v_ename from emp where empno=v_empno;
end;

//java调用存储过程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_5(?,?)}");
    cs.setInt(1, 6666);//给输入参数赋值
    
    cs.reGISterOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.execute();//执行
    //获取输出参数的值,位置要和输出参数对应?的位置对应起来,该例输出参数对应第2个问号,而且输出参数的数据类型为字符型,所以是cs.getString(2)
    String a=cs.getString(2);
    System.out.println("员工姓名:"+a);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//关闭资源
  }  
}
 

结果:员工姓名:张三

案例三:java调用返回单行多列的存储过程

要求:编写一个根据员工编号查找员工姓名、职位和工资的存储过程,并用java调用该存储过程


create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)
is
begin
    select ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;
end;

//java调用存储过程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_6(?,?,?,?)}");
    cs.setInt(1, 7788);
    //指定输出参数的数据类型,注意:顺序要对应起来
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE);
    cs.execute();//执行
    //获取返回值
    String ename=cs.getString(2);//获取姓名
    String job=cs.getString(3);//获取职位
    double sal=cs.getDouble(4);//获取薪水
    System.out.println("员工编号为7788的姓名为:"+ename+" 职位是:"+job+" 薪水是:"+sal);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//关闭资源
  }
}

员工编号为7788的姓名为:SCOTT 职位是:ANALYST 薪水是:3000.0

案例四:java调用返回多行多列(返回列表)的存储过程

要求:编写一个根据部门编号查找部门所有员工信息的存储过程,并用java调用该存储过程


create package my_package as
type emp_cursor is ref cursor;
end my_package;

create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)
is
begin
    open emp_cursor for select * from emp where deptno=v_deptno;
end;
//java调用存储过程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_7(?,?)}");
    cs.setInt(1, 20);//给输入参数赋值
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//指定输出参数的数据类型
    cs.execute();
    rs=(ResultSet) cs.getObject(2);//获取输出参数的值
    while(rs.next()){
      //顺序为数据库中字段前后顺序,例如数据库emp表中第5列为hiredate,数据类型为Date,所以获取第5列值时就应该用rs.getDate(5)
      System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getDate(5));
    }
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//关闭资源
  }  
}


7369 SMITH 1980-12-17
7566 JONES 1981-04-02
7788 SCOTT 1987-04-19
7876 ADAMS 1987-05-23
7902 FORD 1981-12-03

这是上面java调用存储过程代码中关闭资源方法的代码

public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (sqlException e) {
        e.printStackTrace();
      }
    }
    if(cs!=null){
      try {
        cs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(conn!=null){
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

最后给个应用,分页的存储过程

分页存储过程:


create package page_package as
type page_cursor is ref cursor;
end page_package;

create procedure pro_paging (
    v_page_size in number,--每页显示多少条
    v_page_count out number,--总页数
    v_current_page in number,--当前页
    v_total_count out number,--记录总条数
    emp_cursor out page_package.page_cursor--返回查询结果集的游标
    )
is
    v_begin number(5):=v_page_size*(v_current_page-1)+1;--查询起始位置
    v_end number(5):=v_page_size*v_current_page;--查询结束位置
    v_sql varchar2(1000):='select empno,ename from
       (select a.empno,a.ename,rownum rn from 
           (select empno,ename from emp) a 
       where rownum<='|| v_end ||') b 
    where b.rn>='||v_begin;
    
    v_ename varchar2(10);
    v_empno number(4);
begin
    open emp_cursor for v_sql;
    loop
     fetch emp_cursor into v_empno,v_ename;
     exit when emp_cursor%notfound;
     dbms_output.put_line(v_empno||' '||v_ename);
    end loop;
    v_sql:='select count(empno) from emp';
    execute immediate v_sql into v_total_count;
    if(mod(v_total_count,v_page_size)=0) then
       v_page_count:=v_total_count/v_page_size;
    else
       v_page_count:=trunc(v_total_count/v_page_size)+1;
    end if;
    dbms_output.put_line('共 '||v_total_count||' 条记录');
    dbms_output.put_line('共 '||v_page_count||' 页');
    dbms_output.put_line('当前页: '||v_current_page);
    dbms_output.put_line('每页显示 '||v_page_size||' 条');
end;

Java调用的话和上面java调用存储过程的例子一样。这里为了方便 ,就直接在pl/sql中调用了


declare
   v_page_count number(5);
   v_cursor page_package.page_cursor;
   v_total_count number(5);
begin
   dbms_output.put_line('第一页数据。。。。。。。。。');
   pro_paging(5,--每页显示5条
   v_page_count,--总页数
   1,--当前页
   v_total_count,--记录总条数
   v_cursor--游标
   );
   dbms_output.put_line('--------------------------');
   dbms_output.put_line('第二页数据。。。。。。。。。');
   --显示第二页数据
   pro_paging(5,--每页显示5条
   v_page_count,--总页数
   2,--当前页
   v_total_count,--记录总条数
   v_cursor--游标
   );
end;

第一页数据。。。。。。。。。
6666 张三
20 empSu2
19 empSave2
7369 SMITH
7499 ALLEN
共 17 条记录
共 4 页
当前页: 1
每页显示 5 条
--------------------------
第二页数据。。。。。。。。。
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
共 17 条记录
共 4 页
当前页: 2
每页显示 5 条

关于怎么调用Oracle存储过程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么调用Oracle存储过程

本文链接: https://www.lsjlt.com/news/55235.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么调用Oracle存储过程
    这篇文章给大家介绍怎么调用Oracle存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Oracle的存储过程语法如下:create procedure 存储过...
    99+
    2024-04-02
  • oracle怎么调用存储过程
    要调用Oracle存储过程,可以按照以下步骤进行操作:1. 创建存储过程:在Oracle数据库中创建存储过程。可以使用PL/SQL开...
    99+
    2023-08-23
    oracle
  • PLSQL怎么调用Oracle存储过程
    在PL/SQL中调用Oracle存储过程可以通过使用以下语法: DECLARE <variable_declaration...
    99+
    2024-03-05
    PLSQL Oracle
  • mybatis怎么调用oracle存储过程
    在MyBatis中调用Oracle存储过程可以通过使用select或update语句执行存储过程的方式来实现。以下是一个示例: &l...
    99+
    2024-04-09
    mybatis oracle
  • shell怎么调用oracle的存储过程
    要在Shell中调用Oracle的存储过程,可以使用Oracle的命令行工具sqlplus。下面是一个示例代码:```shell#!...
    99+
    2023-09-14
    shell oracle
  • Mybatis中怎么调用Oracle存储过程
    Mybatis中怎么调用Oracle存储过程,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1:调用无参数的存储过程。创建存储过...
    99+
    2024-04-02
  • Oracle中怎么调用Java存储过程
    这期内容当中小编将会给大家带来有关Oracle中怎么调用Java存储过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、如何创建java存储过程?通常有三种方法来创建java存储过程。1. 使用orac...
    99+
    2023-06-17
  • oracle调用存储过程怎么实现
    要在Oracle数据库中调用存储过程,可以使用以下步骤: 编写存储过程:首先,在数据库中创建存储过程,可以使用PL/SQL语言编写...
    99+
    2024-03-05
    oracle
  • oracle如何调用存储过程
    要调用Oracle存储过程,可以按照以下步骤进行操作:1. 使用Oracle SQL Developer或其他数据库客户端连接到Or...
    99+
    2023-08-22
    oracle
  • db2怎么调用存储过程
    在DB2数据库中,可以使用以下步骤调用存储过程: 首先,使用CREATE PROCEDURE语句在数据库中创建存储过程。例如,创建...
    99+
    2024-04-09
    db2
  • hibernate怎么调用存储过程
    要在Hibernate中调用存储过程,您需要执行以下步骤: 创建一个实体类,该实体类映射存储过程的结果集。 在Hiberna...
    99+
    2024-04-09
    hibernate
  • sql怎么调用存储过程
    在SQL中调用存储过程可以通过以下步骤实现: 创建存储过程: 首先在数据库中创建存储过程,可以使用CREATE PROCEDURE...
    99+
    2024-04-02
  • 用java调用oracle存储过程总结
    本篇内容主要讲解“用java调用oracle存储过程总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“用java调用oracle存储过程总结”吧!用java调用oracle存储过程总结//1、c...
    99+
    2023-06-03
  • Java中怎么调用存储过程
    Java中怎么调用存储过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。存储过程是指保存在数据库并在数据库端执行的程序。你可以使用特殊的语法在Java类中调用存储过程。在调...
    99+
    2023-06-17
  • LINQ中怎么调用存储过程
    这篇文章给大家介绍LINQ中怎么调用存储过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。LINQ调用存储过程实现起来一点都不容易,就像其它的存储过程一样,需要很强的逻辑性与实用性。LINQ调用存储过程时出现的问题被c...
    99+
    2023-06-17
  • Oracle如何调试存储过程
    这篇文章主要介绍Oracle如何调试存储过程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一 调试关键步骤1、在要调试的存储过程右键,选择编辑以进行调试,截图如下: 2、点...
    99+
    2024-04-02
  • Oracle的存储过程怎么利用Mybatis进行调用
    Oracle的存储过程怎么利用Mybatis进行调用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1:调用无参数的存储过程。创建存储过程:Mapper.xml 配置:经测试...
    99+
    2023-05-31
    mybatis oracle
  • MySQL的存储过程怎么调用
    这篇文章主要讲解了“MySQL的存储过程怎么调用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL的存储过程怎么调用”吧!概述由MySQL5.0 版本开始支持存储过程。如果在实现用户的...
    99+
    2023-07-02
  • java中如何调用ORACLE存储过程
    小编给大家分享一下java中如何调用ORACLE存储过程,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:无返回值的存储过程存储过程为:CREATE OR REP...
    99+
    2023-06-03
  • plsql中如何调用oracle存储过程
    在PL/SQL中调用Oracle存储过程可以通过以下步骤实现: 使用EXECUTE或CALL语句来调用存储过程。 通过DBMS_O...
    99+
    2024-04-09
    plsql oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作