2012-08-17 38 views
2

我想使用opensge jdbc连接器从现有的进度数据库中提取数据,但即时运行到列宽问题。正在修复sql长度错误正在进行中4gl 10.2B

这里是让我失望的错误。

[DataDirect] [OpenEdge JDBC驱动程序] [OpenEdge]表PUB.Menu中的列TabDisplayName的值超过了其最大长度或精度。

我已经看了很多帖子,各有各的意见,这里是我给一个去这么远的:

  1. 通过数据字典中手动修改SQL宽度。
    • 我跑PUB.Menu.TabDisplayName快速检查发现的44个字符的最大值
    • 将宽度设置为X(50)无济于事,然后X(100)出非理性的愤怒的修复,再次没有运气。
  2. 使用SUBSTR()SQL函数以截断场 - 不是最佳,但有总比没有
    • 更好,我得到这个奇怪的结果。它在sqlexp中工作正常,但在Java环境中,它从不像列一样被选中。
  3. 使用dbtool自动修复宽度问题,选项#2
    • 选择所有表和“区域”后(不知道这些是什么......),并提交我回到了最后一个选项proenv cmdline,就好像什么都没发生过一样。
  4. 通过4GL
    • 这是我发现我还没有尝试的唯一选择编程修改SQL宽度。
    • 我只是有点不愿意尝试,因为手动修改失败。此外,这是一个现场开发环境(仅适用于我),我试图把它搞得太糟糕了,尽管我正在定期进行捕捉。

在UNIX机器上运行进度102亿。

任何意见和建议,将不胜感激。

-Thanks

+0

如果你担心搞乱开发数据库,​​最好的办法是用旧数据库的模式和一些数据创建一个测试数据库,做一个“以防万一”的备份副本,然后使用它的模式和看看有什么作用。 – 2012-08-17 01:13:08

+0

“区域”是表格和/或索引的集合。它有点像甲骨文的“表空间”。 – 2012-08-17 01:54:42

+0

@tombascom这是很好的知道未来的参考。我不是一个非常有经验的开发人员,绝对不是一个数据库人,所以请原谅我的无知。 – 2012-08-17 02:28:42

回答

3

dbtool选项是最好的。它是为此而设计的。从proenv你应该看到这样的事情:

proenv> dbtool S2K

 DATABASE TOOLS MENU - 10.2B 
     --------------------------- 

    1. SQL Width & Date Scan w/Report Option 
    2. SQL Width Scan w/Fix Option 
    3. Record Validation 
    4. Record Version Validation 
    5. Read or Validate Database Block(s) 
    6. Record Fixup 
    7. Schema Validation 
    9. Enable/Disable File Logging 
      Q. Quit 

    Choice: 2 

:(0 =单用户1 =自助服务> 1 =#线)?1

填充%电流最大以上:100

:(表号或全部)?全部

:(区号或全部)?全部

:(详细级别0-3)? 0

总记录阅读:发现31357个

SQLWidth错误:找到0,日期错误:固定0

SQLWidth错误:0

如果你的数据库有一个服务器最多&运行选择在connect:提示符下输入“1”。如果不是,请选择“0”。

挑选100填充以使字段宽度加倍。

如果您不确定,请在“体育”数据库的副本上尝试。如果你想了解它在做什么,请使用更高层次的冗长。

在小型开发数据库上运行并不需要很长时间。 (这是在 “运动” 基本上是瞬间的。)

+0

谢谢!我之前使用的是dbtool,但我错误地使用了它。我从来没有改变我的数据库到我的数据库的位置。 – 2012-08-17 02:24:54

0

它可以创建子(field.name,1,最大长度)的选项视图,并使用PUB2.viewname代替pub.tablename

DROP VIEW PUB2."accounts"; 
    CREATE VIEW PUB2."accounts" ( 
    "ACC-TYPE", 
    "ACCOUNT-NAME", 
    ANALITIC, 
    ARCH, 
    COUNT1, 
    CURRENCY, 
    PLAN, 
    QUANTITY, 
    "RID-ANOBJECT", 
    "RID-APP", 
    TRANSIT) 
    AS select "acc-type", 
    SUBSTRING("account-name", 1, 130), 
    "analitic", 
    "arch", 
    "count1", 
    "currency", 
    "plan", 
    "quantity", 
    "rid-anobject", 
    "rid-app", 
    "transit" 
    FROM PUB."accounts"; 
    COMMIT; 

使用sqlexp自动创建: sqlexp帐户-H本地主机-S '+分贝端口+' -user sysprogress -password sysprogress -infile recreateSQLviews.sql -outfile recreateSQLviews.log

这里是代码:

def var num-port as integer. 
    for first _Servers where _Servers._Server-Type = "Login" no-lock: 
     num-port = _Servers._Server-PortNum. 
    end. 
    if num-port < 0 then num-port = num-port + 65536. 
    if num-port = 0 then do: 
     message "Define -S parameter for Database" view-as alert-box. 
     RETURN. 
    end. 
    message num-port. 

    /* ttSQLWidth table: SQL WIDTH for all tables */ 

    def var execstr as char. 
    def var rez-str as char. 
    def var db-port as char. /* -S port */ 
    db-port = STRING(num-port). 

    DEFINE TEMP-TABLE ttSQLWidth NO-UNDO 
     FIELD tableName AS CHARACTER 
     FIELD tableNum AS INTEGER 
     FIELD fieldName AS CHARACTER 
     FIELD sqlWidth AS INTEGER 
     FIELD requireFix AS LOGICAL INIT FALSE 
     FIELD actualWidth AS INTEGER 
     FIELD newWidth AS INTEGER 
    INDEX tableNum tableNum 
    INDEX tableName tableName. 

    FOR EACH _File NO-LOCK WHERE _Tbl-Type = "T": 
     FOR EACH _Field OF _File WHERE _Field._Data-type = "character": 
      if _field._extent > 0 then next. 
      CREATE ttSQLWidth. 
      ASSIGN tableName = _File._File-name 
       tableNum = _File._File-num 
     fieldName = _Field._Field-name 
     sqlWidth = _Field._Width. 
     RELEASE ttSQLWidth. 
     END. /* FOR EACH _Field */ 
    END. /* FOR EACH _File */ 

    DEFINE VARIABLE bTab  AS HANDLE  NO-UNDO. 
    DEFINE VARIABLE hQuery  AS HANDLE  NO-UNDO. 
    DEFINE VARIABLE queryString AS CHARACTER NO-UNDO. 

    FOR EACH ttSQLWidth: 
     CREATE BUFFER bTab FOR TABLE tableName. 
     CREATE QUERY hQuery. 
     hQuery:ADD-BUFFER(bTab). 

     message tablename. 
     queryString = "FOR EACH " + tableName + " WHERE LENGTH(" + fieldName + ") >= " + STRING(sqlWidth) + " BY LENGTH(" + fieldName + ") DESC". 
     hQuery:QUERY-PREPARE(queryString). 
     hQuery:QUERY-OPEN(). 

     IF hQuery:GET-NEXT() THEN DO: 
      ASSIGN actualWidth = LENGTH(bTab:BUFFER-FIELD(fieldName):BUFFER-VALUE) 
        requireFix = TRUE. 
     END. /* IF .. THEN DO */ 

     hQuery:QUERY-CLOSE. 
     DELETE OBJECT hQuery. 

     bTab:BUFFER-RELEASE(). 
     DELETE OBJECT bTab. 

    END. /* FOR EACH ttSQLWidth */ 

    def var add-pr as integer initial 10. /* % from max */ 
    def var maxWidth as integer initial 249. /* maxwidth */ 

    FOR EACH ttSQLWidth WHERE ttSQLWidth.requireFix = TRUE: 

     ttSQLWidth.newWidth = TRUNCATE ((ttSQLWidth.actualWidth + add-pr)/add-pr, 0) * add-pr. 
     ttSQLWidth.newWidth = INTEGER(ttSQLWidth.newWidth). 
     if ttSQLWidth.newWidth > maxWidth then ttSQLWidth.newWidth = maxWidth. 

    END. 

    /* sql script generation */ 

    OUTPUT TO value("recreateSQLviews.sql"). 
    def var lst-field as char. 
    FOR EACH ttSQLWidth WHERE BREAK BY ttSQLWidth.tableName: 
     IF FIRST-OF(ttSQLWidth.tableName) 
      THEN run MakeSQLViews(ttSQLWidth.tableName). 

    END. 
    OUTPUT CLOSE. 

    /* sql script execution */ 

    execstr = 'sqlexp account -H localhost -S ' + db-port + ' -user sysprogress -password sysprogress -infile recreateSQLviews.sql -outfile recreateSQLviews.log'. 

    input through value(execstr). 
    repeat: 
     IMPORT UNFORMAT rez-str. 
     message rez-str. 
    end. 
    INPUT CLOSE. 

    RETURN. 

    PROCEDURE MakeSQLViews: 
    define input parameter tableName as character. 

    def var str_tmp as char. 
    def var str_tmp1 as char. 
    def var str as char initial "count,sum,double,row,date,level,area,number,primary". 

    def var fieldName as char. 
    def var fieldName1 as char. 

    FOR EACH _file WHERE _file._file-name = tableName AND 
         _file._file-num GT 0 AND _file._file-num LT 32000 NO-LOCK: 
     fieldName = "".  
     FOR EACH _Field OF _File NO-LOCK:    

       str_tmp = '"' + _Field._Field-name + '"'. 
       FOR FIRST ttSQLWidth where ttSQLWidth.tableName = _file._file-name and 
             ttSQLWidth.fieldName = _Field._Field-name and 
             ttSQLWidth.requireFix = TRUE: 
        str_tmp = 'SUBSTRING("' + _Field._Field-name + '", 1, ' + STRING(ttSQLWidth.newWidth) + ')'. 
       END. 
       fieldName = fieldName + (IF(fieldName = "") THEN ("") ELSE ("," + chr(10) + chr(9))) + str_tmp.  
       str_tmp1 = (IF (INDEX (_Field._Field-name, "-") = 0) 
           THEN (_Field._Field-name) 
           ELSE ('"' + _Field._Field-name + '"')). 

       if LOOKUP (_Field._Field-name, str, ",") > 0 then str_tmp1 = '"' + _Field._Field-name + '"'. 

       fieldName1 = fieldName1 + (IF(fieldName1 = "") THEN ("") ELSE ("," + chr(10) + chr(9))) + UPPER(str_tmp1). 

     END. /* FOR EACH _Field */  

     PUT UNFORMATTED 'DROP VIEW PUB2."' + _file._file-name + '";' SKIP.  
     PUT UNFORMATTED 'CREATE VIEW PUB2."' + _file._file-name + '" (' + chr(10) chr(9) + fieldName1 + ') ' + chr(10) + 
      'AS select ' + fieldName + chr(10) + 
      'FROM PUB."' + _file._file-name + '";' SKIP.  
     PUT UNFORMATTED 'COMMIT;' SKIP(1). 
    END. 

    END.