My function run successfully with cursor, but can't change table

From: 高健 <luckyjackgao(at)gmail(dot)com>
To: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: My function run successfully with cursor, but can't change table
Date: 2013-06-10 02:59:58
Message-ID: CAL454F3hC-1itWpRnXvVA6nT49_x9CPdxEpdfhOQUmhyAydrkg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hello:

Would somebody please kindly tell why my function run but can't update
table via cursor:

I have table like this:

create table course_tbl(course_number integer, course_name varchar(4),
instructor varchar(10));

insert into course_tbl values (1,'aaaa','TOM'), (2,'bbbb','JACK');

select * from course_tbl;

course_number | course_name | instructor

---------------+-------------+------------

1 | aaaa | TOM

2 | bbbb | JACK

(2 rows)

And I made a function to access the table and I want to change the table
record:

In my function, I want to update table record whose course_name is equal to
parameter passed in:

-----------------here is my function-------------------------------

CREATE OR REPLACE Function FindCourse

( name_in IN varchar )

RETURNS integer LANGUAGE plpgsql AS $$

DECLARE

cnumber integer;

cinstructor varchar;

c1 CURSOR

FOR

SELECT course_number, instructor

from course_tbl

where course_name = name_in

FOR UPDATE;

BEGIN

BEGIN

open c1;

fetch c1 into cnumber,cinstructor;

IF not found THEN

cnumber := 9999;

ELSE

UPDATE course_tbl

SET instructor = 'SMITH'

WHERE CURRENT OF c1;

COMMIT;

END IF;

close c1;

EXCEPTION

WHEN OTHERS THEN

END;

RETURN cnumber;

END;$$;

----------------- -------------------------------

I ran the function like this:

postgres=# select FindCourse('aaaa');

findcourse

------------

1

(1 row)

I got returned result of 1, which I think is that I really got the record.

For my update and commit statements, I think I can get instructor changed.

---------------------------------------------

UPDATE course_tbl

SET instructor = 'SMITH'

WHERE CURRENT OF c1;

COMMIT;

----------------------------------------------

But when I select the table again, I found it not changed.

postgres=# select * from course_tbl;

course_number | course_name | instructor

---------------+-------------+------------

1 | aaaa | TOM

2 | bbbb | JACK

(2 rows)

Anybody know the reason, maybe there are some wrong way by which I use the
cursor.

Thanks!

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Philipp Kraus 2013-06-10 07:52:27 databse version
Previous Message Craig Ringer 2013-06-10 02:43:20 Re: Sample database with difficult SQL questions