Function call in sql script

Hi,
Ich probiere von Bash script aus mit

$PSQL -h $dbhost -d $dbnaam -U $dbusr -f $sqlscript -v nBid=$bid -v sStation=$SRV

das SQL Script in $sqlscript an zu rufen, und das geht aber in diesem Script ich rufe eine Function an. Mit

SELECT AutoContractInvoicing(1);

das resultat ist

ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.

mit PERFORM, geht es nicht fur das ist nur fur inner ein PL/PGSQL script wie eine Function.

Ist dar einer losung zur diesen problem ?

Nunki.

Was passiert in der Funktion AutoContractInvoicing(int) ? Von da kommt offenbar Dein Fehler, in dieser solltest Du das PERFORM nutzen.

Der Funktion ist eine normalen function der keine Return habe.

CREATE OR REPLACE FUNCTION AutoContractInvoicing(nBid INTEGER) RETURNS VOID AS $func$

Ich habe es auch mit PERFORM probiert, aber dann gibts es der Fehler

ERROR:  syntax error at or near "PERFORM"
LINE 1: PERFORM AutoContractInvoicing(1);

Auch wann ich nur in bash script mit -c option arbeite, gibt es die gleiche Error

#!/bin/bash
#
# [ppk] 23/04/2017 initial version

PSQL=/usr/bin/psql
DBSERV="192.168.99.6"


$PSQL -h $DBSERV -d quill -U live -c "PERFORM AutoContractInvoicing(1);"

Danke,
Nunki

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.

Innerhalb

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.

Danke,
Nunki

SELECT * FROM AutoCreateInvoice(rC.id,false,nBid);

ist das Problem. Das Ergebnis muss irgendwo gespeichert werden. Wenn Du das nicht willst, nimm

perform AutoCreateInvoice(rC.id,false,nBid);

Und warum nur speicherst Du ein Datum als VARCHAR? Das sollte man NIEMALS machen.

die gezeigte Funktion war eine plpgsql-Funktion.

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.