Question

I am working on an application that will be used to populate the address details of for employees. The address structure will be different for every country.

For the address style mapping I have a table in which I have mapped all the styles.
I have the following requirement:

As shown in the image, I have an address mapping table in which
col1 is for style (wrt country),
col2 for Field_name (The field to be displayed in front end) and
col3 for column_field_name (The name of the column in which the field in col2 will be stored in transaction table.)

![Mapping table Desc][1]

      **ADDRESS_STYLE  FIELD_NAME       COLUMN_FIELD_NAME**

    1   US_GLB  Address Line1                ADDRESS_LINE1
    2   US_GLB  Address Line2                ADDRESS_LINE2
    3   US_GLB  Zip Code                 POSTAL_CODE
    4   US_GLB  Tax Zip Code                 ADD_INFORMATION17
    5   US_GLB  City                         TOWN_OR_CITY
    6   US_GLB  State                        REGION_2
    7   US_GLB  Country                      COUNTRY
    8   US_GLB  Tax Jurisdiction        ADD_INFORMATION15
    9   US_GLB  Tax Jurisdiction Other      ADD_INFORMATION16
    10  US_GLB  Telephone               TELEPHONE_NUMBER_1
    11  US_GLB  Telephone2              TELEPHONE_NUMBER_2

Now I have to write a procedure or function which will take the all the in parameters and insert those in my transaction table as they are mapped in mapping table.

For Ex-(As shown above)
Field Address Line1 will be stored in ADDRESS_LINE1 of transaction table. Field State will be stored in REGION_2 of transaction table.

Was it helpful?

Solution

So in this Proof of Concept I have made two assumptions (maybe three, depends how you count them).

  1. The target ADDRESSES table has an ID column, populated by a sequence.
  2. The column mappings are always in the same order as the columns in the table's projection and that order is guaranteed by a sort column on the mapping table.

The first is just a guess and easy enough to fit to whatever your actual process is.

The second assumption has major ramifications, because if you haven't been disciplined about how the data is entered into the mapping table this implementation won't work reliably. You'll need to replace the loop with eleven separate lookups for each value of FIELD_NAME. Obviously that would be far too tedious for me to code.

create or replace procedure pop_addr_details
    (i_addr_style mapping_table.address_style%type
        , i_Address_Line1  in varchar2
        , i_Address_Line2  in varchar2
        , i_Zip_Code  in varchar2
        , i_Tax_Zip Code  in varchar2
        , i_City  in varchar2
        , i_State  in varchar2
        , i_Country  in varchar2
        , i_Tax_Jurisdiction  in varchar2
        , i_Tax_Jurisdiction Other  in varchar2
        , i_Telephone  in varchar2
        , i_Telephone2  in varchar2 )
is
    stmt varchar2(32767);
begin
    stmt := 'insert into adddresses values (address_id';

    for map_rec in ( select column_field_name 
                     from mapping_table
                     where address_style = i_addr_style
                     order by col_order )
    loop
        stmt := stmt || ',' || map_rec.column_field_name;
    end loop;

    stmt := stmt || ') values ( address_seq.next_val, :1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11)';

    execute immedate stmt using i_Address_Line1  
                , i_Address_Line2  
                , i_Zip_Code  
                , i_Tax_Zip Code  
                , i_City  
                , i_State  
                , i_Country  
                , i_Tax_Jurisdiction  
                , i_Tax_Jurisdiction Other  
                , i_Telephone  
                , i_Telephone2;
end pop_addr_details;
/   

There's a whole chapter on dynamic SQL in the PL/SQL documentation. Find out more.

OTHER TIPS

------------------------------INSERT PROCEDURE-----------------------------

  PROCEDURE GHCM_ADDRESS_INSERT_DTLS_PROC(IN_PERSON_ID   PLS_INTEGER,
                                          I_ADDR_STYLE   VARCHAR2,
                                          IN_ATRRIBUTE1  VARCHAR2,
                                          IN_ATRRIBUTE2  VARCHAR2,
                                          IN_ATRRIBUTE3  VARCHAR2,
                                          IN_ATRRIBUTE4  VARCHAR2,
                                          IN_ATRRIBUTE5  VARCHAR2,
                                          IN_ATRRIBUTE6  VARCHAR2,
                                          IN_ATRRIBUTE7  VARCHAR2,
                                          IN_ATRRIBUTE8  VARCHAR2,
                                          IN_ATRRIBUTE9  VARCHAR2,
                                          IN_ATRRIBUTE10 VARCHAR2,
                                          IN_ATRRIBUTE11 VARCHAR2,
                                          IN_ATRRIBUTE12 VARCHAR2,
                                          IN_ATRRIBUTE13 VARCHAR2,
                                          IN_ATRRIBUTE14 VARCHAR2,
                                          IN_ATRRIBUTE15 VARCHAR2,
                                          IN_ATRRIBUTE16 VARCHAR2,
                                          IN_ATRRIBUTE17 VARCHAR2,
                                          OUT_SUCCESS    OUT VARCHAR2)

   IS
    V_STATEMENT VARCHAR2(1000);
    V_SEQ_ID    PLS_INTEGER;
  BEGIN

    V_STATEMENT := 'INSERT INTO PER_ADDRESS_TEST (ADDRESS_ID,STYLE,IN_PERSON_ID';

    FOR MAP_REC IN (SELECT COLUMN_FIELD_NAME
                      FROM GHCM_ADDRESS_STYLE_MAPING_TBL
                     WHERE STYLE = I_ADDR_STYLE
                       AND DISPLAY_FLAG = 'Y'
                       AND ENABLED_FLAG = 'Y'
                       AND MAPPING_DESC = 'Address Structure'
                     ORDER BY DISPLAY_ORDER_NO) LOOP

      V_STATEMENT := V_STATEMENT || ',' || MAP_REC.COLUMN_FIELD_NAME;
    END LOOP;

    FOR MAP_REC IN (SELECT DISTINCT (COLUMN_FIELD_NAME)
                      FROM GHCM_ADDRESS_STYLE_MAPING_TBL
                     WHERE COLUMN_FIELD_NAME NOT IN
                           (SELECT COLUMN_FIELD_NAME
                              FROM GHCM_ADDRESS_STYLE_MAPING_TBL
                             WHERE STYLE = I_ADDR_STYLE
                               AND DISPLAY_FLAG = 'Y'
                               AND ENABLED_FLAG = 'Y'
                               AND MAPPING_DESC = 'Address Structure')) LOOP

      V_STATEMENT := V_STATEMENT || ',' || MAP_REC.COLUMN_FIELD_NAME;
    END LOOP;

    V_STATEMENT := V_STATEMENT ||
                   ') values ( :1, :2, :3, :4, :5, :6, :7, :8, :9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20)';

    V_SEQ_ID := ADDRESS_SEQ_TEST.NEXTVAL;

    EXECUTE IMMEDIATE V_STATEMENT
      USING V_SEQ_ID, I_ADDR_STYLE, IN_PERSON_ID, IN_ATRRIBUTE1, IN_ATRRIBUTE2, IN_ATRRIBUTE3, IN_ATRRIBUTE4, IN_ATRRIBUTE5, IN_ATRRIBUTE6, IN_ATRRIBUTE7, IN_ATRRIBUTE8, IN_ATRRIBUTE9, IN_ATRRIBUTE10, IN_ATRRIBUTE11, IN_ATRRIBUTE12, IN_ATRRIBUTE13, IN_ATRRIBUTE14, IN_ATRRIBUTE15, IN_ATRRIBUTE16, IN_ATRRIBUTE17;

    COMMIT;
    OUT_SUCCESS := 'Y';
  END;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top