Я создал функцию и сохранил ее в файле .sql. Я хочу использовать этот файл и функцию, чтобы поместить файл в систему, а затем выполнить включенную функцию через командную строку, чтобы новые данные были сохранены в базе данных в этой системе.Пытается сохранить и выполнить скрипт функции psql из командной строки
В настоящее время, содержание моего .sql файла:
CREATE OR REPLACE
FUNCTION device_authorisation_change(device_identification VARCHAR)
RETURNS VARCHAR AS
$$
DECLARE
OWNER varchar(255);
DEVICE_ID integer;
OWNER_ID integer;
DATE_TIME timestamp;
BEGIN
OWNER := 'MyDefaultOrganisation';
DATE_TIME := current_timestamp;
DEVICE_ID := (SELECT id from device dev where dev.device_identification = $1);
OWNER_ID := (SELECT id from owners own where own.owner_identification = OWNER);
DELETE FROM device_authorization
WHERE device = DEVICE_ID AND owner = OWNER_ID;
INSERT INTO device_authorization(id, creation_time, device, owner)
VALUES (nextval('device_authorization_id_seq'), DATE_TIME, DEVICE_ID, OWNER_ID);
RAISE NOTICE 'Deleted device authorisations for % for device: %' , OWNER, $1;
RETURN '';
END;
$$ LANGUAGE plpgsql;
Когда я пытаюсь запустить файл с помощью команды, я использовал следующую команду
psql -d my_database -f ChangeOwnership.sql -v device_identification='TestDevice'
и результат показывает, что de device_identification, похоже, NULL
. Тем не менее, функция получает хранится в базе данных, и я могу выполнить эту функцию (в pgAdmin) с помощью
SELECT "device_authorisation_change"('TestDevice');
На этот раз функция выполняет хорошо.
Что я хочу достичь, так это то, что я могу запустить sql-скрипт из командной строки, используя (named) аргументы, которые немедленно обновляют данные в базе данных. Нет необходимости сохранять функцию в базе данных, я действительно люблю ее избегать, но если это усложняет ситуацию, это не проблема, если она остается в базе данных.
Может ли кто-нибудь помочь мне?
Читайте статью ['DO'] (https://www.postgresql.org/docs/current/static/sql-do.html), которая выполняет анонимный блок кода, если вам не нужно создавать функцию :) –