was ist denn INNERHALB dieser Funktion? Sehr wahrscheinlich steht INNERHALB der Funktion ein SELECT. Dieses sollst Du durch PERFORM ersetzen, NICHT den Aufruf der Funktion selbst.
CREATE OR REPLACE FUNCTION AutoContractInvoicing(nBid INTEGER) RETURNS VOID AS $func$
-- Version: 1.0
-- Timestamp: 24/04/2017 11:05
DECLARE
nDays INTEGER;
rC contracten;
Ccontract CURSOR FOR SELECT * FROM contracten WHERE dstop='' AND bid=nBid AND periodiciteit='Jaarlijks' AND (extract(YEAR from now())||substring(dstart,5,4))>= to_char((now() - nDays * interval '1 day'),'YYYYMMDD');
BEGIN
SELECT waarde FROM v_parms WHERE upper(naam)='CONTRACTEN' AND upper(sleutel)='PREFACTURATIEY' INTO nDays;
OPEN Ccontract;
LOOP
FETCH Ccontract INTO rC;
IF NOT FOUND THEN
EXIT;
END IF;
SELECT * FROM AutoCreateInvoice(rC.id,false,nBid);
UPDATE contracten set dfact=to_char(now(),'YYYYMMDD'),upddt=to_char(now(),'YYYYMMDDHH24MISS'),lact='U' WHERE id=rC.id AND bid=nBid;
END LOOP;
CLOSE Ccontract;
RETURN;
END;
$func$ LANGUAGE plpgsql;
Ich habe jedoch keine Information dass innerhalb ein Funktion, kein SELECT benutzt werden kann.
Anyway. Datum und Zeit als Strings zu speichern mag funktionieren. Nur kannst Du damit dann nicht mehr rechnen und nicht die vielen eingebauten Funktionen nutzen und bei Abfragen wird es damit auch schwer bis unmöglich, Index-basiert nach solchen Werten zu suchen. Das führt also direkt in Probleme - die Frage ist nur, wann Du diese bekommst.
Eine DATE Spalte hat kein “Format” - das ist ja das Gute daran.
Eine DATE oder TIMESETAMP Spalte kann man in jedes beliebige Format überführen ohne Problem zu bekommen.
Ein DATE oder TIMESTAMP als varchar zu speicherm ist eine wirklich, wirklich schlechte Idee. Auch in Oracle, SQL Server oder DB2.
Das sollte man niemals machen.