• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • The Powerful SQL Upsert

    January 27, 2015 Ted Holt

    As you well know, a common task in business computing is to update an entity (customer, vendor, purchase order line, etc.) that exists, but add the entity if it doesn’t exist. In RPG this requires two operations–an update and a write–within a conditional statement. In SQL one statement handles the whole shebang. Here’s how it works.

    Here’s some RPG III code that illustrates the situation.

    FCUSTF   UF  E           K        DISK
     . . .  code omitted
    C           CUSKEY    KLIST
    C                     KFLD           COMP
    C                     KFLD           ACCT
    C*
     . . .  more code omitted
    C*                                              HILOEQ
    C           CUSKEY    CHAINCUSTREC              99
    C*
     . . . code to load the fields omitted
    C*
    C           *IN99     IFEQ *OFF
    C                     UPDATCUSTREC
    C                     ELSE
    C                     WRITECUSTREC
    C                     ENDIF
     . . . etc.
    

    The program does a random read (CHAIN) to the customer file. If the read is successful (i.e., the customer is in the database), the program turns off indicator 99. If the read fails, indicator 99 comes on.

    Once the fields have been changed, it’s time to store the data in the database. The program uses indicator 99 to control whether to update or add the data.

    In the world of SQL, this type of output operation is informally called an “upsert”, a combination of “update” and “insert”. The SQL statement that handles upserts is MERGE.

    Here’s a program fragment with SQL that does the same sort of thing the RPG III example does.

    D aCompany        s              3p 0
    D aAccount        s              5p 0
    D aName           s             20a
    D aCity           s             15a
    D aState          s              2a
    D aZip            s             10a
    
      exec sql
         merge into custf as tgt
         using (values(:aCompany, :aAccount, :aName,
                       :aCity, :aState, :aZip))
               as src (Company, Account, Name, City, State, Zip)
            on (tgt.Comp, tgt.Acct) = (src.Company, src.Account)
          when matched then
             update set tgt.Comp = src.Company,
                        tgt.Acct = src.Account,
                        tgt.Name = src.Name,
                        tgt.City = src.City,
                        tgt.State = src.State,
                        tgt.Zip   = src.Zip
          when not matched then
             insert values(src.Company, src.Account, src.Name,
                           src.City, src.State, src.Zip);
    

    Host variables aCompany, aAccount, aName, aCity, aState, and aZip have been loaded with the appropriate values and it’s time to store the data in the database. Here’s a breakdown of the MERGE, piece by piece.

    merge into custf as tgt
    

    The database table to be updated is CUSTF, here given a correlation name of tgt (target).

    using (values(:aCompany, :aAccount, :aName,
                  :aCity, :aState, :aZip))
          as src (Company, Account, Name, City, State, Zip)
    

    The data to be merged into the database is in the six aforementioned host variables. The values function groups them into a derived table of one row, known by the correlation name src (source). This derived table has six columns, named Company, Account, Name, City, State, and Zip.

    on (tgt.Comp, tgt.Acct) = (src.Company, src.Account) 
    

    The CUSTF and the derived table created by values are to be matched on company and account number.

    when matched then
       update set tgt.Comp = src.Company,
                  tgt.Acct = src.Account,
                  tgt.Name = src.Name,
                  tgt.City = src.City,
                  tgt.State = src.State,
                  tgt.Zip   = src.Zip
    

    If a row (record) for the company and account is already in CUSTF, update the row with the data from derived table created from the host variables.

    when not matched then
       insert values(src.Company, src.Account, src.Name,
                     src.City, src.State, src.Zip); 
    

    If no row exists for the specified company and account, add a new row to the CUSTF table.

    With a little practice, you’ll soon be upserting with the best of them!

    RELATED STORIES

    Merge Into the Synchronization Fast Lane with DB2 for i 7.1

    Updating Through A Join With SQL, Take Three

    Share this:

    • Share on Reddit (Opens in new window) Reddit
    • Share on Facebook (Opens in new window) Facebook
    • Share on LinkedIn (Opens in new window) LinkedIn
    • Share on X (Opens in new window) X
    • Email a link to a friend (Opens in new window) Email

    Tags:

    Sponsored by
    WorksRight Software

    Do you need area code information?
    Do you need ZIP Code information?
    Do you need ZIP+4 information?
    Do you need city name information?
    Do you need county information?
    Do you need a nearest dealer locator system?

    We can HELP! We have affordable AS/400 software and data to do all of the above. Whether you need a simple city name retrieval system or a sophisticated CASS postal coding system, we have it for you!

    The ZIP/CITY system is based on 5-digit ZIP Codes. You can retrieve city names, state names, county names, area codes, time zones, latitude, longitude, and more just by knowing the ZIP Code. We supply information on all the latest area code changes. A nearest dealer locator function is also included. ZIP/CITY includes software, data, monthly updates, and unlimited support. The cost is $495 per year.

    PER/ZIP4 is a sophisticated CASS certified postal coding system for assigning ZIP Codes, ZIP+4, carrier route, and delivery point codes. PER/ZIP4 also provides county names and FIPS codes. PER/ZIP4 can be used interactively, in batch, and with callable programs. PER/ZIP4 includes software, data, monthly updates, and unlimited support. The cost is $3,900 for the first year, and $1,950 for renewal.

    Just call us and we’ll arrange for 30 days FREE use of either ZIP/CITY or PER/ZIP4.

    WorksRight Software, Inc.
    Phone: 601-856-8337
    Fax: 601-856-9432
    Email: software@worksright.com
    Website: www.worksright.com

    Share this:

    • Share on Reddit (Opens in new window) Reddit
    • Share on Facebook (Opens in new window) Facebook
    • Share on LinkedIn (Opens in new window) LinkedIn
    • Share on X (Opens in new window) X
    • Email a link to a friend (Opens in new window) Email

    Sponsored Links

    Profound Logic Software:  Reach Your Modernization Goals. Register for the February 25 Webinar now!
    New Generation Software:  Ask us about Query, Reporting, and Analytics. Order a FREE Trial of NGS-IQ.
    System i Developer:  Upgrade your skills at the RPG & DB2 Summit in Dallas, March 17-19

    Everybody Likes Shortcuts! Part 2, Playing With Blocks Knee-Deep In Ruby Waters

    Leave a ReplyCancel reply

Volume 15, Number 02 -- January 27, 2015
THIS ISSUE SPONSORED BY:

WorksRight Software
SEQUEL Software
System i Developer

Table of Contents

  • Everybody Likes Shortcuts! Part 2, Playing With Blocks
  • The Powerful SQL Upsert
  • Knee-Deep In Ruby Waters

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • PHP’s Evolution On The IBM i Platform Continues
  • Protecting IBM i Data For The AI Revolution
  • Guru: Two More Small But Handy RPG Enhancements: LIKE(*EXT) And %LOOKUPNE
  • IBM i Integration Gives Costco Shoppers Real-Time Inventory
  • IBM i PTF Guide, Volume 28, Number 33
  • IBM “Price Harmonization” Increases For Power Systems Coming In The New Year
  • Code For i Continues To Grow. Here Is What’s New
  • PowerSC: Your One-Stop Shop For Security On IBM i – And Beyond
  • As I See It: You’ve Been Flocked
  • IBM i PTF Guide, Volume 28, Number 32

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle