Abfrage funktioniert nicht

Sporty1975

Benutzer
Beiträge
5
Habe eine Abfrage gebastelt, die aber keinen Wert zurückgibt. Es geht um einen Kartendruck, der seit Umstellung auf ein neues Semester nicht mehr funktioniert. Werte sind alle hinterlegt in den abgefragten Feldern...
-- FUNCTION: public.pr_ehf_validierung(character varying)

-- DROP FUNCTION public.pr_ehf_validierung(character varying);

CREATE OR REPLACE FUNCTION public.pr_ehf_validierung(
akartennr character varying)
RETURNS TABLE(kartennr character varying, mtknr character varying, stg character varying, sem character varying, gueltigkeit text, zusatztext text, flag boolean, aufdruck1 text, aufdruck2 character varying, aufdruck text)
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000

AS $BODY$
DECLARE


BEGIN

RETURN query

WITH sm AS (
SELECT pr_getaktsemester() AS aktsm
),
sub AS (
SELECT sg.kartennr_stg AS kartennr,
sg.mtknr,
sg.stg,
CASE
WHEN sg.kzrbe::text <> '3'::text AND sg.biasf::text = stnext.sem::text THEN stnext.sem
WHEN sg.kzrbe::text <> '3'::text AND sg.rue='1' THEN sg.rue_sem
ELSE 'NIR'::character varying
END AS sem,
CASE
WHEN sg.kzrbe::text <> '3'::text AND sg.biasf::text = stnext.sem::text THEN to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text <> '3'::text AND sg.rue='1' AND 'now'::text::date > (stakt.ende) THEN 'gültig bis ' || to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text <> '3'::text AND sg.rue='1' AND 'now'::text::date <= (stakt.ende) THEN 'gültig bis ' || to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text) || ' + Vorsemester'::text
WHEN sg.kzrbe::text <> '3'::text THEN 'gültig bis ' || to_char(stakt.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text = '3'::text AND sg.dtrbes::text = stakt.sem::text AND 'now'::text::date <= sg.dtexm THEN 'gültig bis ' || to_char(sg.dtexm::timestamp with time zone, 'DD.MM.YYYY'::text)
ELSE ''::text
END AS gueltigkeit,

''::text AS zusatztext,
true AS flag,
CASE
WHEN sg.kzrbe::text <> '3'::text AND sg.biasf::text = stnext.sem::text THEN to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text <> '3'::text AND sg.rue='1' AND 'now'::text::date > (stakt.ende) THEN 'gültig bis ' || to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text <> '3'::text AND sg.rue='1' AND 'now'::text::date <= (stakt.ende) THEN 'gültig bis ' || to_char(stnext.ende::timestamp with time zone, 'DD.MM.YYYY'::text) || ' + Vorsemester'::text
WHEN sg.kzrbe::text <> '3'::text THEN 'gültig bis ' || to_char(stakt.ende::timestamp with time zone, 'DD.MM.YYYY'::text)
WHEN sg.kzrbe::text = '3'::text AND sg.dtrbes::text = stakt.sem::text AND 'now'::text::date <= sg.dtexm THEN 'gültig bis ' || to_char(sg.dtexm::timestamp with time zone, 'DD.MM.YYYY'::text)
ELSE ''::text
END AS aufdruck

FROM sos.student_stg sg
LEFT JOIN sm ON true
LEFT JOIN sos.student_stg sg2 ON sg2.stammnr::text = sg.stammnr::text AND (sg2.stg::text || sg2.aaspf::text) <> (sg.stg::text || sg.aaspf::text) AND sg2.dtrbes::text = pr_addsemester(sg.biasf, '-1'::integer)::text AND sg.biasf::text = sm.aktsm::text
LEFT JOIN sos.student_stg sg3 ON sg3.stammnr::text = sg.stammnr::text AND (sg3.stg::text || sg3.aaspf::text) <> (sg.stg::text || sg.aaspf::text) AND sg3.dtrbes::text = pr_addsemester(sg.biasf, '-1'::integer)::text AND sg.biasf::text = pr_addsemester(sm.aktsm, 1)::text
LEFT JOIN keys.fachr f ON f.id = sg.fachr_id
LEFT JOIN keys.semester_termine stakt ON stakt.sem::text = sm.aktsm::text AND stakt.kurz::text = 'semester'::text
LEFT JOIN keys.semester_termine stnext ON stnext.sem::text = pr_addsemester(sm.aktsm, 1)::text AND stnext.kurz::text = 'semester'::text
LEFT JOIN keys.semester_termine stvor ON stvor.sem::text = pr_addsemester(sm.aktsm, '-1'::integer)::text AND stvor.kurz::text = 'semester'::text
WHERE true AND sg.kartennr_stg IS NOT NULL
and substr(sg.kartennr_stg,1,6)=substr(akartennr,1,6)
and (akartennr<>'' and akartennr is not null)
)


SELECT sub.kartennr,
sub.mtknr,
sub.stg,
sub.sem,
sub.gueltigkeit,
sub.zusatztext,
sub.flag,
CASE
WHEN sub.sem::text = ''::text THEN ''::character varying
WHEN "position"(sub.aufdruck::text, '+'::text) > 0 THEN btrim(substr(sub.aufdruck::text, 1, "position"(sub.aufdruck::text, '+'::text) - 1))::character varying
ELSE sub.aufdruck
END AS aufdruck1,
CASE
WHEN sub.sem::text = ''::text THEN ''::text
WHEN "position"(sub.aufdruck::text, '+'::text) > 0 THEN btrim(substr(sub.aufdruck::text, "position"(sub.aufdruck::text, '+'::text) + 1))
ELSE ''::character varying
END AS aufdruck2,
sub.aufdruck --into recBack
FROM sub;


END
$BODY$;

ALTER FUNCTION public.pr_ehf_validierung(character varying)
OWNER TO efhf;



Hoffe jemand erkennt so da evtl. einen Fehler.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
also ich kann via copy&paste die Funktion erstellen, ohne Probleme. Mehr kann ich nicht, dazu fehlen sämtliche nötigen Informationen.

Ein "Abfrage funktioniert nicht" ist nicht zielführend.


Andreas
 

Sporty1975

Benutzer
Beiträge
5
Also es geht um einen Kartendruck für Studierende. Es soll abgefragt werden, ob überhaupt eingeschrieben etc...Dies funktioniert nicht mehr seit dem Wechsel ins neue Semester. Vorher war es kein Problem. Geändert wurde auch nichts.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Tja. Ich bin raus. Es ist an Dir, jetzt Debugging zu betreiben. Also, prüfe ob die Abfrage funktioniert, ob die Unterabfrage in Deinem CTE funktioniert, ob die aufgerufene Funktion funktioniert etc. Beobachte das Log, ob da Fehler kommen. Baue RAISE NOTICE - Anweisungen ein um Zwischenergebnisse auszuwerfen, ...
 

akretschmer

Datenbank-Guru
Beiträge
9.028
wenn da nur 1 steht ohne ' dann ist das automatisch INT. '1' wiederum wäre TEXT, und '1'::int casted den Text '1' in 1, also INT.

Was die Funktion pr_addsemester(sm.aktsm, 1) macht und was sie erwartet wissen wir nicht.
 
Werbung:

Sporty1975

Benutzer
Beiträge
5
pr_addsemester mach folgendes... Wir haben anscheinend das Problem, dass wir bis vor Semesterwechsel auf den Karten stehen hatten +V, also plus vorsemester...das fällt jetzt als Kriterium für die Gültigkeit weg. Wird aber wie es scheint als Validierung noch mit abgefragt. Finde es nur nicht!

-- FUNCTION: public.pr_addsemester(character varying, integer)

-- DROP FUNCTION public.pr_addsemester(character varying, integer);

CREATE OR REPLACE FUNCTION public.pr_addsemester(
asem character varying,
aanz integer)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
IMMUTABLE PARALLEL UNSAFE
AS $BODY$
DECLARE
sResult character varying;
iSem integer;
iJahr integer;
BEGIN
if (length(aSem)<3) then
RETURN null;
end if;

iSem = to_number(substr(aSem,1,1),'9');
iJahr = to_number(substr(aSem,2,2),'99');
iJahr = pr_ExpandJahr(iJahr);
iSem = iSem + aAnz;

while (iSem>2) loop
iJahr = iJahr + 1;
iSem = iSem - 2;
end loop;
while (iSem<1) loop
iJahr = iJahr - 1;
iSem = iSem + 2;
end loop;

-- return to_char(iJahr,'FM0000');
RETURN to_char(iSem,'FM9') || pr_Right(to_char(iJahr,'FM0000'),2);

END;
$BODY$;

ALTER FUNCTION public.pr_addsemester(character varying, integer)
OWNER TO postgres;

GRANT EXECUTE ON FUNCTION public.pr_addsemester(character varying, integer) TO PUBLIC;

GRANT EXECUTE ON FUNCTION public.pr_addsemester(character varying, integer) TO postgres;
 
Oben