Search code examples
sqlhashhanasha

SQL Update Statement based on Procedure in SAP HANA


I'm creating an update statement that generate SHA256 for table columns based on table's name

1st Step: I created a procedure that get the table columns, concatenate it all in one columns, then format to a desired format.

-- Procedure code : Extract table's columns list, concatenate it and format it

Create procedure SHA_PREP (in inp1 nvarchar(20))
as 
begin

SELECT concat(concat('hash_sha256(',STRING_AGG(A, ', ')),')')  AS Names
FROM (
    SELECT  concat('to_varbinary(IFNULL("',concat(COLUMN_NAME,'",''0''))')) as A
    FROM    SYS.TABLE_COLUMNS
    WHERE SCHEMA_NAME = 'SCHEMA_NAME' AND TABLE_NAME = :inp1
    AND COLUMN_NAME not in ('SHA')
    ORDER BY POSITION 
    );
end;

/* Result of this procedures : 
hash_sha256(
to_varbinary("ID"),to_varbinary(IFNULL("COL1",'0')),to_varbinary(IFNULL("COL2",'0')) )
*/

-- Update Statement needed 

UPDATE "SCHEMA_NAME"."TABLE_NAME"
SET "SHA" = CALL "SCHEMA_NAME"."SHA_PREP"('SCHEMA_NAME')
WHERE "ID" = 99 -- a random filter

Solution

  • I find a solution that suits my need, but maybe there's other easier or more suitable approchaes :

    I added the update statement to my procedure, and inserted all the generated query into a temporary table column, the excuted it using EXECUTE IMMEDIATE

    Create procedure SHA_PREP (in inp1 nvarchar(20))
    as 
    begin
    /* ********************************************************** */
    DECLARE SQL_STR VARCHAR(5000);
    
    -- Create a temporary table to store a query in
    create local temporary table #temp1 (QUERY varchar(5000));
    -- Insert the desirable query into the QUERY column (Temp Table)
    insert into #temp1(QUERY)
    SELECT concat('UPDATE "SCHEMA_NAME"."TABLE_NAME" SET "SHA" =' ,concat(concat('hash_sha256(',STRING_AGG(A, ', ')),')'))
    FROM (
        SELECT  concat('to_varbinary(IFNULL("',concat(COLUMN_NAME,'",''0''))')) as A
        FROM    SYS.TABLE_COLUMNS
        WHERE SCHEMA_NAME = 'SCHEMA_NAME' AND TABLE_NAME = :inp1
        AND COLUMN_NAME not in ('SHA')
        ORDER BY POSITION 
        );
    end;
    /* QUERY : UPDATE "SCHEMA_NAME"."TABLE_NAME" SET "SHA" = 
    hash_sha256(to_varbinary("ID"),to_varbinary(IFNULL("COL1",'0')),to_varbinary(IFNULL("COL2",'0'))) */
    SELECT QUERY into SQL_STR FROM "SCHEMA_NAME".#temp1;
    
    --Excuting the query 
    EXECUTE IMMEDIATE (:SQL_STR);
    
    -- Dropping the temporary table 
    DROP TABLE "SCHEMA_NAME".#temp1;
    
    /* ********************************************************** */
    end;
    

    Any other solution or improvement are well welcomed Thank you