[PGSQL/SP] Check of een regel bestaat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Storeman storeman

storeman storeman

01/12/2008 16:21:00
Quote Anchor link
Ik loop weer tegen iets aan in Postgresql icm Stored procedures:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION invoice.get_supplier_name(IN invoice_id bigint)
  RETURNS character varying(255) AS
$BODY$
DECLARE
    p_supplier_id bigint;
    p_suppliername character varying(255);
BEGIN

    
    p_supplier_id := 'camper_rental_id FROM invoice.invoice_campersupplier WHERE invoice_id = ' || invoice_id ;

    IF p_supplier_id IS NOT NULL THEN
        p_suppliername := 'name FROM camper.rentals WHERE id = ' || p_supplier_id;
        RETURN p_suppliername;
    END IF;


    RETURN null;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;


Nu weet ik niet zeker of deze relatie bestaat. Hoe kan ik dit controleren? Ik zit te denken aan een try-catch achtige manier, aangezien dit er met een harde error uiklapt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
ERROR:  invalid input syntax for integer: "camper_rental_id FROM invoice.invoice_campersupplier WHERE invoice_id = 13"
CONTEXT:  PL/pgSQL function "get_supplier_name" line 7 at assignment


Ik moet deze check met nog 5 tabellen doen om zo de werkelijke supplier te kunnen achterhalen.
 
PHP hulp

PHP hulp

29/03/2024 16:11:57
 
Yorick17

yorick17

01/12/2008 16:23:00
Quote Anchor link
??
Gewijzigd op 01/01/1970 01:00:00 door yorick17
 
Storeman storeman

storeman storeman

01/12/2008 16:39:00
Quote Anchor link
@yorick: In hoeverre heb jij verstand van postgresql en stored procedures. (ik wil dit keer niet flamen, maar aan je reacties op het forum te zien denk ik dat).

Ik quote mezelf nog even:

Nu weet ik niet zeker of deze relatie bestaat. Hoe kan ik dit controleren? Ik zit te denken aan een try-catch achtige manier


Daardoor klapt regel 10 in een fout. Wat mogelijk is omdat de rij niet hoeft te bestaan, maar hoe kan ik dit ondervangen?
 
Frank -

Frank -

01/12/2008 17:50:00
Quote Anchor link
Je voert nergens een query uit, je kunt dus onmogelijk een resultaat retourneren.

De foutmelding duidt overigens op een andere fout:
p_supplier_id bigint;

En dan:
p_supplier_id := 'camper_rental_id FROM invoice.invoice_campersupplier WHERE invoice_id = ' || invoice_id ;

Wanneer p_supplier_id van het datatype BIGINT moet zijn, kun je daar onmogelijk een string in gaan zetten. De melding "invalid input syntax for integer: " is dan ook vrij logisch.

Ik snap trouwens niet waarom je 5 tabellen met een stored procedure wilt gaan benaderen om de naam van een supplier te achterhalen. Dat klinkt mij eerder in de oren als een JOIN...
 
Storeman storeman

storeman storeman

01/12/2008 18:09:00
Quote Anchor link
@pgFrank, held :).

Ik meen toch dat dit een soort van query is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
p_supplier_id := 'camper_rental_id FROM invoice.invoice_campersupplier WHERE invoice_id = ' || invoice_id ;


Hierbij is ook de camper_rental_id wel een bigint, echter geeft deze query geen resultaat terug omdat deze rij gewoon niet bestaat in de koppeltabel.

Ik zal iets meer uitleggen over de tabelstructuur:

campersupplier <- camperkoppeltabel <-+ factuur
autosupplier <- carkoppeltabel <-+
ferrysupplier <- ferrykoppeltabel <-+

De factuur kan maar gekoppeld zijn aan één van de suppliers en nu wil ik dus achterhalen welke dat is. Een join zou ook kunnen.
 
Frank -

Frank -

01/12/2008 18:18:00
Quote Anchor link
Quote:
Ik meen toch dat dit een soort van query is:

Het is een string en geen query, zie de foutmelding.

Ik zie nergens een EXECUTE, je voert de string dus nergens uit, er wordt dus nergens een query uitgevoerd.

Tip: Gebruik een "gewone" query met een JOIN, dat maakt het leven een heel stuk eenvoudiger. Deze query kun je dan wel weer in een VIEW zetten, dat maakt het later nog eenvoudiger om de data te gebruiken. Tevens veiliger, niemand heeft toegang tot de tabellen nodig. Nooit.

Ps. Jouw datamodel rammelt wat, aparte tabellen voor de camper/auto/ferry-suppliers lijken mij niet handig. Ik kan me voorstellen dat je dan dubbele data moet gaan opslaan. Neem een supplier en noteer dan in een koppeltabel welke producten hij levert. Bv. een auto of een camper.
 
Storeman storeman

storeman storeman

01/12/2008 20:20:00
Quote Anchor link
Klopt, het datamodel is niet helemaal correct. Echter had ik dit niet zien aankomen toen ik begon met ontwikkelen van de applicatie. Deze bestaat onderhand uit meer dan 80 tabellen wat toch mijn eerste projecten is die die orde van grootte aan tabellen bevat. Daarnaast zijn alle modules (camper, ferry, car etc) nu gescheiden dmv schema's. Er zijn nog wel meer inconsistente dingen ontstaan ten gevolge van het iteratief ontwikkelen. Ik zou wel anders willen, maar daar is helaas geen tijd voor.

Het alternatief voor een dergelijke koppeling is de tabelnaam opslaan in een tabel, hier ben ik echter niet zo'n fan van.

Ik keek eroverheen dat het nu inderdaad een string is in plaats van query, hoe stom:S.
 
Frank -

Frank -

01/12/2008 20:33:00
Quote Anchor link
In dit geval gewoon voor ieder onderdeel een query maken en dan kijken welke query een resultaat oplevert. Het is niks bijzonders dat een query geen resultaat oplevert, dat is de gewoonste zaak van de wereld.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.