How to avoid Multiple rows in a SP?
Posted in 2010
Topics: SQL Development & Query Writing, Stored Procedures & SPL, Data Types & Schema Design, Jobs, Consulting & Announcements
Hello all. I'm new to informix and I'm testing the SP routines.
how can achieve to bypass the "A subquery has returned not exactly one row."
message when I'm building the SP:
------------------SP----------Code
CREATE PROCEDURE Phtotgraph_Summary_SP(photograph_classification LIKE
fotografs.classificacio_fotograf)
RETURNING CHAR(100) as Photograph, INTEGER as total_Expositions, CHAR(50) as
record_Exposition, INTEGER as num_photos
DEFINE photographCode varchar(8);
DEFINE photographName varchar(100);
DEFINE totalExpositions int;
DEFINE averagePhotos decimal(5,2);
DEFINE recordExposition varchar(50);
DEFINE numPhotos int;
FOREACH cursor
FOR SELECT ph.passaport,ph.nom, count(distinct ex.codi_exposicio) INTO
photographCode,photographName, totalExpositions
FROM fotografs ph, exposen ex
where ph.passaport = ex.passaport
group by ph.passaport, ph.nom
Select max(ex.num_fotos) INTO numPhotos from exposen ex, Exposicions exp ,
fotografs ph
where ex.codi_exposicio = exp.codi_exposicio and ph.passaport = ex.passaport
and ph.passaport = photographCode;
select exp.titol INTO recordExposition from exposen ex, Exposicions exp ,
fotografs ph
where ex.codi_exposicio = exp.codi_exposicio and ph.passaport = ex.passaport
and ph.passaport = photographCode
group by exp.titol
having max(ex.num_fotos)= numPhotos;
RETURN photographName, totalExpositions,recordExposition,numPhotos WITH RESUME;
END FOREACH;
END PROCEDURE;
---End SP Code--------------
With tables:
Exposen:
passaport codi_exposicio num_fotos descompte
11111111 1 4 0
11111111 2 10 5
11111111 3 4 11
11111111 4 20 10
11111111 8 15 20
22222222 1 1 5
22222222 3 2 0
22222222 4 3 4
22222222 5 1 0
33333333 1 10 20
33333333 2 15 15
33333333 3 30 50
33333333 4 30 80
33333333 5 20 10
33333333 6 30 40
33333333 7 10 30
44444444 1 12 10
66666666 1 101 2
Exposicions:
codi_exposicio titol preu data_inici data_final
1 Exposicià Fira Barcelona 20,1 oct 01, 2009 oct 15, 2009
2 Exposicià Fira BerlÌn 40,49 oct 10, 2009 oct 20, 2009
3 Exposicià Fira Londres 70,2 nov 03, 2009 nov 23, 2009
4 Exposicià Internacional ParÌs 30,1 dic 01, 2009 dic 15, 2009
5 Exposicià Europea Roma 15,99 dic 16, 2009 dic 20, 2009
6 Exposicià Itinerant Budapest 12,39 ene 03, 2010 ene 15, 2010
7 Exposicià Nous valors 9,43 dic 15, 2009 dic 19, 2009
8 Exposicià Realisme fotogr‡fic 25,4 feb 15, 2009 feb 24, 2009
fotografs:
passaport nom adreca telefon pais classificacio_fotograf
11111111 Pere Garcia Garcia Balmes, barcelona 931111111 Spain Ocasional
22222222 John Smith 42th New York 93222222 EEUU Ocasional
33333333 Joao Belfor Grandao, Lisboa 93333333 Portugal Ocasional
44444444 FranÃois Lucart Rue LAville, PAris 9344444 France Ocasional
55555555 Juan Mendez grande, Buenos Aires 9355555 Argentina Ocasional
66666666 Ferran Domenech RosellÛ, Barcelona 936666 Spain Ocasional
77777777 Beltran Rodriguez Gran via, Madrid 937777777 Spain Ocasional
88888888 Roberto Libiano vitali, Roma 9388888 Italy Ocasional
99999999 Johann Lieberung franciscaner, Berlin 93999999 Germany Ocasional
00000000 JosÈ Argoitxo Grande, Bilbao 9300000 Spain Ocasional
00000001 Boris Valkinov MoscË™ 93575185 Russia Ocasional
12894578 Joao Sousa Rua Algarve, 12 111111 Portugal Ocasional
59258743 Kenny Rogers 64, Smith St. 222222 Estados Unidos Ocasional
09884323 Alain Poulet Rue Guerlain, 34 333333 Canad· Ocasional
23663233 Henrich Schoffer Bonn Strasse 23 444444 Alemania Ocasional
56898743 Jaume Busquets Consell de Cent, 2 555555 EspaÃ’a Ocasional
You need a cursor. If you have IDS 11.50 you can declare a cursor for the
query that returns multiple rows directly and use a WHILE ... END WHILE loop
or LOOP ... END LOOP loop with a FETCH statement inside, if you are using
any earlier version of Informix you need to use a FOREACH loop (FOREACH ...
END FOREACH is equivalent to DECLARE...CURSOR FOR...; OPEN CURSOR...; LOOP
FETCH...; END LOOP;). Either way the RETURN WITH RESUME would go inside the
loop that's driving the query. See the example code in the manuals.
Art
Art S. Kagel
Advanced DataTools (www.advancedatatools.com)
IIUG Board of Directors (art@iiug.org)
Disclaimer: Please keep in mind that my own opinions are my own opinions and
do not reflect on my employer, Advanced DataTools, the IIUG, nor any other
organization with which I am associated either explicitly, implicitly, or by
inference. Neither do those opinions reflect those of other individuals
affiliated with any entity with which I am affiliated nor those of the
entities themselves.
On Sat, May 22, 2010 at 11:45 AM, PERE CASTANYER
<perecastanyer@gmail.com>wrote:
> Hello all. I'm new to informix and I'm testing the SP routines.
>
> how can achieve to bypass the "A subquery has returned not exactly one
> row."
> message when I'm building the SP:
>
> ------------------SP----------Code
> CREATE PROCEDURE Phtotgraph_Summary_SP(photograph_classification LIKE
> fotografs.classificacio_fotograf)
> RETURNING CHAR(100) as Photograph, INTEGER as total_Expositions, CHAR(50)> as
> record_Exposition, INTEGER as num_photos
>
> DEFINE photographCode varchar(8);
> DEFINE photographName varchar(100);
> DEFINE totalExpositions int;
> DEFINE averagePhotos decimal(5,2);
> DEFINE recordExposition varchar(50);
> DEFINE numPhotos int;
>
> FOREACH cursor
>
> FOR SELECT ph.passaport,ph.nom, count(distinct ex.codi_exposicio) INTO
> photographCode,photographName, totalExpositions
>
> FROM fotografs ph, exposen ex
>
> where ph.passaport = ex.passaport
>
> group by ph.passaport, ph.nom
>
> Select max(ex.num_fotos) INTO numPhotos from exposen ex, Exposicions exp ,
> fotografs ph
>
> where ex.codi_exposicio = exp.codi_exposicio and ph.passaport =
> ex.passaport
> and ph.passaport = photographCode;
>
> select exp.titol INTO recordExposition from exposen ex, Exposicions exp ,
> fotografs ph
>
> where ex.codi_exposicio = exp.codi_exposicio and ph.passaport =
> ex.passaport
> and ph.passaport = photographCode
>
> group by exp.titol
>
> having max(ex.num_fotos)= numPhotos;
>
> RETURN photographName, totalExpositions,recordExposition,numPhotos WITH
> RESUME;
>
> END FOREACH;
> END PROCEDURE;
>
> ---End SP Code--------------
>
> With tables:
>
> Exposen:
>
> passaport codi_exposicio num_fotos descompte
> 11111111 1 4 0
> 11111111 2 10 5
> 11111111 3 4 11
> 11111111 4 20 10
> 11111111 8 15 20
> 22222222 1 1 5
> 22222222 3 2 0
> 22222222 4 3 4
> 22222222 5 1 0
> 33333333 1 10 20
> 33333333 2 15 15
> 33333333 3 30 50
> 33333333 4 30 80
> 33333333 5 20 10
> 33333333 6 30 40
> 33333333 7 10 30
> 44444444 1 12 10
> 66666666 1 101 2
>
> Exposicions:
>
> codi_exposicio titol preu data_inici data_final
> 1 Exposicià Fira Barcelona 20,1 oct 01, 2009 oct 15, 2009
> 2 Exposicià Fira BerlÌn 40,49 oct 10, 2009 oct 20, 2009
> 3 Exposicià Fira Londres 70,2 nov 03, 2009 nov 23, 2009
> 4 Exposicià Internacional ParÌs 30,1 dic 01, 2009 dic 15, 2009
> 5 Exposicià Europea Roma 15,99 dic 16, 2009 dic 20, 2009
> 6 Exposicià Itinerant Budapest 12,39 ene 03, 2010 ene 15, 2010
> 7 Exposicià Nous valors 9,43 dic 15, 2009 dic 19, 2009
> 8 Exposicià Realisme fotogr‡fic 25,4 feb 15, 2009 feb 24, 2009
>
> fotografs:
>
> passaport nom adreca telefon pais classificacio_fotograf
> 11111111 Pere Garcia Garcia Balmes, barcelona 931111111 Spain Ocasional
> 22222222 John Smith 42th New York 93222222 EEUU Ocasional
> 33333333 Joao Belfor Grandao, Lisboa 93333333 Portugal Ocasional
> 44444444 Franà ois Lucart Rue LAville, PAris 9344444 France Ocasional
> 55555555 Juan Mendez grande, Buenos Aires 9355555 Argentina Ocasional
> 66666666 Ferran Domenech RosellÛ, Barcelona 936666 Spain Ocasional
> 77777777 Beltran Rodriguez Gran via, Madrid 937777777 Spain Ocasional
> 88888888 Roberto Libiano vitali, Roma 9388888 Italy Ocasional
> 99999999 Johann Lieberung franciscaner, Berlin 93999999 Germany Ocasional
> 00000000 JosÈ Argoitxo Grande, Bilbao 9300000 Spain Ocasional
> 00000001 Boris Valkinov MoscË™ 93575185 Russia Ocasional
> 12894578 Joao Sousa Rua Algarve, 12 111111 Portugal Ocasional
> 59258743 Kenny Rogers 64, Smith St. 222222 Estados Unidos Ocasional
> 09884323 Alain Poulet Rue Guerlain, 34 333333 Canad· Ocasional
> 23663233 Henrich Schoffer Bonn Strasse 23 444444 Alemania Ocasional
> 56898743 Jaume Busquets Consell de Cent, 2 555555 EspaÃ’a Ocasional
>
>
>
>
*******************************************************************************
> Forum Note: Use "Reply" to post a response in the discussion forum.
>
>
--00504502ad23b332020487391c06