Abhat
Abhat

Reputation: 1

Unable to fetch next row from Cursor using for loop in Snowflake procedure

I am trying to read multiple records from a table and use the values for further processing.

Below is the code i used. It got created succcessfully and i was able to call it also. It completed but did not give any return value and it updated only 1st table

DECLARE
    -- Declare a cursor for fetching the rules
     RULE_CURSOR CURSOR FOR
        SELECT RULE_ID, TABLE_NAME, COLUMN_NAME, FIX_TYPE, FIX_DETAILS
        FROM RULES_CONFIG
        WHERE ENABLED = TRUE
        ORDER BY PRIORITY;
        
    -- Declare variables to store values from the cursor
     v_table_name STRING;
    v_column_name STRING;
    v_rule_name STRING;
    v_sql STRING;
    ROWS_AFFECTED INT;

BEGIN
    -- Open the cursor and process each row
    FOR RULE IN RULE_CURSOR DO
        -- Assign cursor values to variables
        v_table_name := RULE.TABLE_NAME;
        v_column_name := RULE.COLUMN_NAME;
        v_rule_name := RULE.FIX_TYPE;

        -- Determine the fix type and build the dynamic SQL
        CASE v_rule_name
            WHEN ''TRIM_VALUES'' THEN
                -- Trim spaces from the column values
                v_sql := ''UPDATE '' || v_table_name || '' SET '' || v_column_name || '' = TRIM('' || v_column_name || '');'';
                EXECUTE IMMEDIATE v_sql;
                RETURN SQLROWCOUNT;
                
            WHEN ''STANDARDIZE_DATE'' THEN
                v_sql := ''UPDATE '' || RULE.TABLE_NAME || '' SET '' || RULE.COLUMN_NAME || '' = TO_DATE('' || RULE.COLUMN_NAME || '', ''''YYYY-MM-DD'''');'';
                EXECUTE IMMEDIATE v_sql;
             WHEN ''REMOVE_NON_PRINTABLE'' THEN
                v_sql := ''UPDATE '' || RULE.TABLE_NAME || '' SET '' || RULE.COLUMN_NAME || '' = REGEXP_REPLACE('' || RULE.COLUMN_NAME || '', ''''[^[:print:]]'''', '''''''');'';
                EXECUTE IMMEDIATE v_sql;
            WHEN ''DEDUPLICATE'' THEN
               v_sql :=  ''DELETE FROM '' || RULE.TABLE_NAME || '' WHERE ROW_NUMBER() OVER (PARTITION BY '' || RULE.FIX_DETAILS || '' ORDER BY CREATED_AT DESC) > 1;'';
               EXECUTE IMMEDIATE v_sql;
        END CASE;

        -- Capture the number of rows affected by the update
          RETURN SQLROWCOUNT;

        -- Log the execution result in FIX_EXECUTION_LOG table
        INSERT INTO FIX_EXECUTION_LOG (TABLE_NAME, COLUMN_NAME, RULE_ID, ROWS_AFFECTED, STATUS, EXECUTED_AT)
        VALUES (v_table_name, v_column_name, RULE.RULE_ID, SQLROWCOUNT, ''SUCCESS'', CURRENT_TIMESTAMP);
    END FOR;

    -- Return a success message after all the updates are processed
    RETURN ''All Fixes Applied Successfully'';
END;
';

Upvotes: 0

Views: 19

Answers (0)

Related Questions