Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: cache lookup failed for function ...



On Donnerstag 30 August 2007, Albe Laurenz wrote:
> Rolf Schaufelberger schrieb:
> > Der Ablauf ist  etwa so:
> >
> >  Trigger  T
> > 	ruft Funktion A ( param)
> > 			ruft Funktion B ( param)
> > 				ruft Funktion C ( param)
> >
> > (C ist die F. welche das falsche Ergenis liefert.
> > Wenn ich 	Funktion A ( param) direkt aufrufe, ist das
> > Ergebnis falsch,
> > Rufe ich B oder C direkt auf, ist es richtig.
> > Function C ist eine einfache SQL-Funktion (langauge SQL), A
> > und B sind in
> > plsql geschrieben.
> > Ich habe auch alle drei Funktionen gedroppt, neu geladen,
> > Ergebnis immer noch
> > falsch. Bin ratlos.
>
> Ich glaub's noch immer nicht.
>
> Super wäre ein (vereinfachtes) Code-Beispiel, mit dem
> man das Problem nachvollziehen kann.
>
> Laurenz Albe
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: explain analyze is your friend
Ja, ja,  hatte doch geschrieben, dass der Fehler in der ersten Funktion lag.

Da ich aber schon mal das Problem hatte, dass eine falsche Funktion aufgerufen 
wurde und wegen der Fehlermeldung mit dem cache hatte ich in der falschen 
Richtung gesucht. 
Das erwähnte Problem mit der falschen Funktion funktionjiert folgendermaßen;

Ich habe die Schema:   special1, special2, common, 
und die Funktionen:   special1.ftest, special2.ftest, common.master
common.master ruft dann : perform ftest();
und soll je nach search_path mal die eine mal die andere aufrufen.
Wenn ich nun folgendes mache:
set search_path to special1, common;
select common.master();
set search_path to special2, common;
select common.master();

wird beides mal special1.ftest aufgerufen! 
==================================
CREATE schema special1;
CREATE schema special2;
CREATE schema common;

CREATE OR REPLACE FUNCTION special1.ftest() RETURNS void
  LANGUAGE plpgsql VOLATILE AS
$$BEGIN
	raise notice 'Special 1';
	return;
END;$$;

CREATE OR REPLACE FUNCTION special2.ftest() RETURNS void
  LANGUAGE plpgsql VOLATILE AS
$$BEGIN
	raise notice 'Special 2';
	return;
END;$$;

CREATE OR REPLACE FUNCTION common.master() RETURNS void
  LANGUAGE plpgsql VOLATILE AS
$$BEGIN
   RAISE NOTICE 'Common Master';
   perform  ftest();	
   RETURN;
END;$$;

SET search_path to special1, common;
SELECT common.master();

SET search_path to special2, common;
SELECT common.master();
======================
liefert bei mir:
SET
psql:workspace/trunk/sql/xx.sql:29: NOTICE:  Common Master
psql:workspace/trunk/sql/xx.sql:29: NOTICE:  Special 1
KONTEXT:  SQL statement "SELECT  ftest()"
PL/pgSQL function "master" line 3 at perform
 master
--------

(1 Zeile)

SET
psql:workspace/trunk/sql/xx.sql:32: NOTICE:  Common Master
psql:workspace/trunk/sql/xx.sql:32: NOTICE:  Special 1
KONTEXT:  SQL statement "SELECT  ftest()"
PL/pgSQL function "master" line 3 at perform    

Uups !!!

 
Rolf Schaufelberger



Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group