2015-04-07 7 views
9

Ich arbeite an PostgreSQL 8.2.15 (Greenplum Datenbank 4.2.0 Build 1) (HAWQ 1.2.1.0 Build 10335).Fehler: Beziehung existiert nicht, auf greenplum Datenbank

schrieb ich eine Funktion wie

create or replace function my_function ( 
... 
    select exists(select 1 from my_table1 where condition) into result; 

ich es wie

getestet
select my_function(params); 

Es kann völlig arbeiten! Hier

ist das Problem, wenn ich die Funktion wie

select my_function(params) from my_table2; 

Postgres rufen Sie mich an, sagte, du bist falsch!

ERROR: relation "my_table1" does not exist (segXX sliceX xx.xx.xx:40003 pid=570406)

  • Diese Tabellen und Funktion sind in demselben Schema.
  • Ich kann auf sie zugreifen.
  • Beide Namen sind Kleinbuchstaben.

Also, hilf mir bitte.

Was habe ich versucht,

  • bewegen diese Tabellen von my_schema zu öffentlichen
  • Move-Funktion für die öffentliche
  • Schema Präfix wie my_schema.my_table1 hinzufügen.

von 2015.04.19 Herausgegeben

Postgre -> Postgres

Und ich versuchte es wie

select my_function(params) from pg_stat_activity; 

Es ist OK.

Wenn bearbeiten, die wie funktionieren

create or replace function my_function ( 
... 
    select true into result; 

Es befindet sich auf jeden Fall arbeiten kann.

+0

Wenn Sie eine Antwort auf diese benötigen, können Sie es, indem Sie die komplette Funktionsdefinition, die Tabellendefinition, das Schema für jedes Objekt entlang helfen könnte und was Sie bekommen ' SHOW Suchpfad anzeigen. Außerdem: Haben Sie alle Tests in derselben Sitzung mit denselben Einstellungen ausgeführt? BTW, ["Postgre" ist kein akzeptierter Name für Postgres] (https://wiki.postgresql.org/wiki/Identity_Guidelines). –

+0

@Cixy: Ich weiß nicht, ob das der Fall ist, aber erstellen Sie "my_table1" als temporäre Tabelle? AFAIK, Postgres 8.2 hat einen Fehler, der auftritt, wenn Sie versuchen, eine temporäre Tabelle auszuwählen, die von einer Funktion erstellt und von einer anderen ausgewählt wurde. Die Problemumgehung besteht darin, die temporäre Tabelle mit der Anweisung "execute" auszuwählen. Überprüfen Sie dies: http://StackOverflow.com/Questions/19353438/Postgres-doesnt-recognise-Temp-Table-in-Function – Christian

+0

@Christian B. Almeida. Nein, keine temporäre Tabelle. Nur normal – Clxy

Antwort

1

In Postgresql die Funktionen normalerweise im aktuellen Suchpfad der Sitzung ausgeführt, so das Problem möglicherweise, dass das Schema my_schema nicht im aktuellen Suchpfad ist, wenn Sie die Funktion ausführen.

können Sie das Problem lösen, indem die Deklaration Ihrer Funktion zu ändern:

create or replace function my_function (...) ... as $$ 
.... 
$$ language plpgsql set search_path from current; 

(Ich bin nicht sicher, ob dies in der Version funktioniert 8)

Wenn die Klausel set search_path from current nicht funktioniert in 8.2, here ein Beispiel, wie der Suchpfad innerhalb der Funktion temporär eingestellt wird.

+0

Das ist eindeutig nicht, da 'Tabellen und Funktion sind in demselben Schema'. Wenn 'my_table2' gefunden werden kann, gilt das auch für' my_table1'. –

+0

Es würde helfen, ein minimales Beispiel für kompilierbaren Code zu haben, der das Problem aufweist, damit wir es reproduzieren können. –

+0

Entschuldigung, so spät zu antworten. Wir sind auf andere Weise umgezogen. Ich habe deine Antwort heute getestet. Es kann funktionieren (mit der Methode in diesem Link, die Sie gaben). Vielen Dank !!! Versuchen Sie, Bounty hinzuzufügen, aber fehlgeschlagen. Ich werde es später nochmal versuchen. – Clxy

0

Endlich habe ich einen Weg gefunden, nicht perfekt, aber kann arbeiten.

Da ich die Tabelle bei ab Segment zugreifen kann. Wenn Sie diese Funktion aus dem Segment als Unterabfrage verschieben, wird dieses Problem gelöst.

SQL-Skript mag unter:

select t.*, f.* from my_table2 t join (select my_function(params)) f on true; 

Dennoch alle Vorschläge sind willkommen.