3

openge jdbcコネクタを使用して、既存の進行状況データベースからデータをプルしようとしていますが、列幅の問題が発生しています。

これが私を妨げているエラーです。

[DataDirect] [OpenEdge JDBCDriver][OpenEdge]テーブルPUB.Menuの列TabDisplayNameの値が最大長または最大精度を超えています。

私は多くの投稿を見て、それぞれが異なるアドバイスを提供しています。これまでに行ったことは次のとおりです。

  1. データディクショナリを介してSQL幅を手動で変更します。
    • PUB.Menu.TabDisplayNameでクイックチェックを実行して、最大値44文字を見つけました
    • 幅をx(50)に設定して無駄にし、次にx(100)を不合理な怒りの修正から外します。これも運がありません。
  2. SUBSTR()SQL関数を使用してフィールドを切り捨てます-最適ではありませんが、何もないよりはましです
    • これで奇妙な結果が得られます。sqlexpでは正常に動作しますが、Java環境では、そのような列が選択されることはありません。
  3. dbtoolを使用して、オプション#2の幅の問題を自動的に修正します
    • すべてのテーブルと「領域」を選択し(それらが何であるかはわかりません...)、最後のオプションを送信すると、何も起こらなかったかのようにproenvコマンドラインに戻ります。
  4. 4glを介してプログラムでSQL幅を変更します
    • これは私がまだ試していなかった唯一のオプションです。
    • 手動での変更が失敗したという理由だけで、これを試すのは少し気が進まない。また、これはライブ開発環境(私だけ)であり、私は定期的にスナップを取っていますが、私はそれをあまりにもひどく台無しにしようとしています。

UNIXマシンで進行状況10.2Bを実行しています。

コメントや提案をいただければ幸いです。

-ありがとう

4

2 に答える 2

4

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」を選択します。

フィールドの幅を2倍にするには、パディングに100を選択します。

よくわからない場合は、「スポーツ」データベースのコピーで試してみてください。それが何をしているのかについての洞察が必要な場合は、より高いレベルの冗長性を使用してください。

小さな開発データベースで実行するのにそれほど時間はかかりません。(基本的に「スポーツ」では瞬時に行われます。)

于 2012-08-17T01:52:44.210 に答える
1

substring (field.name,1,maxlength) オプションを使用してビューを作成し、pub.tablename の代わりに PUB2.viewname を使用することができます。

    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 account -H localhost -S ' + db-port + ' -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.
于 2016-06-02T13:13:03.727 に答える