【问题标题】:IBM DB2 SQLCODE -1424, SQLSTATE 54040 when trying to create a trigger尝试创建触发器时的 IBM DB2 SQLCODE -1424、SQLSTATE 54040
【发布时间】:2014-11-11 14:00:19
【问题描述】:

我尝试创建以下触发器(在 Ubuntu 10.04.2 LTS 上运行的 DB2/LINUXX8664 9.7.2)但我总是得到这个:

Error report:
DB2 SQL error: SQLCODE: -1424, SQLSTATE: 54040, SQLERRMC: 2

根据 IBM DB2 文档:

Too many references to transition variables and transition table columns or the row length for these references is too long. Reason code=rc.

http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.messages.sql.doc/doc/msql01424n.html

我真的不明白那个解释。这里是存储过程和触发器:

CREATE PROCEDURE SP_INSERT_UPDATE_REPNUM (
   IN RECNUM           INTEGER,
   IN CUSTOMER_ID      INTEGER,
   IN Q_CODE           VARCHAR(14),
   IN S_CODE           VARCHAR(14),
     IN REP_STATUS       INTEGER,
     IN P_CODE           INTEGER,
     IN REPNUMRG_ID      INTEGER,
     IN VOLG_LET         VARCHAR(1),
     IN REP_DATUM        DATE,
     IN REP_INI          VARCHAR(2),
     IN INGEBOEKT_DATUM  DATE,
     IN INGEBOEKT_INI    VARCHAR(2),
     IN WIJZIGING_DATUM  DATE,
     IN WIJZIGING_INI    VARCHAR(2),
     IN OMSCR_STORING    VARCHAR(5),
     IN OMSCR_WERKZ      VARCHAR(5),
     IN OMSCR_OPMERKING  VARCHAR(5),
     IN OMSCR_GEBREK     VARCHAR(5),
     IN OMSCR_MAT        VARCHAR(5),
     IN REP_TIJD         FLOAT,
     IN REP_GEDAAN       CHAR(1),
     IN ACTION           CHAR(1)
)
SPECIFIC SP_INSERT_UPDATE_REPNUM
DYNAMIC RESULT SETS 0
DETERMINISTIC
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
NOT FENCED
THREADSAFE
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'RepairMigration!insertServiceReport'

这里是触发器:

CREATE TRIGGER INSERT_REPNUM
  AFTER INSERT ON REPNUM
  REFERENCING NEW ROW AS NROW
    FOR EACH ROW MODE DB2SQL
BEGIN 
  CALL SP_INSERT_UPDATE_REPNUM(
    NROW.RECNUM,
    NROW.CUSTOMER_ID,
    NROW.Q_CODE,
    NROW.S_CODE,
    NROW.REP_STATUS,
    NROW.P_CODE,
    NROW.REPNUMRG_ID,
    NROW.VOLG_LET,
    NROW.REP_DATUM,
    NROW.REP_INI,
    NROW.INGEBOEKT_DATUM,
    NROW.INGEBOEKT_INI,
    NROW.WIJZIGING_DATUM,
    NROW.WIJZIGING_INI,
    NROW.OMSCR_STORING,
    NROW.OMSCR_WERKZ,
    NROW.OMSCR_OPMERKING,
    NROW.OMSCR_GEBREK,
    NROW.OMSCR_MAT,
    NROW.REP_TIJD,
    NROW.REP_GEDAAN,
    'I'
  );
END

表结构是这样的:

RECNUM              INTEGER 4   0   N   
Q_CODE              CHARACTER   14  0   N   ''
U_Q_CODE            CHARACTER   14  0   N   
S_CODE              CHARACTER   14  0   N   ''
U_S_CODE            CHARACTER   14  0   N   
VOLG_LET            CHARACTER   1   0   N   ''
U_VOLG_LET          CHARACTER   1   0   N   
REP_DATUM           DATE    4   0   N   '0001-01-01'
REP_INI             CHARACTER   2   0   N   ''
P_CODE              INTEGER 4   0   N   0
CUSTOMER_ID         INTEGER 4   0   N   0
REPNUMHD_ID         INTEGER 4   0   N   0
REPNUMRG_ID         INTEGER 4   0   N   0
REP_STATUS          SMALLINT    2   0   N   0
KONTAKT_PER         CHARACTER   25  0   N   ''
KONTAKT_TEL         CHARACTER   20  0   N   ''
OMSCR_STORING       VARCHAR 512 0   N   ''
OMSCR_WERKZ         VARCHAR 2000    0   N   ''
OMSCR_MAT           VARCHAR 512 0   N   ''
WIJZIGING_DATUM     DATE    4   0   N   '0001-01-01'
WIJZIGING_INI       CHARACTER   2   0   N   ''
INGEBOEKT_DATUM     DATE    4   0   N   '0001-01-01'
INGEBOEKT_INI       CHARACTER   2   0   N   ''
REP_GEDAAN          CHARACTER   1   0   N   ''
U_REP_GEDAAN        CHARACTER   1   0   N   
STATUS              SMALLINT    2   0   N   0
UW_OPDRACHT         CHARACTER   20  0   N   ''
REP_UREN            SMALLINT    2   0   N   0
REP_MINUTEN         SMALLINT    2   0   N   0
OMSCR_OPMERKING     VARCHAR 1008    0   N   ''
OMSCR_GEBREK        VARCHAR 512 0   N   ''
SERVICE_NUMMER      INTEGER 4   0   N   0
PRIJS_OPGAVE        CHARACTER   1   0   N   ''
CURRENCY            SMALLINT    2   0   N   0
REP_TIJD            INTEGER 4   0   N   0

尝试执行触发器后,我收到错误消息。我该如何解决这个问题?

更新

看来我需要创建一个临时表空间。列出我所有的表空间,我得到了一些超过 4k 的,例如这个:

 Tablespace ID                        = 7
 Name                                 = TEMPSPACE1234
 Type                                 = Database managed space
 Contents                             = All permanent data. Regular table space.
 State                                = 0x0000
   Detailed explanation:
     Normal
 Total pages                          = 1024
 Useable pages                        = 1008
 Used pages                           = 432
 Free pages                           = 576
 High water mark (pages)              = 528
 Page size (bytes)                    = 32768
 Extent size (pages)                  = 16
 Prefetch size (pages)                = 16
 Number of containers                 = 1

【问题讨论】:

  • 想提一下您的 DB2 版本和平台?您可能还想包含表定义。
  • @mustaccio DB2/LINUXX8664 9.7.2 在 Ubuntu 10.04.2 LTS 上运行
  • 如果是 Linux,为什么要参考 z/OS 上的 DB2 手册?
  • 您是否有页面大小大于 4K 的系统临时表空间?如果没有,请创建一个并再次尝试触发。

标签: stored-procedures triggers db2


【解决方案1】:

1) 创建一个 32K 的缓冲池

例子:

CREATE BUFFERPOOL "BUFFERPOOLLARGE" IMMEDIATE
ALL DBPARTITIONNUMS  SIZE AUTOMATIC
NUMBLOCKPAGES 0
PAGESIZE 32 K;

2) 创建一个 32K SYSTEM TEMPORARY TABLESPACE

例子:

CREATE SYSTEM TEMPORARY TABLESPACE "TEMPSPACELARGE"
IN DATABASE PARTITION GROUP "IBMTEMPGROUP"
PAGESIZE 32 K
MANAGED BY AUTOMATIC STORAGE
EXTENTSIZE 32
BUFFERPOOL "BUFFERPOOLLARGE"
OVERHEAD INHERIT
TRANSFERRATE INHERIT
USING STOGROUP "IBMSTOGROUP"
FILE SYSTEM CACHING;

3) 再次运行 CREATE PROCEDURE 脚本。

OBS:在示例中我使用了 DB2 自动 TABLESPACE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多