Search Postgresql Archives

postgres sql assistance

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear all,

I am an accidental postgres DBA and learning things every day. Apologies for my questions if not properly drafted.

I am trying to load data from the temp table to the main table and catch the exceptions inside another table.

temp table is cast with the main table data type and trying to load the data.

temp table is below.

    category_name                          |            description                      | is_active
-------------------------------------------+---------------------------------------------+-----------
 Tech123212312312323233213123123123123    | Furniture and home decor                    | true
 Tech123212312312323233213123123123123    | Electronic devices and accessories          | true
 Elec                                    | Books of various genres                     | 15
 TV                                      | Books                                       | 12
 cla                                     | Apparel and fashion accessories             | true

category name is varchar(25) and is_active is boolean in main table. So i should get exceptions for 1st,2nd for category_name rows and 4 and 5th rows for boolean. In exception table results,its only showing 

Exception table is below. Here instead of showing exception for value 12 in the is_active table its showing old exception for 15 itself.. Script is attached,,...SQLERRM value is not getting updated for row 12..WHat could be the reason for this?

value too long for type character varying(25) category_name 1 2024-01-16 16:17:01.279 +0530 value too long for type character varying(25) description 2 2024-01-16 16:17:01.279 +0530 invalid input syntax for type boolean: "15" is_active 3 2024-01-16 16:17:01.279 +0530 invalid input syntax for type boolean: "15" 4 2024-01-16 16:17:01.279 +0530 invalid input syntax for type boolean: "15" 5 2024-01-16 16:17:01.279 +0530

CREATE OR REPLACE FUNCTION insert_temp_data_to_main_table()
RETURNS VOID AS $$
DECLARE
    v_main_table_name TEXT := 'main_categories';
    v_temp_table_name TEXT := 'tmp_categories';
    v_error_table_name TEXT := 'error_log_table';
    v_sql_statement TEXT;
BEGIN
    -- Clear the error log table
    EXECUTE 'TRUNCATE TABLE ' || v_error_table_name;

    -- Build the complete SQL statement with aggregated columns and select clauses
    v_sql_statement := format('
        INSERT INTO %I (%s)
        SELECT %s
        FROM %I',
        v_main_table_name,
        (SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_name = v_main_table_name),
        (SELECT string_agg('CAST(' || v_temp_table_name || '.' || column_name || ' AS ' || data_type || ')', ', ') FROM information_schema.columns WHERE table_name = v_temp_table_name),
        v_temp_table_name);

    -- Print the SQL statement
    RAISE NOTICE 'Generated SQL statement: %', v_sql_statement;

    -- Insert data into the main table from the temp table
    EXECUTE v_sql_statement;

EXCEPTION
    WHEN others THEN
        DECLARE
            v_error_msg TEXT;
            v_failed_column_name TEXT;
            v_row_counter INT := 1;
        BEGIN
            -- Get the specific error message
            v_error_msg := SQLERRM;

            -- Get the failed column name
            SELECT column_name INTO v_failed_column_name
            FROM information_schema.columns
            WHERE table_name = v_temp_table_name
            ORDER BY ordinal_position
            LIMIT 1 OFFSET v_row_counter - 1;

            -- Log the error into the error log table
            EXECUTE format('
                INSERT INTO %I (error_message, failed_column_name, failed_row_number)
                VALUES ($1, $2, $3)', v_error_table_name)
            USING v_error_msg, v_failed_column_name, v_row_counter;
        END;
END;
$$ LANGUAGE plpgsql;

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux