PL / pgSQL column name matches variable name

I am new to plpgsql and I am trying to create a function that checks if a specific value exists in a table and if no row is added.

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,imie,nazwisko,miasto,pensja);
wynik = "OK";
RETURN wynik;   
END IF;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

The problem is that I get errors saying that id_pracownikais the column name and variable.

How to indicate that "id_pracownika" in this context refers to a column name?

+4
source share
2 answers
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,imie,nazwisko,miasto,pensja)
   VALUES (hire.sprawdzenie,hire.imie,hire.nazwisko,hire.miasto,hire.pensja);

   RETURN 'OK'::text;  -- wynik
END IF;

END
$func$  LANGUAGE plpgsql;
  • @pozs, , , , . , INSERT . , .

  • @Frank , , , . , ALIAS . , ALIAS . : $1 id_pracownika .

:

  • ( ) : 'OK', "OK".

  • plpgsql :=.

  • EXISTS , . SELECT id_pracownika SELECT 1 SELECT 123/0. .

  • , . , plpgsql. SQL .

  • VOLATILE COST 100 . .

SELECT INSERT

"SELECT INSERT" - UPSERT, , . ( , , , !) :

UPSERT Postgres 9.5

Postgres ( ) UPSERT Postgres 9.5. Wiki Postgres. :

   INSERT INTO pracownicy(id_pracownika,imie,nazwisko,miasto,pensja)
   VALUES (hire.sprawdzenie,hire.imie,hire.nazwisko,hire.miasto,hire.pensja);
   ON CONFLICT DO NOTHING
   RETURNING 'OK'::text;   -- wynik

   IF NOT FOUND THEN
      RETURN 'JUZ ISTNIEJE'::text;  
   END IF;
+5

, , EXECUTE select , .

1. :

create table people (
  nickname varchar(9),
  name varchar(12),
  second_name varchar(12),
  country varchar(30)
  );

2. :

CREATE OR REPLACE FUNCTION fun_find_people (col_name text, col_value varchar)
RETURNS void AS
$BODY$
DECLARE
    local_cursor_p refcursor;
    row_from_people RECORD;

BEGIN
    open local_cursor_p FOR
        EXECUTE 'select * from people where '|| col_name || ' LIKE ''' || col_value || '%'' ';

    raise notice 'col_name: %',col_name;
    raise notice 'col_value: %',col_value;

    LOOP
        FETCH local_cursor_p INTO row_from_people; EXIT WHEN NOT FOUND;

        raise notice 'row_from_people.nickname: %',  row_from_people.nickname ;
        raise notice 'row_from_people.name: %', row_from_people.name ;
        raise notice 'row_from_people.country: %', row_from_people.country;
    END LOOP;
END;
$BODY$ LANGUAGE 'plpgsql'

3. select fun_find_people('name', 'Cristian'); select fun_find_people('country', 'Chile');

0

All Articles