Thread: postgres sql assistance
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
-------------------------------------------+---------------------------------------------+-----------
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
Attachment
Hi Arun, can you share the sql used for this insert. Visually it seems some character are affecting the data.
Best regards,
Raul
El mar, 16 ene 2024 a la(s) 9:35 a.m., arun chirappurath (arunsnmimt@gmail.com) escribió:
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 | truecategory 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 showingException 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
On 1/16/24 06:00, Raul Giucich wrote:
Raul, the OP attached the sq.Hi Arun, can you share the sql used for this insert. Visually it seems some character are affecting the data.Best regards,Raul
"invalid input syntax for type boolean: "15""
That is the problem. You can't insert 15 into a column of type "boolean".
On Tue, Jan 16, 2024 at 7:35 AM arun chirappurath <arunsnmimt@gmail.com> wrote:
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 | truecategory 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 showingException 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
On 1/16/24 6:34 AM, arun chirappurath wrote: > I am trying to load data from the temp table to the main table and catch > the exceptions inside another table. I don't have a specific answer, but do have a few comments: - There are much easier ways to do this kind of data load. Search for "postgres data loader" on google. - When you're building your dynamic SQL you almost certainly should have some kind of ORDER BY on the queries pulling data from information_schema. SQL never mandates data ordering except when you specifically use ORDER BY, so the fact that your fields are lining up right now is pure luck. - EXCEPTION WHEN others is kinda dangerous, because it traps *all* errors. It's much safer to find the exact error code. An easy way to do that in psql is \errverbose [1]. In this particular case that might not work well since there's a bunch of different errors you could get that are directly related to a bad row of data. BUT, there's also a bunch of errors you could get that have nothing whatsoever to do with the data you're trying to load (like if there's a bug in your code that's building the INSERT statement). - You should look at the other details you can get via GET STACKED DIAGNOSTICS [2]. As far as I can tell, your script as-written will always return the first column in the target table. Instead you should use COLUMN_NAME. Note that not every error will set that though. 1: https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-META-COMMAND-ERRVERBOSE 2: https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-EXCEPTION-DIAGNOSTICS -- Jim Nasby, Data Architect, Austin TX
Hi Jim,
Architect is pressing for a native procedure to data load.
I shall Google ans try to find more suitable one than writing one by myself.
Thanks again,
Arun
On Wed, 17 Jan, 2024, 01:58 Jim Nasby, <jim.nasby@gmail.com> wrote:
On 1/16/24 6:34 AM, arun chirappurath wrote:
> I am trying to load data from the temp table to the main table and catch
> the exceptions inside another table.
I don't have a specific answer, but do have a few comments:
- There are much easier ways to do this kind of data load. Search for
"postgres data loader" on google.
- When you're building your dynamic SQL you almost certainly should have
some kind of ORDER BY on the queries pulling data from
information_schema. SQL never mandates data ordering except when you
specifically use ORDER BY, so the fact that your fields are lining up
right now is pure luck.
- EXCEPTION WHEN others is kinda dangerous, because it traps *all*
errors. It's much safer to find the exact error code. An easy way to do
that in psql is \errverbose [1]. In this particular case that might not
work well since there's a bunch of different errors you could get that
are directly related to a bad row of data. BUT, there's also a bunch of
errors you could get that have nothing whatsoever to do with the data
you're trying to load (like if there's a bug in your code that's
building the INSERT statement).
- You should look at the other details you can get via GET STACKED
DIAGNOSTICS [2]. As far as I can tell, your script as-written will
always return the first column in the target table. Instead you should
use COLUMN_NAME. Note that not every error will set that though.
1:
https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-META-COMMAND-ERRVERBOSE
2:
https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-EXCEPTION-DIAGNOSTICS
--
Jim Nasby, Data Architect, Austin TX
On 1/16/24 10:04 PM, arun chirappurath wrote: > Architect is pressing for a native procedure to data load. It's possible to write a loader in pl/pgsql but it would be easily twice as complex as where you got on your first attempt. It would also never perform anywhere near as well as a dedicated loader, because there's no way to avoid the temp table (which a native loader doesn't need to use). -- Jim Nasby, Data Architect, Austin TX