From: | Pepe TD Vo <pepevo(at)yahoo(dot)com> |
---|---|
To: | Guillaume Lelarge <guillaume(at)lelarge(dot)info> |
Cc: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Ron <ronljohnsonjr(at)gmail(dot)com>, "pgsql-admin(at)lists(dot)postgresql(dot)org" <pgsql-admin(at)lists(dot)postgresql(dot)org> |
Subject: | Re: query can't merge into table of the other schema |
Date: | 2018-11-12 15:48:36 |
Message-ID: | 1122299377.961941.1542037716174@mail.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-admin |
I tried INSERT ... ON CONFLICT and still not work
CREATE OR REPLACE FUNCTION "CIDR_STAGING"."PR_MIG_STG_G28" (v_Ret OUT int) RETURNS integeras $$declare v_ErrorCode int; v_ErrorMsg varchar(512); v_Module varchar(32) = 'PR_MIG_STG_G28';
begin
---------------------------------- --### MERGING: STG_G28 into SC_G28 ------------------------------------ MERGE INTO cidrdba.sc_g28 prod-- USING (INSERT into cidrdba.sc_g28 prodUSING cidr_staging.STG_G28 stgON ( prod.receipt_number = stg.receipt_number ) WHEN MATCHED THEN UPDATE SET prod.Service_Center = stg.Service_Center,-- prod.Receipt_Number = stg.Receipt_Number, prod.Rep_INS_Attny_ID = stg.Rep_INS_Attny_ID, prod.Rep_State_Num = stg. Rep_State_Num, prod.Rep_VOLAG = stg.Rep_VOLAG, prod.Rep_Rep_Code = stg.Rep_Rep_Code, prod.Rep_Last_Name = stg.Rep_Last_Name, prod.Rep_First_Name = stg.Rep_First_Name, prod.Rep_Middle_Name = stg.Rep_Middle_Name, prod.Rep_Firm_Name = stg.Rep_Firm_Name, prod.Rep_Street = stg.Rep_Street, prod.Rep_Street_2 = stg.Rep_Street_2, prod.Rep_City = stg.Rep_City, prod.Rep_State = stg.Rep_State, prod.Rep_ZIP = stg.Rep_ZIP, prod.Rep_Province = stg.Rep_Province, prod.Rep_Postal_code = stg.Rep_Postal_code, prod.Rep_Country = stg.Rep_Country, prod.mig_filename = stg.mig_filename, --prod.mig_insert_dt = stg.mig_insert_dt, --prod.mig_modified_dt = stg.mig_modified_dt prod.mig_modified_dt = current_timestamp WHEN NOT MATCHED THEN INSERT ( Service_Center, Receipt_Number, Rep_INS_Attny_ID, Rep_State_Num, Rep_VOLAG, Rep_Rep_Code, Rep_Last_Name, Rep_First_Name, Rep_Middle_Name, Rep_Firm_Name, Rep_Street, Rep_Street_2, Rep_City, Rep_State, Rep_ZIP, Rep_Province, Rep_Postal_code, Rep_Country, mig_filename, mig_insert_dt, mig_modified_dt ) SELECT ( stg.Service_Center, stg.Receipt_Number, stg.Rep_INS_Attny_ID, stg.Rep_State_Num, stg.Rep_VOLAG, stg.Rep_Rep_Code, stg.Rep_Last_Name, stg.Rep_First_Name, stg.Rep_Middle_Name, stg.Rep_Firm_Name, stg.Rep_Street, stg.Rep_Street_2, stg.Rep_City, stg.Rep_State, stg.Rep_ZIP, stg.Rep_Province, stg.Rep_Postal_code, stg.Rep_Country, stg.mig_filename, current_timestamp, --stg.mig_insert_dt, null --stg.mig_modified_dt ) ;
---- -- Set the return code to 0 ---- v_Ret := SQLCODE;------ Exception error handler----exception when others then v_ErrorCode := SQLCODE; v_ErrorMsg := SQLERRM; v_Ret := v_ErrorCode;
---- -- Commit the record into the ErrorLog ---- PERFORM pr_write_error_log( sys_context('userenv','session_user'), sys_context('userenv','host'), v_Module, v_ErrorCode, v_ErrorMsg );
---- -- Intentionally leaving the "commit" to application ----end;$$ LANGUAGE plpgsql;
--ERROR: syntax error at or near "prod"LINE 15: INSERT into cidrdba.sc_g28 prod ^SQL state: 42601Character: 452
even with and/or without alias of cidrdba.gc_g28 table
If I do: INSERT into cidrdba.sc_g28 (prod.service_Center,prod.receipt_Number,prod.rep_INS_Attny_ID,prod.rep_State_Num,prod.rep_VOLAG, prod.Rep_Rep_Code, prod.Rep_Last_Name,prod.Rep_First_Name,prod.Rep_Middle_Name, prod.rep_Firm_Name, prod.rep_Street,prod.Rep_Street_2, prod.Rep_City,prod.rep_State,prod.rep_ZIP,prod.rep_Province, prod.Rep_Postal_code, prod.Rep_Country, prod.mig_filename, prod.mig_modified_dt) ( SELECT stg.Service_Center, stg.Receipt_Number, stg.Rep_INS_Attny_ID, stg.Rep_State_Num, stg.Rep_VOLAG, stg.Rep_Rep_Code, stg.Rep_Last_Name, stg.Rep_First_Name, stg.Rep_Middle_Name, stg.Rep_Firm_Name, stg.Rep_Street, stg.Rep_Street_2, stg.Rep_City, stg.Rep_State, stg.rep_ZIP, stg.Rep_Province, stg.Rep_Postal_code, stg.ep_Country, stg.mig_filename, stg.mig_modified_dt FROM cidr_staging.STG_G28 stg ORDER by stg.mig_seq-- ) stg ON CONFLICT ( prod.receipt_number = stg.receipt_number ) WHEN MATCHED THEN UPDATE SET prod.Service_Center = stg.Service_Center,-- prod.Receipt_Number = stg.Receipt_Number, prod.Rep_INS_Attny_ID = stg.Rep_INS_Attny_ID, prod.Rep_State_Num = stg. Rep_State_Num, prod.Rep_VOLAG = stg.Rep_VOLAG, ..... blah ...blah
I get: ERROR: syntax error at or near "ON"LINE 13: ON CONFLICT ( prod.receipt_number = stg.receipt_numbe... ^SQL state: 42601Character: 985
v/r,
Bach-Nga
No one in this world is pure and perfect. If you avoid people for their mistakes you will be alone. So judge less, love and forgive more.To call him a dog hardly seems to do him justice though in as much as he had four legs, a tail, and barked, I admit he was, to all outward appearances. But to those who knew him well, he was a perfect gentleman (Hermione Gingold)
**Live simply **Love generously **Care deeply **Speak kindly.*** Genuinely rich *** Faithful talent *** Sharing success
On Thursday, November 8, 2018 4:16 AM, Guillaume Lelarge <guillaume(at)lelarge(dot)info> wrote:
Hi,
Le mer. 7 nov. 2018 à 23:52, Pepe TD Vo <pepevo(at)yahoo(dot)com> a écrit :
thank you for replying, if there's no Merge stating in Postgres, what statement in Postgres should I use? Update?
INSERT ... ON CONFLICT ... (see https://www.postgresql.org/docs/11/sql-insert.html for details)
I found merge examples on https://wiki.postgresql.org/wiki/MergeTestExamples and the syntax is about the same as Oracle but a function is not working.
Yeah, but at the top of this page, there is this text: "This was never integrated into PostgreSQL, and requires significant work to be production quality".
If I used update syntax it would long implement for this query. I'm not a developer and I'm new to Postgres. Is there a good document you suggest me to use?
The manual would be a good place to start: https://www.postgresql.org/docs/
thank you again. Bach-Nga
No one in this world is pure and perfect. If you avoid people for their mistakes you will be alone. So judge less, love and forgive more.To call him a dog hardly seems to do him justice though in as much as he had four legs, a tail, and barked, I admit he was, to all outward appearances. But to those who knew him well, he was a perfect gentleman (Hermione Gingold)
**Live simply **Love generously **Care deeply **Speak kindly.*** Genuinely rich *** Faithful talent *** Sharing success
On Wednesday, November 7, 2018 5:36 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
Ron <ronljohnsonjr(at)gmail(dot)com> writes:
> On 11/07/2018 09:10 AM, Pepe TD Vo wrote:
>> *ERROR: "cidrdba.sc_date_in" is not a known variable*
> That doesn't look like a "can't merge table from another schema" error.
>> *LINE 13: MERGE INTO cidrdba.sc_date_in prod*
>> * ^*
>> *SQL state: 42601*
>> *Character: 352*
> What happens when you run the statement through psql?
It will fail, of course, since there's no MERGE statement in Postgres.
I think the reason for the weird error is that the plpgsql scanner is
seeing the "INTO cidrdba.sc_date_in" part and trying to process that
as an "INTO plpgsql-variable" clause, before it's fed the rest of the
statement to the core parser, which is what would notice that MERGE
isn't a known command. Maybe we could improve matters by reordering
that processing, but it might be a lot of work for a small benefit.
regards, tom lane
--
Guillaume.
From | Date | Subject | |
---|---|---|---|
Next Message | Rui DeSousa | 2018-11-12 16:30:53 | Re: PostgreSQL 10.5 : Logical replication timeout results in PANIC in pg_wal "No space left on device" |
Previous Message | Achilleas Mantzios | 2018-11-12 14:00:39 | Re: PostgreSQL 10.5 : Strange pg_wal fill-up, solved with the shutdown checkpoint |