2012-08-17 63 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.