首页 > 解决方案 > 我正在尝试调用 db2 过程,但出现运行时错误 com.ibm.db2.jcc.am.SqlSyntaxErrorException

问题描述

我正在调用 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 ;
  }

标签: hibernatedb2

解决方案


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.

推荐阅读