What I should do is to create a Java stored procedure and later call it from Java program.
I am having problems executing the JAVA program - JDBCPiemers (below) with 1 parameter (I need to get out the String Nosaukums). Error: "Invalid column name".
Calling out the procedure in ORACLE works fine.
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.
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. 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.
Here order_id passes as argument. 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...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.