【问题标题】:DB2 external java jar file stored procedure errorDB2 外部 java jar 文件存储过程错误
【发布时间】:2021-01-30 19:50:11
【问题描述】:

我一直在尝试将 DB2 存储过程中的 java jar 文件作为外部 jar 调用。 下面是我的外部jar文件代码。

package connection;
    public class Connect {

        static Connection con = null;
        static Statement stmt = null;

        public static void main(String[] args) throws SQLException {
                javastp("v1");
        }

        public static void javastp( String name) throws SQLException{
            try {
            con = DriverManager.getConnection( "jdbc:default:connection" );
            stmt = con.createStatement();
            stmt.executeUpdate("INSERT INTO SCHEMA_NAME.TEST(NAME, FLAG) VALUES ('"+name+"',true) "); 
            }catch (Exception e) {
                // ...
              }finally {
            //Close open resources
            if (stmt != null) stmt.close();
            if (con != null) con.close();  
            }
        }
    }

我在 db2 服务器中使用以下命令安装它

db2 call sqlj.install_jar('file:E:/jarpath../jarname.jar','jarname',0); 

下面是 DB2 外部 jar 的存储过程。

CREATE OR REPLACE PROCEDURE SCHEMA_NAME.PROC6()
  LANGUAGE java
  PARAMETER STYLE java 
  FENCED 
  EXTERNAL NAME 'jarname:connection.Connect.main'

存储过程执行成功,没有错误。

但是当我尝试使用下面调用存储过程时,

CALL SCHEMA_NAME.PROC6() 

我收到以下错误

SQL Error [38503]: A stored procedure process has been terminated abnormally. Routine name: "SCHEMA_NAME.PROC6". Specific name: "SQL201016144125554".. SQLCODE=-1131, SQLSTATE=38503, DRIVER=4.8.86

当直接在命令提示符下执行 java jar 并且记录被插入到表中时,java jar 工作正常,但我似乎无法弄清楚为什么当我尝试以这种方式调用它时外部存储过程给我错误。

有人能帮帮我吗,因为我卡在这个问题上很久了,我没有 DB2 的背景。

db2level 命令给出以下输出:

DB21085I  This instance or install (instance name, where applicable: "DB2")
uses "64" bits and DB2 code release "SQL10058" with level identifier
"0609010E".
Informational tokens are "DB2 v10.5.800.381", "s160901", "IP24000", and Fix
Pack "8".
Product is installed at "C:\PROGRA~1\IBM\SQLLIB" with DB2 Copy Name "DB2COPY1".

Linux Suse db2 版本 11.1.2

数据库服务器 = DB2/LINUXX8664 11.1.2

日志如下:

2020-10-20-09.24.56.746633+330 I4952989679E1230      LEVEL: Error
PID     : 31693                TID : 140179352315648 PROC : db2sysc 0
INSTANCE:              NODE : 000            DB   : 
APPHDL  :               APPID: 
AUTHID  :               HOSTNAME: 
EDUID   : 2768                 EDUNAME: db2agent () 0
FUNCTION: DB2 UDB, routine_infrastructure, sqlerWaitForFencedInvocation, probe:12115
MESSAGE : ZRC=0xFFFFFB38=-1224
          SQL1224N  The database manager is not able to accept new requests,
          has terminated all requests in progress, or has terminated the
          specified request because of an error or a forced interrupt. 

【问题讨论】:

  • 问题不清楚。您是否试图让 Java 存储过程调用另一个外部 Java 过程(即嵌套)?您的问题没有显示此代码。
  • SQLCODE -1131 的错误消息显示“存储过程进程已异常终止。”检查诊断日志中的后台错误。
  • @mao 我正在尝试通过 db2 外部存储过程(上面写的存储过程)调用一个 java jar(我上面写的 java 代码)。我没有嵌套任何东西。很抱歉,但英语不是我的第一语言,所以我希望我上面写的内容有意义。

标签: java db2 db2-luw java-stored-procedures


【解决方案1】:

当您使用外部非 SQL 代码出错时,Db2 是无情的,在这种情况下,它只是抛出一个异常并期望您对其进行整理。

仅当有令人信服的理由不使用 SQL PL 过程时,才将 java 用于 Db2 存储过程。

你有这些错误

  • 您不能将 main() 用于 Db2 java 存储过程入口点
  • 存储过程入口点在您的情况下应该是 javastp() 方法
  • DDL 中的 EXTERNAL NAME 子句不得引用 main(),而应使用 javastp 代替
  • create procedure 行中的参数必须与方法的参数匹配 在数量、类型和顺序上。 (在您的情况下是(IN name varchar(255) 或类似)。

【讨论】:

  • 我按照你的说法进行了编辑。但我仍然面临同样的错误。
  • 编辑您的问题以完整显示新代码和修改后的create procedure 语句。还显示您正在使用的 which jdk 和 jre(在您的问题中添加您构建过程的 java -versionjavac -version 的输出)。
【解决方案2】:

错误SQL1131N有以下描述

DB2 体系结构的设计使应用程序在与数据库服务器不同的地址空间中运行。在不同的地址空间中运行应用程序可防止应用程序编程错误覆盖数据库管理器内部缓冲区或文件,并防止应用程序错误使数据库管理器崩溃。防护模式进程 (db2fmp) 负责在与数据库服务器不同的地址空间中执行防护存储过程和用户​​定义的函数。

当运行指定例程时 db2fmp 进程异常终止时,将返回此消息。 db2fmp 进程可能由于多种原因异常终止,包括以下原因:

  • 在 db2fmp 进程正在执行的存储过程或用户定义函数的实现中存在编码错误,例如被零除或越界指针引用。
  • 另一个进程使用终止信号 SIGTERM 等信号终止了 db2fmp 进程。
  • SQLJ.INSTALL_JAR 在安装 Java 例程时失败,因为受防护的用户无权创建或写入服务器上的必要目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多