`
zhongzhihua
  • 浏览: 313801 次
  • 来自: ...
社区版块
存档分类
最新评论

oracle的存储过程和函数以及java如何调用oracle的存储过程和函数

    博客分类:
  • java
阅读更多

过程和函数
 a.将过程的执行权限授予其他用户:GRANT EXECUTE ON find_emp TO MARTIN;
 b.删除过程:DROP PROCEDURE find_emp
 c.函数的调用:SELECT fun_hello FROM DUAL;
  d.查看所有的过程:select object_name,created,status from user_objects
                             where object_type in ('PROCEDURE','FUNCTION')
  e.查看过程源码  select text from user_source where name='procedure_name';

1.在命令窗口中调用有一个in参数,一个out参数的存储过程
    CREATE OR REPLACE PROCEDURE FIND_EMP(AID in CHAR,res out varchar2)
   AS
   ENAME DEPTO.NAME%TYPE;
   BEGIN
   SELECT NAME INTO ENAME from bankaccount  WHERE ID=AID;
   res:='姓名是:'||ename;
   EXCEPTION
   WHEN NO_DATA_FOUND THEN
   res:='not found';
   END FIND_EMP;
  调用:
   VAR SSS VARCHAR2;
      EXECUTE FIND_EMP('1111',:SSS);
   用java调用:
   import java.sql.CallableStatement;
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.ResultSet;
   import java.sql.Types;
   
    public class Sub
   {  
    static Connection co=null;
    public static Connection connection()
    {
     try
     {
     Class.forName("oracle.jdbc.driver.OracleDriver");
     co=DriverManager.getConnection
                   ("jdbc:oracle:thin:@192.168.0.111:1521:emp","scott","admin");
     }catch(Exception e)
     {
      System.out.println(e);
     }
     return co;
    }
    public void query() throws Exception
    {
       Connection conn=connection();
       CallableStatement c=conn.prepareCall("{call FIND_EMP(?,?)}");
       c.registerOutParameter(2,Types.VARCHAR);
       c.setString(1,"11111");
       c.execute();
       String bal=c.getString(2);
       System.out.println(bal);  
       conn.close();
    }
    public static void main(String args[]) throws Exception
    {
     Sub f=new Sub();
     f.query();
    }
   }
 2.在java中调用pl/sql函数例子
     函数:
       CREATE OR REPLACE FUNCTION query3(id1 in char) RETURN VARCHAR2
            AS BAL VARCHAR2(20);
            A_ID CHAR(5);
            BEGIN
            SELECT BALANCE INTO  A_ID FROM BANKACCOUNT where ID=id1;
            BAL:='您的余额为'||A_ID;
             RETURN BAL;
            END query3;
     调用:
     import java.sql.CallableStatement;
     import java.sql.Connection;
     import java.sql.DriverManager;
     import java.sql.ResultSet;
     import java.sql.Types;
     
      class Function
     {  
      static Connection co=null;
      public static Connection connection()
      {
       try
       {
       Class.forName("oracle.jdbc.driver.OracleDriver");
       co=DriverManager.getConnection
                     ("jdbc:oracle:thin:@192.168.0.111:1521:emp","scott","admin");
       }catch(Exception e)
       {
        System.out.println(e);
       }
       return co;
      }
      public void query() throws Exception
      {
         Connection conn=connection();
         CallableStatement c=conn.prepareCall("{? = call QUERY3(?)}");
         c.registerOutParameter(1,Types.VARCHAR);
         c.setString(2,"11111");
         c.execute();
         String bal=c.getString(1);
         System.out.println(bal);  
         conn.close();
      }
      public static void main(String args[]) throws Exception
      {
       Function f=new Function();
       f.query();
      }
     }
3.调用一个in参数,一个out参数的另一种方法
      CREATE OR REPLACE PROCEDURE TEST(VAL1 IN VARCHAR2,VAL2 OUT NUMBER) IS
   IDD NUMBER;
   BEGIN
   SELECT ID INTO IDD FROM DEPTO WHERE ADDRESS=VAL1;
   IF SQL%FOUND THEN
   VAL2:=300;
   END IF;
   END;
    调用:
   DECLARE
   VA1 DEPTO.ADDRESS%TYPE:='dalu';
   VA2 NUMBER;
   BEGIN
   TEST(VA1,VA2);
   DBMS_OUTPUT.PUT_LINE(VA2);
   END;
4.利用函数/过程返回结果集.
     利用函数:
         定义包:create or replace package pkg_resultset
        as
        type yourtype is ref cursor;
        function operation_resultset(phonenumber varchar2) return yourtype;
        end pkg_resultset;
     定义包体:
            create or replace package  body pkg_resultset
        as
        function operation_resultset(phonenumber varchar2) return yourtype
        is
        yourcur yourtype;
        begin
        open yourcur for SELECT a.operation_name, c.charge_kind, c.charge FROM
           t_phone_operation a,t_phone_operation_charge b, t_cost c
         where a.operation_id=b.operation_id and b.phone_num=phonenumber and
               b.operation_id=c.operation_id;
        return yourcur;
        end operation_resultset;
        end pkg_resultset;
    在java中调用:
          String phoneNum = querybuniessForm.getPhonenumber();
       Connection conn=ConnectDataBase.connection();
       ActionForward mg=null;
       CallableStatement cs=null;
       try
       {
       cs=conn.prepareCall("{call queryphonenumber(?,?)}");
       cs.registerOutParameter(2,Types.VARCHAR);
       cs.setString(1,phoneNum);
       cs.execute();
       String res=cs.getString(2);
       ActionErrors errors=new ActionErrors();
       cs.close();
       ResultSet rs=null;
       if(res.equals("无此手机号"))
       {
        errors.add("notfoundnumber",new ActionError("notfoundnumber"));
           this.saveErrors(request,errors);
        mg=mapping.getInputForward();
           
       }else
       { errors.add("foundnumber",new ActionError("foundnumber"));
           this.saveErrors(request,errors);
        mg=mapping.getInputForward();
        CallableStatement cs2=null;
        cs2=conn.prepareCall("{?=call pkg_resultset.operation_resultset(?)}");
        cs2.registerOutParameter(1,OracleTypes.CURSOR);
        cs2.setString(2,phoneNum);
        cs2.execute();
        rs = ((OracleCallableStatement)cs2).getCursor(1);
        while(rs.next())
        {
         System.out.print(rs.getString(1)+" ");//输出第一个字段
         System.out.print(rs.getString(2)+" ");//输入第二个字段
         System.out.print(rs.getString(3)+" ");
         
         
        }........
    利用过程:
          定义包:
              create or replace package pkg_resultset
        as
        type yourtype is ref cursor;
        function operation_resultset(phonenumber varchar2) return yourtype;
        end pkg_resultset;
      定义包体:
          create or replace package body wyj
        as
        PROCEDURE   wyj1(phoneNum in varchar2,res   OUT  res1)
        is
        BEGIN
         OPEN res FOR
         SELECT a.operation_name, c.charge_kind, c.charge FROM
          t_phone_operation a,t_phone_operation_charge b, t_cost c
         where a.operation_id=b.operation_id and b.phone_num=phoneNum and
               b.operation_id=c.operation_id;
        END wyj1;
        end wyj;
    在java中调用:同上....
5.在java中调用存储过程返回结果集,并在jsp页面中显示出结果的方法.(以struts工程为例)
   主要思路:在包内定义一个funcion或procudure,返回类型为游标,然后在java中得到结果集并遍历他们
   以得到其中字段的结果,把他们放到一个bean中,并把bean放到ArrayList对象中,最后在jsp页面中用struts
   标签得到结果.
    在oracle中定义上述4中的包和包体,"pkg_resultset",在Action这样使用:
       ......
      errors.add("foundnumber",new ActionError("foundnumber"));
    this.saveErrors(request,errors);
   mg=mapping.getInputForward();
   CallableStatement cs2=null;
   cs2=conn.prepareCall("{?=call pkg_resultset.operation_resultset(?)}");
   cs2.registerOutParameter(1,OracleTypes.CURSOR);
   cs2.setString(2,phoneNum);
   cs2.execute();
   rs = ((OracleCallableStatement)cs2).getCursor(1);
   ArrayList list = new ArrayList();
   while(rs.next())
   { 
    String operationName = rs.getString(1);
    String operationType = rs.getString(2);
    String operationCharge = rs.getString(3);
    System.out.println(operationName);
    System.out.println(operationType);
    System.out.println(operationCharge);
    GetResultList resultList=new GetResultList    //见下面的bean类
           (operationName,operationType,operationCharge);  
      list.add(resultList);
   }
    request.setAttribute("GetResultLists",list);
    //下面是一个bean类
   package com.penguin.bean;
   public class GetResultList
   {
    private String operationName;
    private String operationType;
    private String operationCharge;
    
    public  GetResultList(String operationName,String operationType,String operationCharge)
    {
     this.operationCharge=operationCharge;
     this.operationName=operationName;
     this.operationType=operationType;
    }
    public String getOperationCharge() {
     return operationCharge;
    }
    public void setOperationCharge(String operationCharge) {
     this.operationCharge = operationCharge;
    }
    public String getOperationName() {
     return operationName;
    }
    public void setOperationName(String operationName) {
     this.operationName = operationName;
    }
    public String getOperationType() {
     return operationType;
    }
    public void setOperationType(String operationType) {
     this.operationType = operationType;
    }
   }
   然后在jsp页面中用标签:
     
   <%@ page language="java" pageEncoding="UTF-8"%>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean " prefix="bean" %>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-html " prefix="html" %>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic " prefix="logic" %>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles " prefix="tiles" %>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-template " prefix="template" %>
   <%@ taglib uri="http://jakarta.apache.org/struts/tags-nested " prefix="nested" %>
   
   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
   <html:html locale="true">
     <head>
       <html:base />
      
       <title>query.jsp</title>
      
       <meta http-equiv="pragma" content="no-cache">
       <meta http-equiv="cache-control" content="no-cache">
       <meta http-equiv="expires" content="0">   
       <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
       <meta http-equiv="description" content="This is my page">
     </head>
    
     <body>
       <html:form action="querybuniess.do" method="post" focus="login">
         <table >
           <tr>
             <td>phone number:</td>
             <td><html:text property="phonenumber" /></td>
             <td><html:submit value="搜索" /></td>
             <td><font color="red"><html:errors property="phonenumbererr"/></font></td>
             <td><font color="red"><html:errors property="notfoundnumber"/></font></td>
             <td><FONT color="red"><html:errors property="foundnumber"/></FONT></td>
           </tr>
           </table>
          <br>
          <br>
        <logic:present name="GetResultLists" scope="request">
        <table cellspacing="1" border="1" width="500" >
      <tr>
       <th align="center" >栏目名</th>
       <th align="center" >资费类型</th>
       <th align="center" >金额</th>
       </tr>
       <logic:iterate id="GetResultList" name="GetResultLists">
        <logic:present name="GetResultList">
       <tr>
         <td align="center" ><bean:write name="GetResultList" property="operationName"/></td>
         <td align="center" ><bean:write name="GetResultList" property="operationType"/></td>
         <td align="center" ><bean:write name="GetResultList" property="operationCharge"/></td>
      </tr>
       </logic:present>
      </logic:iterate>
     </logic:present>
         </table>
       </html:form>
     </body>
   </html:html>

分享到:
评论

相关推荐

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

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

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

    存储过程是一组预编译的SQL语句和PL/SQL代码,存储在数据库服务器上,可以按需调用。存储过程的优点包括提高性能、减少网络流量、增强安全性以及实现模块化编程。 1. **创建存储过程**:使用`CREATE PROCEDURE`语句...

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

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

    java调用oracle存储过程返回结果集,Record,cursor参照.pdf

    本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括创建Type、PACKAGE和PROCEDURE,Java代码中调用存储过程,并获取结果集。这些知识点对深入了解Oracle存储过程和Java调用Oracle存储过程...

    Java调用Oracle的过程和函数

    为了更好地管理和处理数据,通常需要在Java程序中调用Oracle数据库中的存储过程或函数。本文将详细介绍如何通过Java来调用Oracle数据库中的函数,并特别关注带有不同类型的输入(in)、输出(out)及输入输出(in/...

    Oracle存储过程、函数和包

    - **复用性**:存储过程和函数可以被多个应用程序或存储过程调用,从而提高代码的复用性和维护性。 #### 2. 存储过程的优点 - **远程访问**:由于存储过程驻留在数据库服务器上,因此可以从任何客户端进行访问。 - ...

    oracle 存储过程 函数 dblink

    本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...

    hibernate query调用oracle存储过程

    本篇文章将深入探讨如何使用Hibernate的Query接口来调用Oracle的存储过程和函数,以及提供相关的示例代码和数据库文件。 首先,让我们了解什么是存储过程和函数。存储过程是预编译的SQL语句集合,可以接受参数、...

    Oracle存储过程调用bat批处理脚本程序

    首先,`Oracle存储过程`是一种预编译的SQL和PL/SQL代码集合,可以被多次调用以执行特定的任务。它们提高了性能,降低了网络流量,并简化了数据库管理。在存储过程中调用外部脚本可以扩展Oracle的功能,比如自动化...

    oracle函数调用存储过程

    ### Oracle函数调用存储过程详解 #### 背景与目的 在开发Oracle应用程序时,经常需要使用到存储过程和函数。这两种类型的数据库对象各有优势,可以满足不同的业务需求。有时候,为了更好地组织代码和提高复用性,...

    JAVA 与ORACLE 存储过程及函数

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

    oracle存储过程和函数PPT

    在Oracle数据库开发中,存储过程和函数以及PL/SQL语言是至关重要的组成部分。这篇内容将深入解析这些核心概念。 首先,我们来谈谈“存储过程”。存储过程是一组预编译的SQL语句,可以在数据库中保存并重复调用,以...

    delphi调用Oracle的存储过程

    ### Delphi调用Oracle的...总结来说,本文详细介绍了如何在Delphi中调用Oracle的存储过程,包括存储过程的创建、Delphi环境的配置以及具体的代码实现。这为开发者提供了一个实用的例子,以便更好地理解和掌握这一技术。

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

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

    oracle存储过程函数生成DEMO

    在这个"Oracle存储过程函数生成DEMO"中,我们主要关注如何在Oracle数据库环境中设计、编写、测试以及调用存储过程和函数。下面将详细阐述相关知识点。 1. **存储过程**: - 存储过程是一组预先编译的SQL语句,存储...

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

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

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

    在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作数据库数据。 ##### 1.1 存储过程 存储过程是一组预先编译...

    java调用Oracle存储过程

    在Java中调用存储过程主要通过`CallableStatement`接口实现,它是`PreparedStatement`的子接口,专用于调用存储过程和函数。 以下是一个基本的步骤来调用Oracle存储过程: 1. **建立数据库连接**: 使用`...

Global site tag (gtag.js) - Google Analytics