Próbuję stworzyć funkcję, która dodaje rekord z podanymi zmiennymi jako wartościami. Mój kod:

CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS VARCHAR AS $$
DECLARE
    query VARCHAR;
BEGIN
    query = 'insert into films (id_film, title, year_production, price) values ('||id||','||t||','||y||','||p||')';
    EXECUTE query;
RETURN 'OK';
EXCEPTION
    WHEN UNIQUE_VIOLATION THEN
    RAISE NOTICE 'Incorrect ID, next available ID set';
    RETURN 0;
END;
$$ LANGUAGE PLPGSQL;
SELECT ADD_FILM(1,'aaa','2020','10');

Kolejne wykonanie funkcji kończy się błędem. Co jest nie tak ze składnią?

BŁĄD: kolumna „aaa” nie istnieje

0
Daniel Sobczak 23 marzec 2020, 21:45

2 odpowiedzi

Najlepsza odpowiedź

Wolałbym to zrobić:

CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS 
VARCHAR AS $$
BEGIN
    insert into films (id_film, title, year_production, price) values (id,t,y,p);
RETURN 'OK';
....
....

Zobacz ten link: https://www.postgresqltutorial.com/postgresql-create-procedure/

I nazwij to:

CALL ADD_FILM(1,'aaa','2020','10');
1
armagedescu 23 marzec 2020, 18:59

Inne możliwe rozwiązanie z EXECUTE:

create table films
(
 id_film int,
 title varchar,
 year_production int,
 price real 
);
CREATE TABLE
CREATE OR REPLACE FUNCTION ADD_FILM(id INTEGER, t VARCHAR, y INTEGER, p REAL) RETURNS VARCHAR AS $$
DECLARE
    query VARCHAR;
BEGIN
    query = 'insert into films (id_film, title, year_production, price) values ($1,$2,$3,$4)';
    EXECUTE query USING id, t, y, p; 
RETURN 'OK';
EXCEPTION
    WHEN UNIQUE_VIOLATION THEN
    RAISE NOTICE 'Incorrect ID, next available ID set';
    RETURN 0;
END;
$$ LANGUAGE PLPGSQL;
CREATE FUNCTION
SELECT ADD_FILM(1,'aaa','2020','10');
 add_film 
----------
 OK
(1 row)

select * from films;
 id_film | title | year_production | price 
---------+-------+-----------------+-------
       1 | aaa   |            2020 |    10
(1 row)
0
pifor 23 marzec 2020, 18:56