zoukankan      html  css  js  c++  java
  • X GoldenGate使用SQLEXEC和GETVAL实现码表关联

     

    使用OGG中的SQLEXEC参数,可以执行SQL语句或存储过程,再加上@GETVAL函数,可以在目标端获取源表没有的字段值。

    比如,源端有一个事实表和一个代码表COUNTRY_CODES,代码表中有两个字段:country_name 和 country_id,事实表即customers表,里面只有country_id字段。

    我们希望在目标端的customers中,增加一列country_name字段,并在OGG同步的过程中,针对这个字段赋值,这样在目标端可以直接select customers查看数据,不用再关联COUNTRY_CODES表。

    下面分别演示使用SQL语句和存储过程的实现方式。

    方法一,使用SQL语句

    以下使用SQL语句获取COUNTRY_NAME ,抽取进程参数:

    EXTRACT gavinext
    USERID idit_prd, PASSWORD idit_prd
    RMTHOST indb02, MGRPORT 7809
    RMTTRAIL ./dirdat/xx
    TABLE idit_prd.customers;

    以下是目标端参数:

    REPLICAT gavinrep
    SETENV (NLS_LANG=”AMERICAN_AMERICA.WE8ISO8859P1″)
    SETENV (ORACLE_SID=GGDB2)
    ASSUMETARGETDEFS
    USERID idit_prd,PASSWORD idit_prd
    MAP idit_prd.customers, TARGET idit_prd.customers, &
    SQLEXEC (ID lookup, &
    QUERY “select country_name cname from country_code where country_id =:v_country_id”,&
    PARAMS (v_country_id = country_id)),&
    COLMAP (USEDEFAULTS, country_name = @GETVAL (lookup.cname) );

    方法二,使用存储过程

    定义一个SP基于country_id获取country_name, 如下:

    create or replace procedure get_country
    (v_country_id IN number, v_country_name OUT varchar2 )
    is
    begin
    select country_name into v_country_name from country_code where country_id= v_country_id;
    end;
    /

    以下演示如何在replicat中调用SP获取额外的字段值。

    REPLICAT gavinrep
    SETENV (NLS_LANG=”AMERICAN_AMERICA.WE8ISO8859P1″)
    SETENV (ORACLE_SID=GGDB2)
    ASSUMETARGETDEFS
    USERID idit_prd,PASSWORD idit_prd
    MAP idit_prd.customers, TARGET idit_prd.customers, &
    SQLEXEC (SPNAME GET_COUNTRY, &
    PARAMS (v_country_id = country_id)),&
    COLMAP (USEDEFAULTS, country_name = @getval (GET_COUNTRY.V_COUNTRY_NAME) );

    除了上面的应用,还可以获取多个字段计算后的值到目标字段,从而实现简单的ETL转换。

    参数说明方法:

    在复制端配置如下�以SQL为例�procedure是一样的�改成过程名即可�� 
    /*** 
    replicat repjoin 
    userid ddw,password ddw    
    sourcedefs d:	oolsGGgg10gdirdefextjo.ref 
    reperror default,discard 
    discardfile D:
    epjoin.dsc,append,megabytes 100 
    gettruncates 
    map ddw.a1test, target ddw.a12test, 
    sqlexec (id testid,
    --自定义执行语句的唯一标识
     
    query "select name,value1 from a2test where name_id=:id_param",
     --:id_param为输入参数
     
    params (id_param = NAME_ID)),
     --将输入参数指定为源表中某列 
               如果没有输入参数�则这部分改为NOPARAMS
     
    colmap (USEDEFAULTS, name = testid.name, value1 = testid.value1); 
    --新的字段映射�testid.name表示语句输出参数name
     
    ***/ 

    自我测试:-----ogg最终可以调用成功

    
    MAP pdb.test.tab_1, TARGET pdb.test.tab_1, &
    SQLEXEC (ID lookup, &
    QUERY "select '88888888888888888888888888888' cname from test.tab_1 where col1 = :v_col_1", &
    PARAMS (v_col_1 = col1)), &
    COLMAP (USEDEFAULTS, col3 = @GETVAL(lookup.cname) );

    ---可用的方法,调用数据库的函数的方法:                                                                                                                                                                                            
    MAP pdb.test.tab_1, TARGET pdb.test.tab_1, &
    SQLEXEC (ID lookup, &
    QUERY "select :a||to_char(:b) riqi from dual", &
    PARAMS (a = col1,b = col2)), &
    COLMAP (USEDEFAULTS, col3 = @GETVAL(lookup.riqi) );

    或者:

    MAP pdb.test.tab_1, TARGET pdb.test.tab_1, SQLEXEC (ID lookup, QUERY "select :a||to_char(:b) riqi from dual", PARAMS (a = col1,b = col2)), COLMAP (USEDEFAULTS, col3 = @GETVAL(lookup.riqi) );

  • 相关阅读:
    vuecli3.0 优雅使用svg
    解决vueRouter 跳转相同路由报错
    vue项目中使用 web worker 开启多线程
    项目经常使用的common.js 方法
    vue实现3D词云
    怎么禁止用户点击f12查看数据,查看网页代码,布局样式
    1:vue项目优化总结
    手写一个发布订阅
    vue3.0 reactive 理解
    ifram父子组件传参
  • 原文地址:https://www.cnblogs.com/chendian0/p/14741892.html
Copyright © 2011-2022 走看看