私は関数を作成して.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
と思われます。しかし、関数は、データベースに格納されて取得し、私は
SELECT "device_authorisation_change"('TestDevice');
この時間を使用して(pgAdminでで)この機能を実行することができ、機能が十分に実行されます。
私が達成したいのは、(名前付き)引数を使用してコマンドラインからsqlスクリプトを実行できることです。これはデータベースのデータをただちに更新します。データベースに関数を保存する必要はありませんが、実際には避けたいのですが、複雑であればデータベースに残っていれば問題ありません。
誰でもお手伝いできますか?
関数を作成する必要がない場合は、匿名コードブロックを実行する['DO'](https://www.postgresql.org/docs/current/static/sql-do.html)文を読んでください:) –