微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DB2外部Java jar文件存储过程错误

如何解决DB2外部Java jar文件存储过程错误

我一直试图从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可以正常工作,但是当我尝试以这种方式调用它时,我似乎无法弄清楚为什么外部存储过程给我错误。 / p>

由于很长一段时间以来一直困扰于此并且我没有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. 

解决方法

错误SQL1131N的描述如下

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

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

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

当您使用外部非SQL代码犯错误时,Db2是无法原谅的,在这种情况下,它只会引发异常并希望您对其进行处理。

仅当有迫不得已的理由不使用SQL PL过程时,才将Java用于Db2存储过程。

您有这些错误

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。