2017-05-08 97 views
1

我想將大的XML字符串(可能長於32K或64K)保存到AS400文件字段中。 DDS或SQL文件都可以。下面的SQL文件示例。As400中的非常大的字段ISeries數據庫

CREATE TABLE MYLIB/PRODUCT 
(PRODCODE DEC (5) NOT NULL WITH DEFAULT, 
PRODDESC CHAR (30) NOT NULL WITH DEFAULT, 
LONGDESC CLOB (70K) ALLOCATE(1000) NOT NULL WITH DEFAULT) 

我們將使用RPGLE讀取和寫入字段。

目標是在客戶端通過ODBC連接提取數據。

AS400字符字段似乎有32K限制,所以這不是很好的選擇。

我有什麼選擇?我一直在閱讀CLOB,但似乎有限制將大字符串寫入CLOBS並遠程讀取CLOB字段。請注意,客戶端(仍然)位於AS400 OS的v5R4上。

謝謝!


查爾斯在下面的回答顯示瞭如何提取數據。我想插入數據。此代碼會運行,但會引發'22501'SQL錯誤。

D wLongDesc  s   65531a varying      
D longdesc  s     sqltype(CLOB:65531)   

/free                
    //eval longdesc = *ALL'123';         
    eval Wlongdesc = '123';           

    exec SQL              
    INSERT INTO PRODUCT (PRODCODE, PRODDESC, LONGDESC)    
    VALUES (123, 'Product Description', :LongDesc);    

    if %subst(sqlstt:1:2) <> '00';         
     // an error occurred.          
    endif;               

    // get length explicitly, variables are setup by pre-processor 
    longdesc_len = %len(%trim(longdesc_data));      

    wLongDesc = %subst(longdesc_data:1:longdesc_len);    

/end-free               
C     Eval  *INLR = *on       
C     Return           

附加問題:該技術是否適用於存儲我想通過ODBC連接提取的數據? ODBC是否將CLOB讀取爲指針或可以將文本拉出?

+2

你沒有在插入之前加載'longdesc',它只是有無效的隨機數據。 – jmarkmurphy

+2

添加'longdesc_data = wLongDesc; longdesc_len =%len(%trim(wLongDesc));'在插入之前。 – jmarkmurphy

+2

您也可能希望將'exec sql set option commit = * none;'添加到c規範的頂部,因此您不必記得設置您的承諾控制選項。適當地更改'* none'。 – jmarkmurphy

回答

4

在v5r4,RPGLE實際上支持64K字符變量。

但是,對於常規的char/varchar字段,DB限制爲32K。

對於大於32K的任何內容,您都需要使用CLOB。

如果你可以用64K(或左右)住

CREATE TABLE MYLIB/PRODUCT 
(PRODCODE DEC (5) NOT NULL WITH DEFAULT, 
PRODDESC CHAR (30) NOT NULL WITH DEFAULT, 
LONGDESC CLOB (65531) ALLOCATE(1000) NOT NULL WITH DEFAULT) 

您可以使用RPGLE SQLTYPE支持

D code   S    5s 0 
d wLongDesc  s   65531a varying 
D longdesc  s     sqltype(CLOB:65531) 

    /free 
    exec SQL 
    select prodcode, longdesc 
     into :code, :longdesc 
     from mylib/product 
    where prodcode = :mykey; 

    wLongDesc = %substr(longdesc_data:1:longdesc_len); 
    DoSomthing(wLongDesc); 

預編譯器將像這樣定義的DS取代LONGDESC:

D longdesc  ds 
D longdesc_len     10u 0 
D longdesc_data    65531a 

您可以直接使用它,確保只用到longdesc_len或將它轉換爲VARYING,如上所述。

如果絕對必須處理大於64K ...

  1. 升級到OS的支持版本(支持16MB變量)
  2. 訪問使用文件引用
  3. 通過IFS文件CLOB內容

選項2是我從未見過的一個....我找不到任何示例。剛看到它這個老文章中提到.. http://www.ibmsystemsmag.com/ibmi/developer/general/BLOBs,-CLOBs-and-RPG/?page=2

0

這個例子顯示瞭如何編寫在DB2數據庫的CLOB場......從查爾斯和墨菲先生的反饋幫助。

* ----------------------------------------------------------------------   
* Create table with CLOB: 
* CREATE TABLE MYLIB/PRODUCT 
* (MYDEC DEC (5) NOT NULL WITH DEFAULT,           
* MYCHAR CHAR (30) NOT NULL WITH DEFAULT,          
* MYCLOB CLOB (65531) ALLOCATE(1000) NOT NULL WITH DEFAULT)      
* ----------------------------------------------------------------------   

D PRODCODE  S    5i 0            
D PRODDESC  S    30a            

D i    S    10i 0            
D wLongDesc  s   65531a varying          
D longdesc  s     sqltype(CLOB:65531)       

D* Note that variables longdesc_data and longdesc_len        
D* get create automatocally by SQL pre-processor.         

/free                 
    eval wLongdesc = '123';            

    longdesc_data = wLongDesc;           
    longdesc_len = %len(%trim(wLongDesc));        

    exec SQL set option commit = *none;         

    exec SQL                
    INSERT INTO PRODUCT (MYDEC, MYCHAR, MYCLOB)       
    VALUES (123, 'Product Description',:longDesc);      

    if %subst(sqlstt:1:2)<>'00' ;   
     // an error occurred.    
    endif;         

    Eval *INLR = *on;      
    Return;         
/end-free         
+0

這裏有一個問題:使用這種技術是否有可能超過RPG字段的65535個字符限制? –