【问题标题】:Attempted READ of key larger than file maximum key size尝试读取大于文件最大密钥大小的密钥
【发布时间】:2021-09-03 06:54:02
【问题描述】:

我正在运行一个程序来帮助记录我们拥有 30 多年历史的数据库中包含的内容。在此过程中,我收到以下错误消息:

Attempted READ of record ID larger than file/table maximum record ID size of 255 characters.

我的程序是这样工作的:

LOOP WHILE I <= NUM.FILES
    RECORD          = ""
    FILENAME        = FILE.LIST<I>
    ERROR           = ""
    DEBUG.RECORD    = ""
    HAVE.LOOKED     = 0
    OPEN 'DICT ':FILENAME TO D.FILE THEN
        OPEN FILENAME TO T.FILE THEN
            STATEMENT   = "SSELECT ONLY DICT ":FILENAME:' BY FIELD.NO WITH FIELD.NO >= 0 AND WITH FIELD.NO <= 900 AND WITH FIELD # ".]"'
            DEBUG       = ""
            PRINT FILENAME
            EXECUTE STATEMENT RETURNING DEBUG
            LOOP WHILE READNEXT FIELDNAME DO
                READ FIELD.RECORD FROM D.FILE, FIELDNAME THEN
                    IF LEN(FIELDNAME) > BIGGEST.KEY.LEN THEN
                        BIGGEST.KEY         = FIELDNAME
                        BIGGEST.KEY.LEN     = LEN(FIELDNAME)
                        BIGGEST.KEY.FILE    = "DICT ": FILENAME
                        PRINT FILENAME:" ":LEN(FIELDNAME):" ":FIELDNAME
                    END
                    USE.COUNT           = ""
                    USE.LIST            = ""
                    USE.COUNT.STATEMENT = "SELECT ":FILENAME:" WITH ":FIELDNAME:' # ""'
                    DEBUGS              = ""
                    EXECUTE USE.COUNT.STATEMENT RTNLIST USE.LIST RETURNING DEBUGS
                    ROW         = ""
                    ROW<1,1>    = FIELD.RECORD<2>   ;   *Attribute Number
                    ROW<1,2>    = FIELDNAME         ;   *Field Name
                    ROW<1,3>    = FIELD.RECORD<1>   ;   *Field Type
                    ROW<1,4>    = FIELD.RECORD<10>  ;   *Field Size
                    ROW<1,5>    = FIELD.RECORD<12>  ;   *Is Multivalued: "" = no, "Y" = Multivalued, "###" = specific multivalue
                    ROW<1,6>    = FIELD.RECORD<13>  ;   *Is Subvalued: "" = no, "Y" = Subvalued, "###" = specific subvalue
                    ROW<1,7>    = FIELD.RECORD<7>   ;   *Automatic data output conversion
                    ROW<1,8>    = FIELD.RECORD<8>   ;   *Correlative field definition
                    ROW<1,9>    = FIELD.RECORD<11>  ;   *Field description
                    ROW<1,10>   = @SELECTED         ;   *Number of records that don't have this field blank
                    RECORD<-1>  = ROW
                    IF ROW<1,10> < 1 THEN
                        READ UNUSED.FIELDS FROM CHUCK.WORK, "FILE.DEBUG.UNUSED.FIELDS" ELSE
                            UNUSED.FIELDS = ""
                        END
                        UNUSED.FIELDS<-1> = FILENAME:VM:ROW
                        WRITE UNUSED.FIELDS ON CHUCK.WORK, "FILE.DEBUG.UNUSED.FIELDS"
                    END
                    IF FIELD.RECORD<2> = 0 AND @SELECTED > 0 AND HAVE.LOOKED = 0 THEN
                        LOOP WHILE READNEXT KEY FROM USE.LIST DO
                            IF LEN(KEY) > BIGGEST.KEY.LEN THEN
                                BIGGEST.KEY         = KEY
                                BIGGEST.KEY.LEN     = LEN(KEY)
                                BIGGEST.KEY.FILE    = FILENAME
                                PRINT FILENAME:" ":LEN(KEY):" ":KEY
                            END
                        REPEAT
                        HAVE.LOOKED = 1
                    END
                END
            REPEAT
        END ELSE
            ERROR<-1> = "Failed to open file '":FILENAME:"'"
        END
    END ELSE
        ERROR<-1> = "Failed to open file DICT '":FILENAME:"'"
    END
    WRITE RECORD ON CHUCK.WORK, "FILE.":FILENAME
    WRITE DEBUG.RECORD ON CHUCK.WORK, "FILE.DEBUG.":FILENAME
    READ CHUCK.LOG FROM CHUCK.WORK, "CHUCK.LOG" ELSE
        CHUCK.LOG = ""
    END
    CHUCK.LOG<-1> = "FILE '":FILENAME:"' had ":DCOUNT(RECORD,AM):" fields"
    IF ERROR THEN
        CHUCK.LOG<-1>   = ERROR
        ERRORS<-1>      = ERROR
    END
    WRITE CHUCK.LOG ON CHUCK.WORK,"CHUCK.LOG"
    CLEARSELECT
    I = I + 1
REPEAT

当我直接查看数据库时,我在文件中找不到任何导致问题的超过 35 个字符的记录 ID 或键,并且在整个数据库中不超过 70 个字符。谁能帮助确定为什么这些记录在此过程中被标记但无法直接发现?

下面是我写的一个程序,专门用来查找有问题的记录,但是找不到罪魁祸首

OPEN "CHUCK.WORK" TO CHUCK.WORK ELSE
        PRINT "UNABLE TO OPEN CHUCK.WORK"
        RETURN
    END
    READ FILENAME FROM CHUCK.WORK, "LISTME" ELSE
        PRINT "UNABLE TO READ LISTME"
        RETURN
    END
    NUM.FILES = DCOUNT(FILENAME,AM)
    FOR I = 1 TO NUM.FILES
        OPEN FILENAME<I> TO T.FILE ELSE
            PRINT "UNABLE TO OPEN ":FILENAME<I>
            RETURN
        END
        EXECUTE 'SELECT ':FILENAME<I>
        LOOP WHILE READNEXT KEY DO
            IF LEN(KEY) > 20 THEN
                PRINT FILENAME<I>:" ":LEN(KEY):" ":KEY
            END
        REPEAT
    NEXT I

更新

我的一位同事确定了问题的根源,尽管我们尚未确定如何解决问题: 我们的一个文件有一个多值字段,它是关联中使用的键。出于某种原因,Universe 试图读取整个属性而不是单个多值作为键,这会导致记录 ID 过长。任何人都可以看到我的代码是否做错了,或者我们需要查看数据库中的某些设置吗?

【问题讨论】:

  • 在dev上,按照这里的逻辑,最长的key是69个字符

标签: universe u2


【解决方案1】:

当您看到此错误时,它与文件中键的大小无关,只是您尝试读取的 @ID 长度超过 255 个字符。当我看到它时,通常会告诉我它发生在源代码的哪一行。如果你把它放在你那条线之前,你应该能够找到它。

IF LEN(THIS.ID) GT 255 THEN
   DEBUG
END

编辑。显然,这种情况下的错误是没有引用行号。我不确定这是为了清楚起见而省略了,还是在 UniVerse 风格上有所不同,但我现在认为它的缺失暗示错误消息来自 shell,而不是解释器。

OPEN '','VOC' TO FILE.VOC ELSE STOP "CANNOT OPEN FILE VOC"
STMT = "SELECT VAL WITH ":STR("A",256):" EQ 0"
EXECUTE STMT RTNLIST USE.LIST RETURNING DEBUGS
CRT "**************************************"
READ TEST FROM FILE.VOC,STR("A",256) ELSE NULL
END

在我的系统上输出这个。

>RUN TEST.SC TEST.LONG.ID
Attempted READ of record ID larger than file/table maximum
record ID size of 255 characters.
RetrieVe: syntax error.  Unexpected sentence without filename.  Token was "".
          Scanned command was SELECT 'VAL' WITH 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' EQ '0'
**************************************
Program "TEST.LONG.ID": Line 5, Attempted READ of record ID larger than file/t
able maximum
record ID size of 255 characters.
>

第一个看起来像您的错误消息,将指向您正在构建的动态 SELECT 语句之一。 @ID 是记录钥匙的同义词,为了进一步进行类比,您似乎正试图用那些可笑的大“城市钥匙”之一来解锁您的自行车。

【讨论】:

  • 我认为@ID 字段和记录键是同义词。另外,我在错误输出中没有得到行号。
  • 感谢您抽出宝贵时间来帮助解决此问题。不过,为了保持类比,我并不是想用城市钥匙解锁我的自行车,而是我想立即将整个钥匙链塞进锁中。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 2014-05-26
  • 2015-11-12
  • 2015-03-12
  • 1970-01-01
  • 2012-06-26
  • 2015-03-13
  • 2012-07-10
相关资源
最近更新 更多