Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL过程中的Java类文件_Java_Oracle - Fatal编程技术网

PL/SQL过程中的Java类文件

PL/SQL过程中的Java类文件,java,oracle,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.*; p

我有一个以下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());
    }
  }
}

我做错了什么?有人能帮我把它修好吗?谢谢

您也应该阅读有关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;
最后,函数应该返回一个字符串。不能将字符串作为参数传递并更新其值。字符串在Java中是不可变的

还有一件事——行apstmt.registerOutParameter2,java.sql.Types.VARCHAR;这是不需要的。registerOutParameter仅与CallableStatement一起使用,CallableStatement是用于执行存储过程的语句

让我们看看如何正确使用PreparedStatements

您会发现参数应该是?不是狗的身份证

试一试


它还将向您展示如何迭代您的结果集。好吧,您没有告诉我们问题是什么,但我马上就看到了几个问题:

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

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

Java字符串参数不能在方法中更新,我 我假设这就是你正在尝试的。你要么需要 从方法返回字符串值,或使用StringBuilder 引用或其他要传递的容器。看见 没有要注册的out参数。仔细阅读结果集 因此,将SQL语句更改为如下内容,因为您使用的是位置参数而不是命名参数:

"SELECT Dog_name FROM Dog_family WHERE ID = ?"
"SELECT Dog_name FROM Dog_family WHERE ID = ?"