Subject | Re: [firebird-support] Insert existing record into same table several times |
---|---|
Author | Thomas Beckmann |
Post date | 2014-08-17T05:47:20Z |
Hi Alan!
The reason is very simple:
The first select in your procedure is a singleton select, it can deal
with one record only, because it's no "for select ...". Thus you get an
error, if there are more than one record that match the condition
(quantity>1).
Do
for select Id, description, quantity from Test_table where quantity>1
into :Id1, :description1, :quantity1
do
while (quantity1>1) do
begin
insert into Test_table(Id, description, quantity)
values(:Id1, :description1, 1);
quantity1=quantity1-1;
end
Cheers, Thomas
Mit freundlichen Grüßen,
Thomas Beckmann
Diplom-Informatiker
Wielandstraße 14c • 23558 Lübeck
Tel +49 (22 25) 91 34 - 545 • Fax +49 (22 25) 91 34 - 604
Mail thomas.beckmann@... <mailto:thomas.beckmann@...>
ASSFINET-Logo
*ASSFINET Dienstleistungs-GmbH*
Max-Planck-Straße 14 • 53501 Grafschaft bei Bonn
info@... <mailto:info@...> • www.assfinet.de
<http://www.assfinet.de/>
Geschäftsführer: Dipl. Wirtschaftsinformatiker Marc Rindermann
Registergericht Koblenz HRB 23331
Diese E-Mail enthält vertrauliche Informationen. Wenn Sie nicht der
richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben,
informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist
nicht gestattet.
The reason is very simple:
The first select in your procedure is a singleton select, it can deal
with one record only, because it's no "for select ...". Thus you get an
error, if there are more than one record that match the condition
(quantity>1).
Do
for select Id, description, quantity from Test_table where quantity>1
into :Id1, :description1, :quantity1
do
while (quantity1>1) do
begin
insert into Test_table(Id, description, quantity)
values(:Id1, :description1, 1);
quantity1=quantity1-1;
end
Cheers, Thomas
> create or alter procedure test_table_update--
> as
> declare id1 integer;
> declare description1 char(10);
> declare quantity1 integer;
> begin
> select Id, description, quantity
> from Test_table
> where quantity>1
> into :Id1, :description1, :quantity1;
> while (:quantity1>1) do
> begin
> insert into Test_table(Id, description, quantity)
> values(:Id1, :description1, 1);
> quantity1=quantity1-1;
> end
> update Test_table
> set quantity=1
> where quantity>1;
> end
>
> This works if there is one item with a quantity of more than 1 otherwise
> I get "multiple rows in singleton select" error
>
> Id Description quantity sequence_no
> 1 Beermat 3 1
> 2 Beer Mug 3 2
> 3 Whisky Glass 1 3
>
> Any advice gratefully received.
> Alan
>
> --
> Alan J Davies
> Aldis
>
>
Mit freundlichen Grüßen,
Thomas Beckmann
Diplom-Informatiker
Wielandstraße 14c • 23558 Lübeck
Tel +49 (22 25) 91 34 - 545 • Fax +49 (22 25) 91 34 - 604
Mail thomas.beckmann@... <mailto:thomas.beckmann@...>
ASSFINET-Logo
*ASSFINET Dienstleistungs-GmbH*
Max-Planck-Straße 14 • 53501 Grafschaft bei Bonn
info@... <mailto:info@...> • www.assfinet.de
<http://www.assfinet.de/>
Geschäftsführer: Dipl. Wirtschaftsinformatiker Marc Rindermann
Registergericht Koblenz HRB 23331
Diese E-Mail enthält vertrauliche Informationen. Wenn Sie nicht der
richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben,
informieren Sie bitte sofort den Absender und vernichten Sie diese Mail.
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist
nicht gestattet.