Seite 1 von 2

Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:13
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

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:19
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

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:28
von Nexx
Die Variable wird erst in der Abfrage gefüllt.

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:29
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ß?

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:39
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?

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 12:46
von akretschmer
schau dir einfach die Beispiele in dem Link an, den ich Dir schon geschickt habe.

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 13:01
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.

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 13:42
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;

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 13:44
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;

Re: Tabelle als Variable abfragen

Verfasst: Mo 9. Dez 2019, 13:54
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.