来自PL / SQL过程的Java类文件

时间:2013-12-13 02:25:31

标签: java oracle

我有以下PL / SQL程序:

CREATE OR REPLACE PROCEDURE getDogInfo
(Dog_ID IN NUMBER, Dog_name OUT VARCHAR) AS
BEGIN
  SELECT Dog_name INTO Name
  FROM Dog_family
  WHERE ID = Dog_ID;
END;

我需要创建一个执行相同操作的java类文件。我一直在尝试这样:

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

public class Procedure {

  public static void getDogInfo (int Dog_ID, String Dog_name)
    throws SQLException
    { String sql =
      "SELECT Dog_name INTO Name FROM Dog_family WHERE ID = Dog_ID";
    try { Connection conn = DriverManager.getConnection("jdbc:default:connection:");
      PreparedStatement apstmt = conn.prepareStatement(sql);
      apstmt.setInt(1, Dog_ID);
      apstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
      ResultSet rset = apstmt.executeQuery();
      rset.close();
      apstmt.close(); //Connection close
      }
    catch (SQLException e) {System.err.println(e.getMessage());
    }
  }
}

我做错了什么?有人可以帮我搞定吗?感谢

3 个答案:

答案 0 :(得分:0)

您应该阅读有关JDBC(以及一般的Java)的内容。

查询应为:

SELECT Name 
FROM Dog_family 
WHERE ID = ?

(假设Name是您从表格中选择的列名称 - 不清楚NameDog_name是否为列名称。

然后在执行查询并获得结果集后:

String name = null;

if (rset.next()) {
  name = rset.getInt (1);
}
...
return name;

最后,你的函数应该返回一个String。您不能将String作为参数传递并更新其值。 String在Java中是不可变的。

还有一件事 - 不需要行apstmt.registerOutParameter(2, java.sql.Types.VARCHAR);registerOutParameter仅与CallableStatement一起使用,{{1}}是用于执行存储过程的语句。

答案 1 :(得分:0)

已经知道了如何正确使用PreparedStatements的link

您会发现参数应为?而不是Dog_ID

尝试

SELECT Name FROM Dog_family WHERE ID = ?

它还将向您展示如何遍历您的resultSet

答案 2 :(得分:0)

好吧,你没有告诉我们问题是什么,但我马上就看到了几个问题:

  1. 您的select语句不应包含INTO子句。这是一个PL / SQL构造。你需要 将查询结果作为结果集返回。

  2. 您的输入参数Dog_ID将不会被使用,因为您没有     在SQL语句中正确命名参数。

  3. Java字符串参数无法在方法中更新,我 我假设你正在尝试。你要么需要 从方法返回一个字符串值,或使用StringBuilder 引用或其他一些传入的容器。请参阅this link 注册没有“out”参数。阅读结果集here
  4. 因此,将您的SQL语句更改为类似的内容(因为您使用的是位置参数而不是命名参数):

    "SELECT Dog_name FROM Dog_family WHERE ID = ?"