我有以下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());
}
}
}
我做错了什么?有人可以帮我搞定吗?感谢
答案 0 :(得分:0)
您应该阅读有关JDBC(以及一般的Java)的内容。
查询应为:
SELECT Name
FROM Dog_family
WHERE ID = ?
(假设Name
是您从表格中选择的列名称 - 不清楚Name
或Dog_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)
好吧,你没有告诉我们问题是什么,但我马上就看到了几个问题: