【问题标题】:I am trying to call a db2 procedure but I am runtime error com.ibm.db2.jcc.am.SqlSyntaxErrorException我正在尝试调用 db2 过程,但出现运行时错误 com.ibm.db2.jcc.am.SqlSyntaxErrorException
【发布时间】:2019-08-20 06:43:46
【问题描述】:

我正在调用 db2 过程,但出现运行时错误 `

“com.ibm.db2.jcc.am.SqlSyntaxErrorException”

`。此运行时错误表示存在语法错误,但我无法弄清楚我的代码到底出了什么问题。有人可以帮帮我吗?

public String  getReferenceno(String Product_Code) throws SQLException
{

    String reference_no=null;
    CallableStatement callableStatement;
    try {
        System.out.println(Product_Code);

     //callableStatement = connection_new().prepareCall("CALL IPS_DB.GET_SEQUENCE_NUMBER(?,?)");
    callableStatement = connection_new().prepareCall("{Call IPS_DB.GET_SEQUENCE_NUMBER(?,?)}");


    callableStatement.setString(1, Product_Code);

    callableStatement.registerOutParameter(2, Types.VARCHAR);

    callableStatement.execute();

    //reference_no = (String) callableStatement.getString(2);

    connection_new().close();


    } catch (SQLException e) {

        e.printStackTrace();
         return "error";
    }


    return reference_no ;
  }

【问题讨论】:

  • 信息不足。编辑您的问题以添加 jdbc 完整异常文本堆栈跟踪(显示 jdbc 类型的驱动程序版本和 Db2 驱动程序引发的错误的详细信息),添加环境详细信息(客户端和服务器的操作系统、软件版本等)。
  • 您是否在准备或执行时遇到异常?当您通过其他方式调用您的程序时会发生什么,例如使用命令行处理器?
  • 我在 callableStatement.execute() @mustaccio 遇到异常

标签: hibernate db2


【解决方案1】:

我认为查看IPS_DB.GET_SEQUENCE_NUMBER 过程的定义和返回的准确SQLCODE 会很有用。

例如如果我使用错误数量(或不兼容的)参数执行CALL MYSP(...),那么com.ibm.db2.jcc.am.SqlSyntaxErrorException 也会被抛出:

DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-440, SQLSTATE=42884, SQLERRMC=MULTIPLY_BY_THREE;PROCEDURE, DRIVER=3.72.52
    at com.ibm.db2.jcc.am.b1.a(b1.java:813)
    at com.ibm.db2.jcc.am.b1.a(b1.java:66)
    at com.ibm.db2.jcc.am.b1.a(b1.java:140)
    at com.ibm.db2.jcc.am.kj.c(kj.java:2790)
    at com.ibm.db2.jcc.am.kj.d(kj.java:2778)
    at com.ibm.db2.jcc.am.kj.a(kj.java:2222)
    at com.ibm.db2.jcc.am.kk.a(kk.java:7643)
    at com.ibm.db2.jcc.t4.ab.i(ab.java:148)
    at com.ibm.db2.jcc.t4.ab.e(ab.java:77)
    at com.ibm.db2.jcc.t4.p.d(p.java:63)
    at com.ibm.db2.jcc.t4.av.m(av.java:185)
    at com.ibm.db2.jcc.am.kj.ak(kj.java:2217)
    at com.ibm.db2.jcc.am.kk.bn(kk.java:3602)
    at com.ibm.db2.jcc.am.kk.a(kk.java:4460)
    at com.ibm.db2.jcc.am.CallableStatement.b(CallableStatement.java:128)
    at com.ibm.db2.jcc.am.CallableStatement.a(CallableStatement.java:103)
    at com.ibm.db2.jcc.am.CallableStatement.execute(CallableStatement.java:93)

从 SQLCODE 中我可以得知没有找到匹配的例程:

db2 ? sqln440

SQL0440N  No authorized routine named "<routine-name>" of type
      "<routine-type>" having compatible arguments was found.

这意味着代码本身是可以的。

这是CallableStatement 执行的工作示例:

  1. SP 定义:
db2 "create or replace procedure multiply_by_two(in input int, out output int)
    language sql
    set output = input*2"
  1. 代码:
import java.sql.*;
import java.util.*;
import com.ibm.db2.jcc.*;

public class so
{
    public static void main(String [] args)
    {
        String            url;
        CallableStatement cstmt;
        Connection        c;
        Properties        props = new Properties();

        if (args.length != 5)
        {
          System.out.println("USAGE: java so db_name hostname portnum username password");
          return;
        }

        url = "jdbc:db2://"+args[1]+":"+args[2]+"/" + args[0];

        try
        {
            Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();

            props.put("user",args[3]);
            props.put("password",args[4]);
            c = DriverManager.getConnection(url,props);

            cstmt = c.prepareCall("CALL MULTIPLY_BY_TWO(?,?)");
            cstmt.setInt(1,10);
            cstmt.registerOutParameter(2, Types.INTEGER);
            cstmt.execute();
            int out = cstmt.getInt(2);
            System.out.println("MULTIPLY_BY_TWO returned: " + out);
            cstmt.close();

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("Execution complete.");
    }
}
  1. 编译:
 ~/sqllib/java/jdk64/bin/javac so.java
  1. 执行:
~/sqllib/java/jdk64/bin/java so sample localhost  60111 db2v111 passw0rd
MULTIPLY_BY_TWO returned: 20
Execution complete.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2020-11-05
    • 1970-01-01
    • 2016-06-03
    • 2011-07-02
    • 2022-11-13
    • 2016-04-17
    相关资源
    最近更新 更多