Skip to Content
Technical Articles

Reverse Engineering a table into a hdbview or hdbdd file

I have created a procedure creating a 1:1 view for a source object. This is quite typical for the first abstraction layer l1, the ingestion layer, which are essentially views on top of the tables.

Creating these views is cumbersome as every single table, every column needs to be specified. Or this function is called for each object. It returns the various versions on how you might create a view. To be precise, it returns

  • The create-view SQL command as nclob.
  • The content for a XS hdbview file as nclob.
  • The content for a XSA hdbview file as nclob.
  • The content for a hdbdd file as nclob.

 

The code is also prepared to manage cases where the view is slightly different from the source, e.g. adding or removing a column.

 

PROCEDURE "USER1"."create_hdbview" (
    p_schema_name nvarchar(256),
    p_table_name nvarchar(256),
    p_prefix nvarchar(256),
    p_target_schema_name nvarchar(256),
    p_target_prefix nvarchar(256),
    out p_text_create_view nclob,
    out p_text_hdbview_xs nclob,
    out p_text_hdbview_xsa nclob,
    out p_text_hdbdd nclob
)
   LANGUAGE SQLSCRIPT
   SQL SECURITY INVOKER
   READS SQL DATA AS
BEGIN
    declare v_line nvarchar(500) array;
    declare v_data_type nvarchar(30);
    declare v_count integer;
    declare v_table_name nvarchar(256);
    declare v_view_select nclob;
    declare cursor c1 for 
        select 
            c.column_name,
            c.data_type_name,
            c.length,
            c.scale,
            c.is_nullable,
            c.comments,
            p.is_primary_key
        from table_columns c 
        left outer join constraints p 
        on (p.is_primary_key = 'TRUE' and 
            p.schema_name = c.schema_name and 
            p.table_name = c.table_name and 
            p.column_name = c.column_name)
        where c.schema_name = :p_schema_name and
              c.table_name = :p_table_name
        order by p.position nulls last, c.position;
    declare v_crlf NVARCHAR(2);
    
    v_crlf = BINTOSTR( HEXTOBIN('0D0A') );
    v_table_name = substring(p_table_name, length(p_prefix)+1);
    
    for r_row as c1 do
        v_line[CARDINALITY(:v_line)+1] = '    "' || r_row.column_name || '"';
    end for;
    v_view_select = 'select ' || v_crlf;
    for v_count in 1..CARDINALITY(:v_line) do
        if v_count > 1 then
            v_view_select = v_view_select || ',' || v_crlf;
        end if;
        v_view_select = v_view_select || :v_line[:v_count];
    end for;
    v_view_select = v_view_select || v_crlf;
    v_view_select = v_view_select || 'from "' || 
                    p_schema_name || '"."' || p_table_name || '"';
    p_text_create_view = 'create view "' ||
                         p_target_schema_name || '"."' || p_target_prefix || 
                         v_table_name || '" as ' || v_crlf || 
                         v_view_select || ';' || v_crlf || v_crlf;
    p_text_hdbview_xsa = 'view "' || p_target_prefix || v_table_name || 
                         '" as ' || v_crlf || v_view_select || v_crlf;
    
    p_text_hdbview_xs = 'schema="' || p_target_schema_name || 
                        '";' || v_crlf;
    p_text_hdbview_xs = p_text_hdbview_xs || 'public=false;' || v_crlf;
    p_text_hdbview_xs = p_text_hdbview_xs || 'query="' || 
                        replace(v_view_select, '"', '\"') || 
                        '";' || v_crlf;
    
    p_text_hdbdd = '    View ' || p_target_prefix || 
                   v_table_name || ' as ' || v_crlf;
    p_text_hdbdd = p_text_hdbdd || '        select from "' || 
                   p_table_name || '" {' || v_crlf;
    for v_count in 1..CARDINALITY(:v_line) do
        if v_count > 1 then
            p_text_hdbdd = p_text_hdbdd || ',' || v_crlf;
        end if;
        p_text_hdbdd = p_text_hdbdd || '          ' || :v_line[:v_count];
    end for;
    p_text_hdbdd = p_text_hdbdd || v_crlf;
    p_text_hdbdd = p_text_hdbdd || '        };' || v_crlf;

END

 

 

 

 

Be the first to leave a comment
You must be Logged on to comment or reply to a post.