[英]Java stored procedure calling in java program
我應該做的是創建一個Java存儲過程,然后再從Java程序中調用它。
我在執行JAVA程序時遇到問題-帶有1個參數的JDBCPiemers(如下)(我需要弄清楚String Nosaukums)。 錯誤:“無效的列名”。
調用ORACLE中的過程可以正常工作。
這是我已存儲在數據庫中的存儲過程。
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
}
}
}
我用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;
這是我在其中調用該過程的Java程序。 但是我無法使它工作。 我收到錯誤消息:“無效的列索引”
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();
}
這里movecartrecord()是存儲過程的名稱,conn是連接對象。
在這里,order_id作為參數傳遞。 如果您的存儲過程沒有任何參數,則只需保留該行代碼。
希望它能對您有所幫助。
這是一個很棒的代碼 ,向您展示如何執行它。
要返回一個值,您需要它是一個函數,而不是過程:
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
}
}
然后您的包裹變成:
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;
您將其稱為:
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);
請注意,out參數現在是索引1,因為它是從函數返回的值,因此您傳入的值現在是索引2。當然,所有這些未經測試...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.