Oracle Development
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me
Go Back   Dev Shed ForumsDatabasesOracle Development
Receive the tools necessary to be the rock star of your field. Our 12-month program teaches you the evolving world of multi-channel marketing as well as the complex issues and opportunities found in the industry.

ASP Free and Iron Speed Designer are giving away $5,500+ in FREE licenses. Iron Speed's RAD CASE toolset can save up to 80% of your coding time. One free license per week, one perpetual license per month!
Download and Activate to enter!

Web development can be a daunting task, even for specialists. There is a lot of information to absorb and a lot of technologies to learn in order to manage a superior website. When trying to learn the ropes, developers need a reliable source to introduce new ideas that can be easily implemented. When working on large projects, even web veterans may run into a technology or an aspect of a technology that they are unfamiliar with.

Learn More!


Download to Enter
| Contest Rules

Tutorials | Forums

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
  #1  
Old February 2nd, 2012, 10:31 AM
Midway Midway is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Feb 2012
Posts: 3 Midway User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 1 h 13 m 33 sec
Reputation Power: 0
Loop through records in a table and update

Hi there,

Need some help here please. Sorry new to Oracle. I'm working with Oracle 10g.

I have a table like this;

ID Amount Date
123 5000 Oct-07-2011
123 null Oct-09-2011
124 7000 Oct-14-2011
124 null Oct-17-2011
124 null Oct-24-2011

What I'm trying to do here is loop thruogh the records and update the amount that's null with the previous amount with the same ID.

Some sample code that I follow for this?

Thanks very much for your help.

Reply With Quote
  #2  
Old February 2nd, 2012, 10:58 AM
shammat shammat is offline
Contributing User
Dev Shed Frequenter (2500 - 2999 posts)
 
Join Date: Oct 2003
Location: Germany
Posts: 2,504 shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level) 
Time spent in forums: 1 Month 2 Weeks 5 Days 2 h 15 m 31 sec
Reputation Power: 283
You don't need to update the data, you can simply retrieve it with a single statement:
Code:
select id, 
      amount, 
      the_date,
      lag(amount) over (partition by id order by the_date) as prev_amount
from the_table
order by id, the_date;


Now if you insist on updating it, this would should it:
Code:
merge into the_table t1
using (
   select id, 
          amount, 
          the_date,
          lag(amount) over (partition by id order by the_date) as prev_amount
   from the_table
) t2 on (t1.id = t2.id and t1.amount is null)
when matched then 
  update
     set t1.amount = t2.prev_amount;
(Not tested)

Last edited by shammat : February 2nd, 2012 at 02:28 PM.

Reply With Quote
  #3  
Old February 2nd, 2012, 11:27 AM
Midway Midway is offline
Registered User
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Feb 2012
Posts: 3 Midway User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: 1 h 13 m 33 sec
Reputation Power: 0
Thanks for the reply

Well, I just want to see if the second example does it but is throwing an error "SQL Error: ORA-38104: Columns referenced in the ON Clause cannot be updated: "T1"."NEWFLOAT"
38104. 00000 - "Columns referenced in the ON Clause cannot be updated: %s"
*Cause: LHS of UPDATE SET contains the columns referenced in the ON Clause"

Would you know why?

Reply With Quote
  #4  
Old February 2nd, 2012, 02:28 PM
shammat shammat is offline
Contributing User
Dev Shed Frequenter (2500 - 2999 posts)
 
Join Date: Oct 2003
Location: Germany
Posts: 2,504 shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level)shammat User rank is Captain (20000 - 30000 Reputation Level) 
Time spent in forums: 1 Month 2 Weeks 5 Days 2 h 15 m 31 sec
Reputation Power: 283
Quote:
Originally Posted by Midway
Well, I just want to see if the second example does it but is throwing an error "SQL Error: ORA-38104: Columns referenced in the ON Clause cannot be updated: "T1"."NEWFLOAT"
38104. 00000 - "Columns referenced in the ON Clause cannot be updated: %s"
*Cause: LHS of UPDATE SET contains the columns referenced in the ON Clause"

Would you know why?
Well the error message is quite obvious.
Try this one:
Code:
merge into the_table t1
using (
   select id, 
          amount, 
          the_date,
          lag(amount) over (partition by id order by the_date) as prev_amount
   from the_table
) t2 on (t1.id = t2.id)
when matched then 
  update
     set case 
            when t1.amount is null then = t2.prev_amount
            else t1.amount = t1.amount
         end 

Reply With Quote
Reply

Viewing: Dev Shed ForumsDatabasesOracle Development > Loop through records in a table and update


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump

Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 


Powered by: vBulletin Version 3.0.5
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

© 2003-2012 by Developer Shed. All rights reserved. DS Cluster 10 - Follow our Sitemap