【发布时间】:2013-12-13 09:02:13
【问题描述】:
我应该做的是创建一个 Java 存储过程,然后从 Java 程序中调用它。
我在执行 JAVA 程序时遇到问题 - 带有 1 个参数的 JDBCPiemers(下)(我需要取出字符串 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."); }}
【问题讨论】:
-
注意。它的拼写不是“java”或“JAVA”而是“Java”。
-
@peter.petrov 该标签的存在,有 4 个关注者,表明并非如此。
-
当外部程序可以直接通过 JDBC 执行查询时,拥有一个仅执行
select并从外部 Java 程序调用它的 Java 存储过程有什么意义?无论如何,尽管有“存储过程”名称,Java 方法也可以是一个函数——您已经在尝试return一个值,这应该是一个线索。它应该是一个带有一个参数的函数,int,它返回一个String。 -
是学校作业,需要使用JAVA存储过程。
-
@AlexPoole 我已经使用 1 个参数更新了代码。但是,我现在遇到问题要让它与我的程序一起使用。
标签: java oracle stored-procedures