×

Good News Everybody!

The new search engine is LIVE!

Please report any problems to david (at) midrange.com.




You must tell MERGE the data types of the fields contained within the VALUES clause.



MERGE INTO arp001 USING (VALUES (

Cast( :value1 as Decimal(15,0)),

Cast( :value2 as Varchar(100))

)) AS newdata (cmcust, cmname)

ON arp001.cmcust = newdata.cmcust

WHEN NOT MATCHED THEN INSERT (cmcust, cmname) VALUES

(newdata.cmcust, newdata.cmname)

WHEN MATCHED THEN UPDATE SET cmname = newdata.cmname;





Here is an SQL statement I've written to generate an SQL Merge statement from system tables.

https://gist.github.com/chrishiebert/2c496d9ca09b2f4a3bc493cd6caa77c2

It may not work for all data types, but it gets you closer than writing everything from scratch.
I wrote the statement on V7R3.

--
Chris Hiebert
Senior Programmer/Analyst
Disclaimer: Any views or opinions presented are solely those of the author and do not necessarily represent those of the company.

From: MIDRANGE-L <midrange-l-bounces@xxxxxxxxxxxxxxxxxx> On Behalf Of x y
Sent: Saturday, July 29, 2023 11:21 PM
To: Midrange Systems Technical Discussion <midrange-l@xxxxxxxxxxxxxxxxxx>
Subject: SQL MERGE


In a data conversion exercise, I'm getting dirty data and that's causing

lots of duplicate key exceptions (which appear to have a big performance

hit). Using MERGE came up as a potential solution and I RTFM (meaning I

Googled).



Following an example in the z/OS DB2 manual, this works:

MERGE INTO arp001 USING (VALUES ('X1', 'X1 DESC'))

AS newdata (cmcust, cmname)

ON arp001.cmcust = newdata.cmcust

WHEN NOT MATCHED THEN *INSERT* (cmcust, cmname) VALUES

(newdata.cmcust, newdata.cmname)

WHEN MATCHED THEN UPDATE SET cmname = newdata.cmname;



But this doesn't. The change is in using program variables instead of

literals.

MERGE INTO arp001 USING (VALUES (:value1, :value2))

AS newdata (cmcust, cmname)

ON arp001.cmcust = newdata.cmcust

WHEN NOT MATCHED THEN *INSERT* (cmcust, cmname) VALUES

(newdata.cmcust, newdata.cmname)

WHEN MATCHED THEN UPDATE SET cmname = newdata.cmname;



Message: [SQL0584] NULL, UNKNOWN, or parameter marker in VALUES not

allowed. Cause . . . . . : Each column in a VALUES clause must have a

data type. All rows for a column cannot contain NULL, UNKNOWN, a parameter

marker, or the RAISE_ERROR scalar function. Recovery . . . : Ensure

every column has at least one value with a defined type. A CAST

specification can be used to assign a type. Try the request again.



Table ARP001 has more than two columns, all type 3 (not null with default).



ACS's "Run SQL Scripts" option provides this example:

MERGE INTO t1 USING

(SELECT id, c2 FROM t2) x ON

t1.id = x.id

WHEN NOT MATCHED THEN *INSERT* VALUES (id, c2)

WHEN MATCHED THEN UPDATE SET c2 = x.c2;



It appears that either program variables aren't allowed or I have to

specify every column name in WHEN NOT MATCHED.



Suggestions/solutions will be appreciated--thank you!

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2026 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.