postgresql – PL / pgSQL列名与变量相同
我是plpgsql的新手,我正在尝试创建一个函数来检查表中是否存在某个值,如果不存在则会添加一行.
CREATE OR REPLACE FUNCTION hire( id_pracownika integer,imie character varying,nazwisko character varying,miasto character varying,pensja real) RETURNS TEXT AS $BODY$ DECLARE wynik TEXT; sprawdzenie INT; BEGIN sprawdzenie = id_pracownika; IF EXISTS (SELECT id_pracownika FROM pracownicy WHERE id_pracownika=sprawdzenie) THEN wynik = "JUZ ISTNIEJE"; RETURN wynik; ELSE INSERT INTO pracownicy(id_pracownika,imie,nazwisko,miasto,pensja) VALUES (id_pracownika,pensja); wynik = "OK"; RETURN wynik; END IF; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; 问题是我收到的错误是id_pracownika是一个列名和一个变量. 如何在这种上下文中指定“id_pracownika”是指列名? 解决方法CREATE OR REPLACE FUNCTION hire( id_pracownika integer,imie varchar,nazwisko varchar,miasto varchar,pensja real) RETURNS TEXT AS $func$ BEGIN IF EXISTS (SELECT 1 FROM pracownicy p WHERE p.id_pracownika = hire.sprawdzenie) THEN RETURN 'JUZ ISTNIEJE'::text; -- wynik ELSE INSERT INTO pracownicy(id_pracownika,pensja) VALUES (hire.sprawdzenie,hire.imie,hire.nazwisko,hire.miasto,hire.pensja); RETURN 'OK'::text; -- wynik END IF; END $func$ LANGUAGE plpgsql; >与@pozs一样,使用函数名对模式限定列名和前缀函数参数以在必要时消除歧义. 但还有更多: >字符串文字(文本常量)必须用单引号括起来:’确定’,而不是“确定”. > The forgotten assignment operator “=” and the commonplace “:=” >在EXISTS表达式中,选择的内容无关紧要. SELECT id_pracownika与SELECT 1或SELECT 123/0相同.只有行的存在才重要. > What is easier to read in EXISTS subqueries? >分配变量比其他编程语言相对昂贵.如果有一种优雅的方法来保存这些操作,那么这是plpgsql的首选方式.尽可能在SQL语句中直接执行. 选择或插入 你的函数是“SELECT或INSERT”的另一个实现 – 一个UPSERT问题的变体,面对并发写入负载比你想象的更复杂. (您的简单解决方案忽略的潜在问题,顺便说一句,并且可能使其失败!)详细信息: > Is SELECT or INSERT in a function prone to race conditions? POSTERT in Postgres 9.5 Postgres团队(最突出的是Peter Geoghegan)在Postgres 9.5中实施了UPSERT. Details in the Postgres Wiki.这个新语法将做一个干净的工作: INSERT INTO pracownicy(id_pracownika,hire.pensja); ON CONFLICT DO NOTHING RETURNING 'OK'::text; -- wynik IF NOT FOUND THEN RETURN 'JUZ ISTNIEJE'::text; END IF; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |