ни одна функция не соответствует заданному имени и типу аргумента. вам может понадобиться добавить явное приведение типов. ВСТАВЬТЕ ПОДГОТОВИТЬ - PullRequest
0 голосов
/ 09 октября 2019

У меня есть эта функция PL / pgSQL.

CREATE OR REPLACE FUNCTION add_employee_att(emp_id INT, att_time TIMESTAMP)
  RETURNS void AS $$
  BEGIN
    IF NOT EXISTS (SELECT FROM employee_att WHERE employee_id = emp_id AND time_stamp = att_time) THEN
    PREPARE prep_att (INT, TIMESTAMP) 
    AS INSERT INTO employee_att (employee_id, time_stamp) VALUES ($1, $2);
    EXECUTE prep_att (emp_id, att_time);
    END IF;
  END;
$$ LANGUAGE plpgsql;

Тогда, если я выполню это:

SELECT add_employee_att(35, '2019-08-29 00:00:25'::timestamp);

Я получил эту ошибку:

Error in query: ERROR: function prep_att(integer, timestamp without time zone) does not exist
LINE 1: SELECT prep_att(emp_id, att_time)
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT prep_att(emp_id, att_time)
CONTEXT: PL/pgSQL function add_employee_attendant(integer,timestamp without time zone) line 6 at EXECUTE

НоЕсли заменить ПОДГОТОВИТЬ с этой вставкой:

INSERT INTO employee_att (employee_id, time_stamp) VALUES (emp_id, att_time);

Работает нормально. Есть идеи, что не так с подготовкой?

1 Ответ

0 голосов
/ 10 октября 2019

Не используйте PREPARE в plpgsql. Это не имеет смысла. Любой встроенный SQL уже подготовлен (план выполнения используется повторно).

Поэтому напишите просто

CREATE OR REPLACE FUNCTION add_employee_att(emp_id INT, att_time TIMESTAMP)
RETURNS void AS $$
BEGIN
IF NOT EXISTS (SELECT FROM employee_att
                WHERE employee_id = emp_id 
                  AND time_stamp = att_time)
THEN
  INSERT INTO employee_att (employee_id, time_stamp) VALUES (emp_id, att_time);
END IF;
END;
$$ LANGUAGE plpgsql;

Внимание: этот тест является примером типичного кода, который частично бесполезен. Это не защита от дубликатов (emp_id, att_time). Это единственный уникальный индекс. Вы не можете знать никогда, если вы видите последние данные. Каждый раз, когда вы используете SQL, вы работаете со снимком базы данных. Но данные внутри базы данных уже могут немного отличаться.

...