Thread: Simple plpgsql question

Simple plpgsql question

From
"Todd Kennedy"
Date:
Hi,

I have, what I hope to be, a simple question about plpgsql.

I have a trigger on a table right now that updates a count everytime
that a new record is entered into a database (or removed).

What I'd also like to do is have it create a new row in a different
table using the automatically assigned id as a reference, but I'm
unsure of how to obtain the id of the newly created row in the first
table.

Example:
CREATE TABLE system_info (
id serial PRIMARY KEY,
name varchar(255),
value varchar(255)
);
INSERT INTO system_info (name,value) VALUES ('total_users','0');

CREATE TABLE master (
id serial PRIMARY KEY,
name varchar(32) NOT NULL CHECK ( name <> ''),
UNIQUE(name)
);

CREATE TABLE slave (
id serial PRIMARY KEY,
master_id integer REFERENCES master (id),
additional_info text
);

CREATE OR REPLACE FUNCTION update_users() RETURNS trigger AS $$
BEGIN   IF TG_OP = 'DELETE' THEN       UPDATE system_info SET value=(value::integer)-1 WHERE name =
'total_users'       RETURN OLD;   ELSEIF TG_OP = 'INSERT' THEN       UPDATE system_info SET value=(value::integer)+1
WHEREname = 
'total_users';INSERT INTO slave (master_id) VALUES (THIS IS WHAT I NEED TO KNOW);       RETURN NEW;   END IF;   RETURN
NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_users AFTER INSERT OR DELETE ON master   FOR EACH ROW EXECUTE PROCEDURE update_users();


The part I need to know is the INSERT INTO statement in the procedure.

Any help would be great.

Thanks!


Re: Simple plpgsql question

From
Terry Lee Tucker
Date:
On Thursday 13 April 2006 11:38 pm, "Todd Kennedy" <todd.kennedy@gmail.com> 
thus communicated:
--> Hi,
-->
--> I have, what I hope to be, a simple question about plpgsql.
-->
--> I have a trigger on a table right now that updates a count everytime
--> that a new record is entered into a database (or removed).
-->
--> What I'd also like to do is have it create a new row in a different
--> table using the automatically assigned id as a reference, but I'm
--> unsure of how to obtain the id of the newly created row in the first
--> table.
-->
--> Example:
--> CREATE TABLE system_info (
--> id serial PRIMARY KEY,
--> name varchar(255),
--> value varchar(255)
--> );
--> INSERT INTO system_info (name,value) VALUES ('total_users','0');
-->
--> CREATE TABLE master (
--> id serial PRIMARY KEY,
--> name varchar(32) NOT NULL CHECK ( name <> ''),
--> UNIQUE(name)
--> );
-->
--> CREATE TABLE slave (
--> id serial PRIMARY KEY,
--> master_id integer REFERENCES master (id),
--> additional_info text
--> );
-->
--> CREATE OR REPLACE FUNCTION update_users() RETURNS trigger AS $$
--> BEGIN
-->     IF TG_OP = 'DELETE' THEN
-->         UPDATE system_info SET value=(value::integer)-1 WHERE name =
--> 'total_users'
-->         RETURN OLD;
-->     ELSEIF TG_OP = 'INSERT' THEN
-->         UPDATE system_info SET value=(value::integer)+1 WHERE name =
--> 'total_users';
-->     INSERT INTO slave (master_id) VALUES (THIS IS WHAT I NEED TO KNOW);
-->         RETURN NEW;
-->     END IF;
-->     RETURN NULL;
--> END;
--> $$ LANGUAGE plpgsql;
-->
--> CREATE TRIGGER update_users AFTER INSERT OR DELETE ON master
-->     FOR EACH ROW EXECUTE PROCEDURE update_users();
-->
-->
--> The part I need to know is the INSERT INTO statement in the procedure.
-->
--> Any help would be great.
-->
--> Thanks!
-->
--> ---------------------------(end of broadcast)---------------------------
--> TIP 4: Have you searched our list archives?
-->
-->                http://archives.postgresql.org
-->

INSERT INTO slave (master_id) VALUES (new.id);

The buffer NEW contains all the "new" data.


Re: Simple plpgsql question

From
Volkan YAZICI
Date:
On Apr 13 11:38, Todd Kennedy wrote:
> What I'd also like to do is have it create a new row in a different
> table using the automatically assigned id as a reference, but I'm
> unsure of how to obtain the id of the newly created row in the first
> table.

If I understand you right, you're refering to a SERIAL column with id.
If so, you can use currval() function over related SEQUENCE. Because of
INSERT/DELETE and trigger will be executed in the same session, they'll
be able to see current value of related sequence. Below is an example
about this:

BEGIN;

CREATE SEQUENCE trig_t_seq START 1;
CREATE TABLE trig_t (   id      bigint NOT NULL DEFAULT nextval('trig_t_seq'),   inf     int
);

CREATE FUNCTION trig_t_row_count() RETURNS trigger AS $$
BEGIN   IF TG_OP = 'INSERT' THEN       RAISE NOTICE 'Current SEQUENCE value: %', currval('trig_t_seq');   END IF;
RETURNNEW;
 
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_t_row_count_trig   AFTER INSERT   ON trig_t   FOR EACH ROW   EXECUTE PROCEDURE trig_t_row_count();

INSERT INTO trig_t (inf) VALUES (10);
INSERT INTO trig_t (inf) VALUES (20);
INSERT INTO trig_t (inf) VALUES (30);

ROLLBACK;


Regards.


Programatically Backup Database Using Visual Basic

From
"Christian Paul B. Cosinas"
Date:
Hi is there a way wherein I can interface the pg_dump of PostgreSQL Server
in Visual basic.

I mean for example I want to backup Databases "DB1", "BD12", "DB3" using
pg_dump

Thank You,
Ian


I choose Polesoft Lockspam to fight spam, and you?
http://www.polesoft.com/refer.html    



Re: Programatically Backup Database Using Visual Basic

From
Josh Berkus
Date:
Paul,

> Hi is there a way wherein I can interface the pg_dump of PostgreSQL Server
> in Visual basic.
>
> I mean for example I want to backup Databases "DB1", "BD12", "DB3" using
> pg_dump

You'd have to run them as shell commands in VB.  Not sure if VB has a 
mechanism for that.

-- 
Josh Berkus
Aglio Database Solutions
San Francisco