简体   繁体   English

在Java程序中调用Java存储过程

[英]Java stored procedure calling in java program

What I should do is to create a Java stored procedure and later call it from Java program. 我应该做的是创建一个Java存储过程,然后再从Java程序中调用它。

I am having problems executing the JAVA program - JDBCPiemers (below) with 1 parameter (I need to get out the String Nosaukums). 我在执行JAVA程序时遇到问题-带有1个参数的JDBCPiemers(如下)(我需要弄清楚String Nosaukums)。 Error: "Invalid column name". 错误:“无效的列名”。

Calling out the procedure in ORACLE works fine. 调用ORACLE中的过程可以正常工作。

This is my stored procedure which I have loaded in database. 这是我已存储在数据库中的存储过程。

import java.sql.*;
import java.io.*;

public class BeerBeer {

  public static void getBreweryInfo (int Raz_ID) 
    throws SQLException 
    { String sql = 
      "SELECT Nosaukums FROM Alus_razotaji WHERE ID = ?";//vaicajums
    try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); // Izveidojam savienojumu ar datubāzi
      PreparedStatement apstmt = conn.prepareStatement(sql);
      apstmt.setInt(1, Raz_ID); 
      ResultSet rset = apstmt.executeQuery();// SQL vaicājuma izpildīšana

      rset.close();
      apstmt.close(); //Savienojuma aizvēršana
      } 
    catch (SQLException e) {System.err.println(e.getMessage()); //Kļūdu izvadīsana
    }  
  }
}

I have created a following package with oracle. 我用oracle创建了以下软件包。

CREATE OR REPLACE PACKAGE BeerBeer AS
PROCEDURE getBreweryInfo(Raz_ID number);
END BeerBeer;

CREATE OR REPLACE PACKAGE BODY BeerBeer AS
PROCEDURE getBreweryInfo(Raz_ID number) AS Language Java
NAME 'BeerBeer.getBreweryInfo(int)';
END BeerBeer;

This is my Java program in which I call out the procedure. 这是我在其中调用该过程的Java程序。 However I cannot get it working. 但是我无法使它工作。 I am getting error: "Invalid column index" 我收到错误消息:“无效的列索引”

package client;

import java.sql.*;

public class JDBCPiemers {
    // Norādam URL draiverim un datu bāzei
    static final String JDBC_DRIVER = "oracle.jdbc.OracleDriver";
    static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
    // Izveidojam norādi uz datu bāzes lietotājvārdu un paroli
    static final String USER = "SYSTEM";
    static final String PASS = "asdasd";
    private String sql;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn = null;
        CallableStatement stmt = null;
        try {
            //Reģistrējam JDBC draiveri
            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("Izveidojam savienojumu ar datubazi ...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            // Vaicājuma izveide
            System.out.println("Komandas veidosana...");
            String SQL = "{CALL BeerBeer.getBreweryInfo (?)}";
            stmt = conn.prepareCall(SQL);
            int Raz_ID = 4;
            stmt.setInt(1, Raz_ID);
            stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
            System.out.println("Izpildam JAVA glabajamo proceduru ...");
            // Vaicājuma izpilde
            stmt.execute();
            //Izgustam Alus_razotaja nosaukumu ar getXXX metodi.
            String Razotajs = stmt.getString(2);
            System.out.println("Izvadam rezultatus ...");
            System.out.println("Identifikatoram NR. " +Raz_ID + " atbilst Alus_Razotajs ar nosaukumu  '" + Razotajs + "'" );            
            stmt.close();
            conn.close(); }
            catch(SQLException se) {
                //Kludu apstrade JDBC
                se.printStackTrace(); }
            catch(Exception e) {
                //Kludu apstrade klasei Class.forName
                e.printStackTrace(); }
            finally {
                // Bloks, lai aizvērtu resursus
                try {if(stmt!=null)
                stmt.close(); }
            catch(SQLException se2) {} 
                try {if(conn!=null)
                conn.close(); }
                catch(SQLException se) {se.printStackTrace(); }
                //finally bloka beigas
            } // try 
            System.out.println("Darbu beidzam."); }}
            CallableStatement stmt = null;
            String sql = "{call movecartrecord(?)}";
            try 
            {
                stmt = conn.prepareCall(sql);
                stmt.setInt(1, order_id); //you can pass argument if procedure accepts
                stmt.execute();
                stmt.close();

                String name = stmt.getString(1);
                System.out.println("Name : " + name);
            } 
            catch (SQLException e)
            {               
                e.printStackTrace();
            }

Here movecartrecord() is a stored procedure name and conn is a connection object. 这里movecartrecord()是存储过程的名称,conn是连接对象。

Here order_id passes as argument. 在这里,order_id作为参数传递。 If your stored procedure don't have any argument then just leave that line code. 如果您的存储过程没有任何参数,则只需保留该行代码。

Hope it will work and help you. 希望它能对您有所帮助。

Here is a wonderful code that show you how to perform it. 这是一个很棒的代码 ,向您展示如何执行它。

To return a value you need it to be a function, not a procedure: 要返回一个值,您需要它是一个函数,而不是过程:

  public static String getBreweryInfo (int Raz_ID) 
  throws SQLException 
  { 
    String sql = 
      "SELECT Nosaukums FROM Alus_razotaji WHERE ID = ?";//vaicajums
    try {
      Connection conn = DriverManager.getConnection("jdbc:default:connection:");
      PreparedStatement apstmt = conn.prepareStatement(sql);
      apstmt.setInt(1, Raz_ID); 
      ResultSet rset = apstmt.executeQuery();// SQL vaicājuma izpildīšana

      if (rset.next()) {
          return rset.getString(1);
      } 
    }
    catch (SQLException e) {
      System.err.println(e.getMessage()); //Kļūdu izvadīsana
    } 
    finally {
      rset.close();
      apstmt.close(); //Savienojuma aizvēršana
    } 
  }

Then your package becomes: 然后您的包裹变成:

CREATE OR REPLACE PACKAGE BODY BeerBeer AS
  FUNCTION getBreweryInfo(Raz_ID number) RETURN varchar2 AS Language Java
  NAME 'BeerBeer.getBreweryInfo(int) return java.lang.String';
END BeerBeer;

And you call it something like: 您将其称为:

        String SQL = "{CALL ? = BeerBeer.getBreweryInfo (?)}";
        stmt = conn.prepareCall(SQL);
        int Raz_ID = 4;
        stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
        stmt.setInt(2, Raz_ID);
        System.out.println("Izpildam JAVA glabajamo proceduru ...");
        // Vaicājuma izpilde
        stmt.execute();
        //Izgustam Alus_razotaja nosaukumu ar getXXX metodi.
        String Razotajs = stmt.getString(1);

Note that the out parameter is now index 1 as it's the return from the function, so the value you pass in is now index 2. All untested of course... 请注意,out参数现在是索引1,因为它是从函数返回的值,因此您传入的值现在是索引2。当然,所有这些未经测试...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM