Tabelle als Variable abfragen

Fragen und Probleme zu PL/pgSQL.
Nexx
Neuer Benutzer
Beiträge: 8
Registriert: Mo 9. Dez 2019, 12:03

Tabelle als Variable abfragen

Beitrag von Nexx »

Hallo zusammen,

ich bin auf diesem Gebiet relativ frisch unterwegs und alles andere als ein Fachmann.
Hier mein Problem:

Ich möchte zwei Daten (Datum) von einander abziehen um die zeitliche Differenz zu bestimmen. Das klappt auch wunderbar.
Jetzt ist es aber so, dass ich die aktuelle Tabelle in einer Variablen vorliegen habe. Wie bekomme ich in meiner Abfrage das so hin, dass ich das Schema und die Variable verknüpfe?

Beispiel:
select current_date - max(Spalte) from schema.tabelle where ....value into variable;

Das fett dargestellte tabelle ist eine Variable. Ich habe alles abgesucht. Vielleicht auch falsch gesucht, jedoch finde ich nichts hilfreiches dazu.

Danke vorab.

Gruß
Nexx

akretschmer
Erfahrener Benutzer
Beiträge: 7698
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Tabelle als Variable abfragen

Beitrag von akretschmer »

wo liegt diese Variable vor, in Deiner Applikation oder schon in der datenbank?

Falls letzteres: https://www.postgresql.org/docs/12/plpg ... CUTING-DYN
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Nexx
Neuer Benutzer
Beiträge: 8
Registriert: Mo 9. Dez 2019, 12:03

Re: Tabelle als Variable abfragen

Beitrag von Nexx »

Die Variable wird erst in der Abfrage gefüllt.

akretschmer
Erfahrener Benutzer
Beiträge: 7698
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Tabelle als Variable abfragen

Beitrag von akretschmer »

Ja, dann wirst das als dynamisches Statement ausführen müssen.

Alternativ das derzeitige Konzept prüfen. Warum meinst Du, daß das so sein muß?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Nexx
Neuer Benutzer
Beiträge: 8
Registriert: Mo 9. Dez 2019, 12:03

Re: Tabelle als Variable abfragen

Beitrag von Nexx »

Das ist wirklich mein erstes Projekt in diesem Bereich.

Das Ganze liegt als Oracle Programmierung fertig vor.
Ich muss das in Postgresql migrieren.

Daher will ich bei diesem Programm nicht das ganze Konzept ändern.

Wie sieht denn ein dynamisches Statement aus, wenn das Schema feststeht, die Tabelle jedoch als Variable vorliegt?

akretschmer
Erfahrener Benutzer
Beiträge: 7698
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Tabelle als Variable abfragen

Beitrag von akretschmer »

schau dir einfach die Beispiele in dem Link an, den ich Dir schon geschickt habe.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

castorp
Erfahrener Benutzer
Beiträge: 1182
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Tabelle als Variable abfragen

Beitrag von castorp »

Warum zeigst Du uns nicht einfach mal den PL/SQL Code der Oracle Prozedur? Dann müssten wir nicht raten, was genau da passieren soll.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Nexx
Neuer Benutzer
Beiträge: 8
Registriert: Mo 9. Dez 2019, 12:03

Re: Tabelle als Variable abfragen

Beitrag von Nexx »

Hier ist der Quellcode. Das wird als Funktion aufgerufen und bekommt vier Werte übergeben (tab_name, tab_id_name, tab_id_value, hist_cause).
Danke euch.

Mit den Informationen aus deinem Link komme ich nicht weiter.

DECLARE
tmpsql character varying(2000);
tmpcols_tabold character varying(1000);
tmpcols_tabnew character varying(1000);
icount integer;
vtab_hist character varying(30);
itimespan integer;
ielapsedtime integer;

BEGIN
select count(*) into icount from awb.hist_config where table_name = upper(tab_name);

IF icount <> 1 THEN
RAISE EXCEPTION '!! Kein Hist-Tabellenname in der Taballe HIST_CONFIG angegeben !!';
return;
ELSE
select table_hist, delete_time into vtab_hist, itimespan from awb.hist_config where table_name = upper(tab_name);
END IF;

vtab_hist = lower(vtab_hist);

select count(*) into icount from information_schema.tables where table_name = (vtab_hist) and table_schema = 'awb';

IF (hist_cause <> 'D') THEN
select count(*) from information_schema.tables where table_name = (vtab_hist) and table_schema = 'awb' into icount;
IF (icount > 0) THEN
select current_date - max(hist_date) from vtab_hist where schemaname = 'awb' and tab_id_name = tab_id_value into ielapsedtime;
IF (ielapsedtime*86400 < itimespan) THEN
return;
END IF;
END IF;
END IF;
END;

Nexx
Neuer Benutzer
Beiträge: 8
Registriert: Mo 9. Dez 2019, 12:03

Re: Tabelle als Variable abfragen

Beitrag von Nexx »

Quellcode des betroffenen Abschnittes der Oracle DB

if(hist_CAUSE <> 'D') then
EXECUTE IMMEDIATE 'select count(*) from ' || vtab_Hist || ' where ' || tab_ID_NAME || ' = ''' || tab_ID_VALUE || '''' into iCount ;
if (iCount > 0) then
EXECUTE IMMEDIATE 'select SYSDATE-MAX(HIST_DATE) from ' || vtab_Hist|| ' where ' || tab_ID_NAME || ' = ''' || tab_ID_VALUE || '''' into iElapsedTime;
if(iElapsedTime*86400 < iTimeSpan) then
return;
end if;
end if;
end if;

akretschmer
Erfahrener Benutzer
Beiträge: 7698
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Tabelle als Variable abfragen

Beitrag von akretschmer »

Nun, du bekommst ja schon tab_name übergeben. In deinen EXECUTE-statements siehst auch wie das dynamisch zusammengestzt wird, das kannst Du direkt als Vorlage nehmen. Dazu dann das durchlesen, was ich Dir als Link geschickt habe.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten