Creating procedures in phpPgadmin - postgresql

I want create a procedure (for copying the values of one table(mover_location) to another table(mover_history) on updation) ,and want to call up on that on a trigger in postgresql with phppgadmin.
Here is what i have tried :
PROCEDURE :-
CREATE OR REPLACE FUNCTION log_mover_location()
RETURNS trigger AS
BEGIN
INSERT INTO mover_history(reg_id,last_seen_lat,last_seen_long,last_seen_location_geog,last_updated_at)
VALUES(SELECT
mover_location.reg_id,mover_location.last_seen_lat,mover_location.last_seen_long,mover_location.last_seen_location_geog,mover_location.last_updated_at FROM mover_location) WHERE mover_history.reg_id =
#mover_location.reg_id;
END;
TRIGGER :-
CREATE TRIGGER update_mover_history
AFTER UPDATE
ON mover_location
FOR EACH ROW
EXECUTE PROCEDURE log_mover_location();
Trigger created successfully ,
But it give me a error as follows when executing the procedure:
ERROR: syntax error at or near "BEGIN"
LINE 4: BEGIN
^

the Procedure that you're created is incorrect, for example
CREATE OR REPLACE FUNCTION procedure_name()
RETURNS trigger AS
$BODY$
BEGIN
/*----logic----*/
END
$BODY$
LANGUAGE plpgsql

Related

Function that is called inside the trigger is not recognized

I am trying to create my first trigger in postgres but I keep receiving this: [42883] ERROR: function clear_article_flag does not exist.
What I am trying to do is: when a new row is inserted on articles with a non 'automatic' author to set is_automatic flag to false for the specific id.
CREATE OR REPLACE FUNCTION clear_article_flag()
RETURNS trigger
LANGUAGE plpgsql AS
$$
BEGIN
update flags
set is_automatic = false where id= new.id;
return NEW;
END ;
$$;
CREATE TRIGGER maintain_dummy_flag
AFTER INSERT
ON articles
FOR EACH ROW
WHEN ( new.author not in ('automatic') )
EXECUTE PROCEDURE clear_article_flag();```
My mistake, being the first time when I've created a trigger and a sql function, I didn't know that first I should run the part that creates the function and then the trigger.

Postgres: syntax error when trying to create multiple stored procedures from a single file

I am using Postgres version 13.1. I want to have a single file where I could store all stored procedures and create them in one shot. But when I put multiple stored procedures in a single file, I get the following error. What am I missing?
In my test.sql file I have the following content:
create or replace procedure tmp1(
)
language plpgsql as
$$
declare
l_count integer;
begin
select 1 into l_count;
raise info 'count: %', l_count;
end;
$$
create or replace procedure tmp2(
)
language plpgsql as
$$
declare
l_count integer;
begin
select 1 into l_count;
raise info 'count: %', l_count;
end;
$$
If I only have the first procedure it gets created and I can call it successfully. But the moment I have the second identical procedure with a different name, it gives me an error as follows (when run from psql):
psql=> \i test.sql
psql:test.sql:23: ERROR: syntax error at or near "create"
LINE 12: create or replace procedure tmp2(
OK - right after posting I tried putting a ";" after the end of first procedure and it works

PostgreSql Trigger does not work when called 'insert'

The code below is my code to create trigger function to change column "pass".
create or replace function change_pass()
returns trigger as
$$
begin
NEW.pass := 'XXXXXXXXX';
return NEW;
end
$$
language plpgsql;
create trigger change_pass
AFTER insert or update on "D_ACCOUNT"
for each row execute procedure change_pass();
When i called insert, i did not see any changes in my data.
Can anyone explain to me where i was wrong?
You need a BEFORE trigger to change values in the NEW record:
create trigger change_pass
BEFORE insert or update on "D_ACCOUNT"
for each row execute procedure change_pass();

How I can "atomically" replace function that is executed by trigger?

Here is code I have used to create FUNCTION and TRIGGER.
CREATE OR REPLACE FUNCTION inc_post_loves() RETURNS TRIGGER AS
$BODY$
BEGIN;
...
END;
$BODY$
language plpgsql;
CREATE TRIGGER on_post_love_create
AFTER INSERT ON "PostLoves"
FOR EACH ROW EXECUTE PROCEDURE inc_post_loves()
Now I would like to modify FUNCTION inc_post_loves().
If I will execute CREATE OR REPLACE FUNCTION inc_post_loves()... again, do I have guarantee that previously created trigger won't be deleted (like cascade) and it wont fail during replacing function?

SQL Functions cannot return type trigger

I'm using PostgreSQL with pgAdmin and I can't get a trigger function to work. However, as far as I am aware, you can return type trigger in PostgreSQL?
CREATE OR REPLACE FUNCTION validate_Cat()
RETURNS TRIGGER AS
$BODY$
BEGIN
-- CODE here
END;
$BODY$
LANGUAGE SQL;
CREATE TRIGGER validate_Cat
AFTER INSERT OR UPDATE ON Category
FOR EACH ROW execute procedure validate_Cat();
SOLVED, had to change language to PLPGSQL