如何?100%的動態資料管道(三)

來源:互聯網
上載者:User
動態|資料
下面看看,如何根據中介層的資料,構建管道文法:


1.首先建立一個資料視窗對象:d_vdtcolumns


SQL文法是:


 SELECT vdt_columns.utid,  
         vdt_columns.uid,  
         vdt_columns.upkey,  
         vdt_columns.udmid,  
         vdt_columns.udmname,  
         vdt_columns.unulls,  
         vdt_columns.uwidth,  
         vdt_columns.uscale,  
         vdt_columns.uname,  
         vdt_columns.udefault,  
         vdt_columns.ucheck,  
         vdt_columns.utname,  
         vdt_columns.uidentity 
    FROM vdt_columns 
   WHERE utname = :as_tname   


2.準備工作就緒,下面就是主戰場了,開始構建資料管道.


考慮到一個管道對象可以傳輸多個任務,建立一個對象nvo_pipetransattrib儲存傳輸需要的文法:
它包含了一下的instance變數:


string  is_objectname              //表名
string is_syntax               //管道文法

string is_sconnect='zw',is_dconnect='daixf'      //來源資料庫串連和目的資料庫連接
string is_ptype,is_pcommit,is_errors         //管道的幾個屬性
string is_sname,is_dname             //源表名,目的表名
string is_sqlsyntax              //管道的SQL文法



建立一個對象,從資料管道對象繼承.

開始構造文法:寫一個函數.
nvo_pipetransattrib inv_attrib[]

string ls_syntax,ls_sourcesyntax,ls_destsyntax

int li,lj,li_ind,li_find,li_rows,li_identity
string ls_tablename,ls_default,ls_defaultvalue,ls_pbdttype
boolean lb_find
dec ld_uwidth,ld_prec,ld_uscale
string ls_types,ls_dbtype,ls_prikey,ls_name,ls_nulls,ls_msg,ls_title='of_constrpipesyntax()'
nvo_string lnv_string
nvo_datastore lds_vdtcolumns
boolean lb_key

lds_vdtcolumns=create nvo_datastore
lds_vdtcolumns.dataobject='d_vdtcolumns'
lds_vdtcolumns.settransobject(SrcSqlca)
li=1

of_input(inv_attrib[li])
li_find=pos(inv_attrib[li].is_sqlsyntax,'*',1)
if li_find>0 then
 lds_vdtcolumns.retrieve(as_tablename)
 of_filterimg(lds_vdtcolumns)
 li_rows=lds_vdtcolumns.rowcount()
 for lj=1 to li_rows
  ls_name=lds_vdtcolumns.getitemstring(lj,'uname')
  ls_types=lds_vdtcolumns.getitemstring(lj,'udmname')
  li_identity = lds_vdtcolumns.getitemnumber(lj,'uidentity')
  ls_types=of_getpipedbtype(is_s_dbtype,ls_types)
  ls_pbdttype=of_getpbdttype(is_s_dbtype,ls_types)
  choose case ls_types
   case 'char','varchar','nchar','nvarchar','long varchar'
    if ls_types='long varchar' then ls_types='varchar'
    ld_uwidth=lds_vdtcolumns.getitemnumber(lj,'uwidth')
    ls_dbtype=ls_types+'('+string(int(ld_uwidth))+')'
   case 'decimal','numeric'
    ld_uwidth=lds_vdtcolumns.getitemnumber(lj,'uwidth')
    ld_uscale=lds_vdtcolumns.getitemnumber(lj,'uscale')
    if li_identity=1 then
     ls_dbtype='identity'+'('+string(int(ld_uwidth))+','+string(int(ld_uscale))+')'
    else
     ls_dbtype=ls_types+'('+string(int(ld_uwidth))+','+string(int(ld_uscale))+')'
    end if
   case else
    ls_dbtype=ls_types
  end choose
  ls_prikey=lds_vdtcolumns.getitemstring(lj,'upkey')
  if ls_prikey='Y' then
   lb_key=true
   ls_prikey='key=yes,' 
  else
   ls_prikey=''
  end if
  
  ls_nulls=lds_vdtcolumns.getitemstring(lj,'unulls')
  if ls_nulls='Y' then
   ls_nulls='yes' 
  else
   ls_nulls='no'
  end if
  
  ls_default=isnull(lds_vdtcolumns.getitemstring(lj,'udefault'),'')
  
  ls_sourcesyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+")~r~n"
  if ls_default='' then
   if li_identity = 1 then
    ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",initial_value=~"exclude~")~r~n"
   else
    ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+")~r~n"
   end if
  else
   if li_identity = 1 then
    ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",default_value=~""+ls_default+"~",initial_value=~"exclude~")~r~n"
   else
    ls_destsyntax+="COLUMN(type="+ls_pbdttype+",name=~""+ls_name+"~",dbtype=~""+ls_dbtype+"~","+ls_prikey+"nulls_allowed="+ls_nulls+",default_value=~""+ls_default+"~")~r~n"    
   end if
  end if
 next
else
 return ''
end if
ls_sourcesyntax+=')'
ls_destsyntax+=')'

//generate PIPELINE
//example:
//PIPELINE(source_connect=csfdata,destination_connect=csfdata,type=replace,commit=100,errors=100,keyname="Bar_x")
if lb_key then
 ls_syntax+='PIPELINE(source_connect='+inv_attrib[li].is_sconnect+',destination_connect='+inv_attrib[li].is_dconnect+',type='+inv_attrib[li].is_ptype+',commit='+inv_attrib[li].is_pcommit+',errors='+inv_attrib[li].is_errors+',keyname="'+as_tablename+'_x")~r~n'
else
 ls_syntax+='PIPELINE(source_connect='+inv_attrib[li].is_sconnect+',destination_connect='+inv_attrib[li].is_dconnect+',type='+inv_attrib[li].is_ptype+',commit='+inv_attrib[li].is_pcommit+',errors='+inv_attrib[li].is_errors+')~r~n' 
end if

//generate SOURCE
//example:
//SOURCE(name="Bar",COLUMN(type=char,name="CustomCode",dbtype="char(8)",key=yes,nulls_allowed=no)
ls_syntax+='SOURCE(name="'+inv_attrib[li].is_sname+'",'


ls_syntax+=ls_sourcesyntax


//generate RETRIEVE
//example:
//RETRIEVE(statement="SELECT Bar.CustomCode,Bar.BarCode,Bar.ItemCode,Bar.Metering,Bar.PackSize,Bar.Length,Bar.Width,Bar.High,Bar.Vol,Bar.Weight,Bar.NewPackFlagFROM Bar")
ls_syntax+='RETRIEVE(statement="'+inv_attrib[li].is_sqlsyntax+'")'


//generate DESTINATION
//example:
//DESTINATION(name="Bar_copy",
//COLUMN(type=char,name="CustomCode",dbtype="char(8)",key=yes,nulls_allowed=no,initial_value="spaces")
ls_syntax+='DESTINATION(name="'+inv_attrib[li].is_dname+'",'
ls_syntax+=ls_destsyntax

return ls_syntax

這個函數的傳回值就是構建完成的管道文法了.



其中:初始化的函數:of_input(inv_attrib[li])


是初始化,inv_attrib的函數,初始化的資料主要是使用者需要輸入的條件,比如管道的type,commit,errors,select語句.

需要說明一下,其中處理了幾個特殊的情況的函數.


of_filterimg(lds_vdtcolumns):


過濾掉表中的image列,因為管道不支援image資料轉送.


of_getpipedbtype(is_s_dbtype,ls_types):


根據表中列的類型得到管道中資料列的類型,因為他們不是總是一一對應的.


這個可以通過一個extend datawindowobject,並包含有初始資料來實現.


of_getpbdttype(is_s_dbtype,ls_types):
根據表中列的類型得到管道中列的類型,因為他們也不是總是一一對應的.
這個可以通過一個extend datawindowobject,並包含有初始資料來實現.



管道文法構建完成了,就可以執行管道傳輸了:



this.syntax=得到的文法

li_RC = this.Start(SrcSqlca,DestSqlca,idw_Errors)
 
If li_RC <> 1 Then
 if not ib_silence then msg(ls_title,"對象傳輸失敗: " + string(li_rc))
 of_addtransmsg(' 對象<'+is_currentobj+'>傳輸失敗:' + string(li_rc) )
 return li_RC
 rollback ;
else
 Commit;
End if



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。