Reputation: 1
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