通过java执行pl sql块时出现的问题

通过java执行pl sql块时出现的问题,java,oracle,jdbc,plsql,Java,Oracle,Jdbc,Plsql,我已经用java编写了以下代码 package demo; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class Sample { private Connection c = null; public Sam

我已经用java编写了以下代码

package demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

public class Sample {

    private Connection c = null;

    public Sample()
    {
        try {
            c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "jboss");
            String plsql = ""+
            "declare"+
                    "x number;"+
            "begin "+
                    "select HEADCOUNT  FROM PROJECT where deptid=1;"+
            "end;";
            CallableStatement cs = c.prepareCall(plsql);
            //cs.registerOutParameter(0, Types.INTEGER);

            cs.execute();
            System.out.println("Result is "+cs.getInt(1));
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) 
    {
        Sample z = new Sample();
    }
}
我只想探索通过java执行plsql块的机制。 上面的一个只是简单的查询。 在执行上述java代码时,我得到的错误如下

java.sql.SQLException: Invalid SQL type: sqlKind = UNINITIALIZED
    at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:75)
    at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714)
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378)
    at demo.Sample.<init>(Sample.java:26)
    at demo.Sample.main(Sample.java:36)
java.sql.SQLException:无效的sql类型:sqlKind=UNINITIALIZED
位于oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:75)
位于oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1043)
在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
位于oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
位于oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3714)
在oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4755)中
位于oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1378)
在demo.Sample.(Sample.java:26)
位于demo.Sample.main(Sample.java:36)
在执行此类pl/sql块之前,请告诉我是否需要任何事先设置。

1)第一个问题是其他答案中提到的
declarex…

2) 第二个问题是
从deptid=1的项目中选择人员编制在plsql中,此查询无效。应
选择编制到x…
一些错误:

  • 字符串将连接到
    declarex
    ,您需要在它们之间留一个空格
  • 您没有将表
    中的值选择到PL/SQL变量中
  • PL/SQL块没有将值放入绑定变量以将其返回Java(如果直接使用绑定变量,则不需要在PL/SQL中声明单独的变量)
  • 您已经注释掉了要注册输出参数的行,并且这些参数是1索引的(不是0索引的)
  • 大概是这样的:

    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Types;
    
    public class Sample {
      public static void main( final String[] args ) 
      {
        try {
          Class.forName( "oracle.jdbc.OracleDriver" ); // If you are using the Oracle driver.
    
          Connection con = DriverManager.getConnection(
            "jdbc:oracle:thin:@localhost:1521:XE",
            "username",
            "password"
          );
    
          CallableStatement cs = con.prepareCall(
            "BEGIN SELECT HEADCOUNT INTO :1 FROM PROJECT WHERE deptid=1; END;"
          );
          cs.registerOutParameter( 1, Types.NUMERIC );
          cs.execute();
          System.out.println( cs.getInt( 1 ) );
        }
        catch ( ClassNotFoundException | SQLException ex )
        {
          System.err.println( ex.getMessage() );
        }
      }
    }
    

    在字符串中提供适当的空格以形成
    SQL
    查询。这就是在使用必要的空格进行更改后的外观

    String plsql = "declare x number; "+
                    "begin "+
                       "select HEADCOUNT  FROM PROJECT where deptid=1; "+
                    "end;";
    
    您需要用正确的空格更正代码,否则您想要传递的
    SQL
    将在
    Java
    /
    JDBC
    代码中出错

    您可以将
    PL/SQL
    代码更改为以下内容:

    CallableStatement cs = con.prepareCall(
        "BEGIN SELECT HEADCOUNT INTO :1 FROM PROJECT WHERE deptid=1; END;"
    );
    
    希望这能很好地回答你的问题

    您认为
    “declare”+“x
    能给您带来什么?另请参见