Hallo,
z.Z. arbeite ich mich in PostgreSQL ein und versuche eine kleine Datenbank, die bisher unter MySql lief, auf PostgreSQL umzuschreiben.
Installiert ist die aktuelle Windows-Version von PostgreSQL unter WinXP.
Im wesentlichen geht es um die 3 nachfolgenden Funktionen:
CREATE OR REPLACE FUNCTION create_table_daten_afa_anlagen() RETURNS void AS $BODY$
DECLARE
v_count integer;
BEGIN
SELECT INTO v_count count(*) FROM pg_tables where tablename = ‘daten_afa_anlagen’;
IF (v_count <> 0) THEN
TRUNCATE TABLE daten_afa_anlagen;
ELSE
CREATE TABLE daten_afa_anlagen
(
Inventarnummer VARCHAR(20) NULL,
Bezeichnung VARCHAR(100) NULL,
Anschaffungsdatum VARCHAR(10) NULL,
Anschaffungskosten NUMERIC (12, 2) NULL,
Buchwert NUMERIC (12, 2) NULL,
Nutzungsdauer INTEGER NULL,
Anlagekonto INTEGER NULL,
AfaArt VARCHAR(25) NULL,
AfaProcent INTEGER NULL,
time_created timestamp null
);
COMMENT ON TABLE daten_afa_anlagen IS ‘Daten für die Anlagen-Verwaltung’;
END IF;
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION do_daten_afa_anlagen() RETURNS void AS $BODY$
DECLARE
rec RECORD;
last_konto integer := 0;
BEGIN
PERFORM create_table_daten_afa_anlagen ();
INSERT INTO daten_afa_anlagen
(
Anschaffungsdatum,
Bezeichnung,
Anschaffungskosten,
Anlagekonto,
time_created
)
SELECT buchungsdaten.belegdatum AS anschaffungsdatum,
buchungsdaten.buchungstext AS bezeichnung,
round (buchungsdaten.buchungsbetrag/(1+kontoplan.ust), 2) as anschaffungskosten,
buchungsdaten.sollkonto as anlagekonto,
now()
FROM buchungsdaten
INNER JOIN konten_anlagen
ON buchungsdaten.sollkonto = konten_anlagen.sollkonto
INNER JOIN kontoplan
ON buchungsdaten.sollkonto = kontoplan.nummer
WHERE lower(buchungsdaten.buchungstext) <> ‘eb-wert’;
END;
$BODY$
LANGUAGE plpgsql;
COMMENT ON FUNCTION do_daten_afa_anlagen() IS ‘Erstellt Buchungssätze für die Anlagenverwaltung’;
CREATE OR REPLACE FUNCTION run_first() RETURNS void AS $BODY$
BEGIN
PERFORM … ; – hier werden noch andere Funktion aufgerufen
PERFORM … ; – hier werden noch andere Funktion aufgerufen
PERFORM … ; – hier werden noch andere Funktion aufgerufen
PERFORM do_daten_afa_anlagen ();
END;
$BODY$
LANGUAGE plpgsql;
Das Problem:
Nachdem ich die Funktionen in die Datenbank eingespielt habe, rufe ich mit dem Abfragetool von pgAdmin III die Funktion run_first (select run_first() auf. Beim ersten Durchlauf ist alles OK. Starte ich direkt danach nochmals die Funktion erhalte ich folgende Fehlermeldung:
ERROR: relation with OID 46236 does not exist
KONTEXT: SQL statement “INSERT INTO daten_afa_anlagen ( Anschaffungsdatum, Bezeichnung, Anschaffungskosten, Anlagekonto, time_created ) SELECT buchungsdaten.belegdatum AS anschaffungsdatum, buchungsdaten.buchungstext AS bezeichnung, round (buchungsdaten.buchungsbetrag/(1+kontoplan.ust), 2) as anschaffungskosten, buchungsdaten.sollkonto as anlagekonto, now() FROM buchungsdaten INNER JOIN konten_anlagen ON buchungsdaten.sollkonto = konten_anlagen.sollkonto INNER JOIN kontoplan ON buchungsdaten.sollkonto = kontoplan.nummer WHERE lower(buchungsdaten.buchungstext) <> ‘eb-wert’”
PL/pgSQL function “do_daten_afa_anlagen” line 13 at SQL statement
SQL statement “SELECT do_daten_afa_anlagen ()”
PL/pgSQL function “run_first” line 47 at perform
Was ist die Ursache für diese Fehlermeldung?
Welchen Fehler habe ich in den erstellten Funktionen eingebaut, den ich nicht sehe?
mfg
Friedrich Stockebrand