🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #13628

pl/pgsql vraagje

#13628
From: Kristoff Bonne
Date: Wed, 20 Jun 2001 12:48
77 lines
3114 bytes
Gegroet,

Ben voor een project begonnen met een data-base applicatie te
schrijven; en ik zou het willen doen in pl/pgsql (de 'procedural
language' van postgresql).

Het probleem is eigenlijk redelijk simpel.
- Ik heb twee tabellen:
. 'hosts': bevat hostname en IP-adres
. 'aliases': bevat aliasname en hostname.

aliases.hostname is een 'foreign reference' naar hosts.hostname.
hosts.hostname is 'primary key'.
hosts.ipaddress is 'unique not null'.
aliases.aliasname is 'primary key'.
aliases.hostname is 'unique not null'.

Verder is het me redelijk gemakkelijk gelukt om een 'trigger-functie' te
maken om-te-zorgen dat iets niet in zowel host.hostname en
hosts.aliasname kan voorkomen. Dus, 'so far so good'. (Ik ben zeker onder
de indruk van het gebruiksgemak en de mogelijkheden van postgresql).

Echter, probleem:
Ik wil een functie maken ('get_ipaddr') die een query doet.
- Vindt hij hem in de 'hosts'-tabel: dan geen probleem.
- Vindt hij hem in de 'alias'-tabel, dan, zoek eerst het IP-address van
de corresponderende 'hostname' in de hostname-tabel.


Het probleem is wat je moet doen indien hij NIETS vindt?
- Het programma zonder 'RETURN' heeft een foutmelding. "program
  terminated without return".
- RETURN ''; of RETURN ""; heeft een syntax-error.
- RETURN ret;
Dit werkt wel, achter dan krijg je (als je de query doet via deze
functie) altijd een antwoord (1 record). Alleen is die dan 'leeg' bij
een query naar iets dat niet bestaat.
Dit wil ik ook niet; want -indien men een SELECT ... FROM ... WHERE
...;' doet naar iets dat niet bestaat, dan krijg je gewoon 0 records
terug; en dat wil ik ook in de functie hebben.

Iemand enig idee hoe dit op-te-lossen?

Het programma:
--- cut here --- cut here --- cut here ---
DECLARE
        ret inet;

BEGIN
	select into ret
	ipaddr  from hosts
	where hostname = $1;

	IF FOUND
	THEN
	    RETURN ret;
	ELSE
		select into ret
		ipaddr from hosts,aliases
		where
		hosts.hostname = aliases.hostname
		AND aliases.aliasname = $1;

		IF FOUND
		THEN
			RETURN ret;
		ELSE
-- Probleem, wat moet hier komen ???
			RETURN;
		END IF;
	END IF;

END;
--- cut here --- cut here --- cut here ---


Cheerio! Kr. Bonne.
Technical Details
Message-ID: <d26qg9.f67.ln@frigg.belbone.net>
Path: arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!sn-xit-02!supernews.com!news.tele.dk!194.213.69.151!news.algonet.se!algonet!skynet.be!louie!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,7b834f0b4666f6b6,start
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-06-20 05:49:07 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!newsfeed.google.com!sn-xit-02!supernews.com!news.tele.dk!194.213.69.151!news.algonet.se!algonet!skynet.be!louie!not-for-mail
Sender:  <compaqnet@frigg.belbone.net>
From: Kristoff Bonne <kristoff.bonne@compaqnet.nospam.be>
Subject: pl/pgsql vraagje
Newsgroups: be.comp.programming
Organization: I like chaos better! ;-)
Keywords: pl/pgsql postgresql 
User-Agent: tin/1.4.4-20000803 ("Vet for the Insane") (UNIX) (Linux/2.4.3-20mdk (i686))
Date: Wed, 20 Jun 2001 14:48:13 +0200
Message-ID: <d26qg9.f67.ln@frigg.belbone.net>
Lines: 77
NNTP-Posting-Host: 194.78.56.28
X-Trace: 993041344 reader1.news.skynet.be 94458 194.78.56.28
X-Complaints-To: abuse@skynet.be