2017-09-28 1 views
0

Ich erhalte einen Fehler in meiner benutzerdefinierten Funktion, und in einem Ausmaß verstehe ich den Fehler (nicht erkannte Spalte), aber nicht, warum es verursacht wird. Hier ist der minimale Code, den Fehler zu reproduzieren:Postgresql erkennt Variablennamen nicht in WITH-Klausel eingeführt

create table foo (id serial primary key, name varchar not null); 

create table bar (id serial primary key, name varchar not null); 

create function foo_to_bar(foo_id int) returns void as $$ 
begin 
    with _name as (
     select name from foo where id = foo_id 
    ) 
    insert into bar (name) values (_name); 
        -- error here: ~~~~~ 
end; 

$$ language plpgsql; 

insert into foo (name) values ('slimshady'); 
-- id of first entry will be 1 

select foo_to_bar(1); 

Fehler:

ERROR: column "_name" does not exist 
LINE 4:  insert into bar (name) values (_name) 
             ^
HINT: Perhaps you meant to reference the column "bar.name". 
QUERY: with _name as (
     select name from foo where id = foo_id 
    ) 
    insert into bar (name) values (_name) 

Warum es völlig ignoriert die _name, die ich in den geschaffenen with Klausel, drei Zeilen oben, wo der Fehler ausgelöst wird ? Wie behebe ich das?

Antwort

2

_name keine Variable ist, ist es eine abgeleitete Tabelle Namen, so dass Ihre Aussage wie

with _name as (
    select name from foo where id = foo_id 
) 
insert into bar (name) select name from _name; 
+0

Ah aussehen sollte, sehe ich. Danke für die schnelle Antwort! –

+0

Wenn ich andere Funktionsargumente hätte, die in 'bar' eingefügt werden müssen, wie würde ich sie zur' insert'-Anweisung hinzufügen? –

+0

Verstanden! 'Einfügen in bar (name, otherfield) wähle name, _otherfield von _name', wobei _otherfield ein zusätzliches Argument für die Funktion ist –