来自PL / SQL过程的Java类文件
我有一个下面的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());
}
}
}
我究竟做错了什么? 有人能帮助我做到这一点吗? 谢谢
已经在这个链接上展示了如何正确使用PreparedStatements。
你会发现参数应该是?
不是Dog_ID
尝试
SELECT Name FROM Dog_family WHERE ID = ?
它还会告诉你如何迭代你的resultSet
那么,你没有告诉我们问题是什么,但我立即看到了几个问题:
你的select语句不应该有一个INTO子句。 这是一个PL / SQL构造。 您需要将查询结果作为结果集返回。
您的输入参数Dog_ID将不会被使用,因为您没有在SQL语句中正确命名该参数。
所以,把你的SQL语句改成这样的东西(因为你使用的是位置参数而不是命名参数):
"SELECT Dog_name FROM Dog_family WHERE ID = ?"
你应该阅读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。 您无法将字符串作为参数传递并更新其值。 字符串在Java中是不可变的。
还有一件事 - 行apstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
不需要。 registerOutParameter
仅用于CallableStatement
,它是用来执行存储过程的语句。
上一篇: Java class file from PL/SQL procedure
下一篇: SWIG, can I assign a value to a char** passed from Java to C