Declare variable set = auswählen
Dies klingt vielleicht wie eine wirklich dumme Frage, aber wie kann ich eine variable deklarieren, die für verwendet werden in einer PostgreSQL-9.3-Abfrage?
CREATE or replace FUNCTION public.test()
returns int4
AS
$BODY$
DECLARE
cod_process bigint :=30001;
cod_instance bigint ;
utc_log timestamp without time zone := localtimestamp;
cod_log_type varchar(100) :='information ';
txt_log_text varchar(100):= 'start process';
txt_log varchar(100):= txt_log_text||'_'||cod_process;
set cod_instance= select max(cod_instance) as cod_instance from public.instance where public.instance.cod_process=cod_process;
BEGIN
INSERT INTO public.log (cod_process, cod_instance, utc_log,cod_log_type,txt_log)
VALUES (cod_process, cod_instance, utc_log,cod_log_type,txt_log );
RETURN 11;
END;
$BODY$ LANGUAGE 'plpgsql';
ERROR: type "cod_instance" does not exist SQL state: 42704 Character: 383
Du musst angemeldet sein, um einen Kommentar abzugeben.
Starten Sie die wählen Sie mit den
into
- Klausel innerhalb der eigentlichen code-block nicht in derdeclare
block:Ist es meist nicht so eine gute Idee, um den Variablen (oder Parameter) denselben Namen wie die Spalten in der Tabelle. Es gibt bestimmte Fälle, in denen dies verwirren kann der parser. Zur Vermeidung potentieller Probleme, versuchen Sie es mit anderen Namen für deine Variablen, z.B. durch ein Präfix (z.B.
l_cod_process
stattcod_process
oderl_cod_instance
stattcod_instance
)Mehr details auf variable Zuordnung kann im Handbuch gefunden werden: http://www.postgresql.org/docs/current/static/plpgsql-statements.html
Ihre demo-Funktion funktionieren würde, wie diese:
Wichtigsten Punkte
Du nicht verwenden
SET
eine variable zuordnen. Das ist der SQL-BefehlSET
für die Einstellung run-time-Parameter.Aber Sie kann weisen Sie einer Variablen bei der Deklaration auch eine Unterabfrage verwenden, für, die.
Verwenden
LANGUAGE plpgsql
, nicht. Es ist ein Bezeichner.LANGUAGE 'plpgsql'
@a_horse_with_no_name schon schrieb, über die Benennung von Konflikten.
Mit einem sauberen format geht ein langer Weg beim Debuggen von code ...
Aber wahrscheinlich können Sie vereinfachen zu:
Nennen:
Und abhängig von der tatsächlichen Datentyp der
utc_log
Sie wahrscheinlich wollennow() AT TIME ZONE 'UTC'
: