Thread: Moving from Sybase to Postgres - Stored Procedures

Moving from Sybase to Postgres - Stored Procedures

From
"Andre Schnoor"
Date:
Hi,

I am moving from Sybase to pgsql but have problems with stored procedures.
The typical procedure uses

a) named parameters,
b) local variable declarations and assignments
c) transactions
d) cursors, views, etc.

I can't seem to find these things in the Postgres function syntax.
Procedures can be as long as 20-250 lines, performing heavy data
manipulation tasks, running from a few seconds up to several hours. Database
size is approx. 20GB.

Functions in pgsql are very limited compared to Sybase procedures, so I'll
have to find a workaround somehow. Perhaps somebody can point me to examples
or hints regarding this issue.

Thanks in advance!

Andre



Re: Moving from Sybase to Postgres - Stored Procedures

From
"Frank D. Engel, Jr."
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

a.
http://www.postgresql.org/docs/8.0/interactive/plpgsql-
declarations.html
b. (same page)
c. ?
d.
http://www.postgresql.org/docs/8.0/interactive/plpgsql-control-
structures.html#PLPGSQL-RECORDS-ITERATING


This brings about a new question: Doesn't a PL/PGSQL function always
execute within the context of a transaction?  I'd think you can't
create a transaction within one then, correct?

On Jan 28, 2005, at 3:11 PM, Andre Schnoor wrote:

> Hi,
>
> I am moving from Sybase to pgsql but have problems with stored
> procedures.
> The typical procedure uses
>
> a) named parameters,
> b) local variable declarations and assignments
> c) transactions
> d) cursors, views, etc.
>
> I can't seem to find these things in the Postgres function syntax.
> Procedures can be as long as 20-250 lines, performing heavy data
> manipulation tasks, running from a few seconds up to several hours.
> Database
> size is approx. 20GB.
>
> Functions in pgsql are very limited compared to Sybase procedures, so
> I'll
> have to find a workaround somehow. Perhaps somebody can point me to
> examples
> or hints regarding this issue.
>
> Thanks in advance!
>
> Andre
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to
> majordomo@postgresql.org
>
>
- -----------------------------------------------------------
Frank D. Engel, Jr.  <fde101@fjrhome.net>

$ ln -s /usr/share/kjvbible /usr/manual
$ true | cat /usr/manual | grep "John 3:16"
John 3:16 For God so loved the world, that he gave his only begotten
Son, that whosoever believeth in him should not perish, but have
everlasting life.
$
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (Darwin)

iD8DBQFB+qHI7aqtWrR9cZoRAhf1AJ9CVvNTv0+UHtbUqxONyHIHJ67MlQCcCgfZ
K3nUK2CE7Ag7fSQsaaSqStE=
=UgiS
-----END PGP SIGNATURE-----



___________________________________________________________
$0 Web Hosting with up to 120MB web space, 1000 MB Transfer
10 Personalized POP and Web E-mail Accounts, and much more.
Signup at www.doteasy.com


Re: Moving from Sybase to Postgres - Stored Procedures

From
"Joshua D. Drake"
Date:
Andre Schnoor wrote:
> Hi,
>
> I am moving from Sybase to pgsql but have problems with stored procedures.
> The typical procedure uses
>
> a) named parameters,
> b) local variable declarations and assignments
> c) transactions
> d) cursors, views, etc.
>
> I can't seem to find these things in the Postgres function syntax.

Uhmmm in Postgres function/procedures are the same thing. I am unsure
about named parameters but b,c,d are all available in PostgreSQL.

> Functions in pgsql are very limited compared to Sybase procedures,

I seriously doubt this is the case since you have the ability to use any
number of languages for your procedures including plPgsql, plPython,
plPerl, plPHP etc...

  so I'll
> have to find a workaround somehow. Perhaps somebody can point me to examples
> or hints regarding this issue.

Perhaps if you provided the actual problem? Is there a specific
procedure that you are trying to port that you do not understand in the
PgSQL sense?

Sincerely,

Joshua D. Drake


>
> Thanks in advance!
>
> Andre
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org


--
Command Prompt, Inc., your source for PostgreSQL replication,
professional support, programming, managed services, shared
and dedicated hosting. Home of the Open Source Projects plPHP,
plPerlNG, pgManage,  and pgPHPtoolkit.
Contact us now at: +1-503-667-4564 - http://www.commandprompt.com


Attachment

Re: Moving from Sybase to Postgres - Stored Procedures

From
Jaime Casanova
Date:
 --- "Frank D. Engel, Jr." <fde101@fjrhome.net>
escribió:
> a.
>
http://www.postgresql.org/docs/8.0/interactive/plpgsql-
>
> declarations.html
> b. (same page)
> c. ?
> d.
>
http://www.postgresql.org/docs/8.0/interactive/plpgsql-control-
>
> structures.html#PLPGSQL-RECORDS-ITERATING
>
>
> This brings about a new question: Doesn't a PL/PGSQL
> function always
> execute within the context of a transaction?  I'd
> think you can't
> create a transaction within one then, correct?
>
AFAIK.

But in pg8 you can use EXCEPTION blocks that are
implemented on the subtransaction mechanism, IIRC.

regards,
Jaime Casanova

_________________________________________________________
Do You Yahoo!?
Información de Estados Unidos y América Latina, en Yahoo! Noticias.
Visítanos en http://noticias.espanol.yahoo.com

Re: Moving from Sybase to Postgres - Stored Procedures

From
"Andre Schnoor"
Date:
"Joshua D. Drake" wrote:
> Andre Schnoor wrote:
> > Hi,
> >
> > I am moving from Sybase to pgsql but have problems with stored procedures.
> > The typical procedure uses
> >
> > a) named parameters,
> > b) local variable declarations and assignments
> > c) transactions
> > d) cursors, views, etc.
> >
> > I can't seem to find these things in the Postgres function syntax.

[...]

> Perhaps if you provided the actual problem? Is there a specific
> procedure that you are trying to port that you do not understand in the
> PgSQL sense?

Thank you for asking, Joshua. I've put an example procedure skeleton here:

CREATE PROCEDURE do_something
    @song_id int,
    @user_id int,
    @method int,
    @length int = 0,
    @date_exact datetime,
    @default_country int = null
AS
   -- temporary variables
   DECLARE
      @artist int,
      @sample int,
      @date varchar(32),
      @country int
BEGIN
    -- assign temporary variables
    select @date = convert(varchar(32),@date_exact,101)
    select @artist = user_id, @sample = is_sample from sto_song where song_id = @song_id
    -- perform conditional code
    if (@sample = 1) begin
        begin transaction
        ... do something ...
        commit transaction
    end else begin
        ... do something else ...
    end
    -- return results
    select
        result1 = ... some expression ...,
        result2 = ... another expression ...
END

I could not yet translate this to PgSQL, as I can't find any control structures, variable declaractions, etc.

I assume this can be done through the Perl module, but I find this rather strange. I'm afraid that Perl requires to
havethe queries parsed and passed down each and every time, instead of having them compiled once. I also can't see the
benefitof converting data objects back and forth to/from Perl while everything actually happens within Postgres. 

Am I missing something important?

Greetings,
Andre




Re: Moving from Sybase to Postgres - Stored Procedures

From
John Sidney-Woollett
Date:
Have you tried looking at this section of the manual?

http://www.postgresql.org/docs/7.4/interactive/plpgsql.html

It details all the PL/pgSQL language constructs - I found it fine when
converting from Oracle to Postgres...

Just make sure you have installed the pl/pgsql language in template1 or
your database before you try using it - see
http://www.postgresql.org/docs/7.4/interactive/app-createlang.html or
http://www.postgresql.org/docs/7.4/interactive/sql-createlanguage.html

Or type /usr/local/pgsql/bin/createlang plpgsql template1 to install the
language into template1, then create your database. Or install directly
into your database...

Hope that helps.

John Sidney-Woollett

Andre Schnoor wrote:

> "Joshua D. Drake" wrote:
>
>>Andre Schnoor wrote:
>>
>>>Hi,
>>>
>>>I am moving from Sybase to pgsql but have problems with stored procedures.
>>>The typical procedure uses
>>>
>>>a) named parameters,
>>>b) local variable declarations and assignments
>>>c) transactions
>>>d) cursors, views, etc.
>>>
>>>I can't seem to find these things in the Postgres function syntax.
>
>
> [...]
>
>
>>Perhaps if you provided the actual problem? Is there a specific
>>procedure that you are trying to port that you do not understand in the
>>PgSQL sense?
>
>
> Thank you for asking, Joshua. I've put an example procedure skeleton here:
>
> CREATE PROCEDURE do_something
>     @song_id int,
>     @user_id int,
>     @method int,
>     @length int = 0,
>     @date_exact datetime,
>     @default_country int = null
> AS
>    -- temporary variables
>    DECLARE
>       @artist int,
>       @sample int,
>       @date varchar(32),
>       @country int
> BEGIN
>     -- assign temporary variables
>     select @date = convert(varchar(32),@date_exact,101)
>     select @artist = user_id, @sample = is_sample from sto_song where song_id = @song_id
>     -- perform conditional code
>     if (@sample = 1) begin
>         begin transaction
>         ... do something ...
>         commit transaction
>     end else begin
>         ... do something else ...
>     end
>     -- return results
>     select
>         result1 = ... some expression ...,
>         result2 = ... another expression ...
> END
>
> I could not yet translate this to PgSQL, as I can't find any control structures, variable declaractions, etc.
>
> I assume this can be done through the Perl module, but I find this rather strange. I'm afraid that Perl requires to
havethe queries parsed and passed down each and every time, instead of having them compiled once. I also can't see the
benefitof converting data objects back and forth to/from Perl while everything actually happens within Postgres. 
>
> Am I missing something important?
>
> Greetings,
> Andre
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

Re: Moving from Sybase to Postgres - Stored Procedures

From
mmiranda@americatel.com.sv
Date:
> CREATE PROCEDURE do_something
>     @song_id int,
>     @user_id int,
>     @method int,
>     @length int = 0,
>     @date_exact datetime,
>     @default_country int = null
> AS
>    -- temporary variables
>    DECLARE
>       @artist int,
>       @sample int,
>       @date varchar(32),
>       @country int
> BEGIN
>     -- assign temporary variables
>     select @date = convert(varchar(32),@date_exact,101)
>     select @artist = user_id, @sample = is_sample from sto_song where
>     song_id = @song_id -- perform conditional code
>     if (@sample = 1) begin
>         begin transaction
>         ... do something ...
>         commit transaction
>     end else begin
>         ... do something else ...
>     end
>     -- return results
>     select
>         result1 = ... some expression ...,
>         result2 = ... another expression ...
> END
>
> I could not yet translate this to PgSQL, as I can't find any control
> structures, variable declaractions, etc.
> Am I missing something important?
>

Absolutely, that is a perfectly normal SP, i use those constructors
everyday, maybe you dont have searched in the docs?.
Perl?, i dont think so, PL/pgSQL is all what you need,

http://www.postgresql.org/docs/7.3/interactive/programmer-pl.html
---
Miguel


> Greetings,
> Andre


Re: Moving from Sybase to Postgres - Stored Procedures

From
"Andre Schnoor"
Date:
<mmiranda@americatel.com.sv> schrieb im Newsbeitrag
news:76E0DAA32C39D711B6EC0002B364A6FA03F0A7FD@amsal01exc01.americatel.com.sv...
> > CREATE PROCEDURE do_something
> >     @song_id int,
> >     @user_id int,
> >     @method int,
> >     @length int = 0,
> >     @date_exact datetime,
> >     @default_country int = null
> > AS
> >    -- temporary variables
> >    DECLARE
> >       @artist int,
> >       @sample int,
> >       @date varchar(32),
> >       @country int
> > BEGIN
> >     -- assign temporary variables
> >     select @date = convert(varchar(32),@date_exact,101)
> >     select @artist = user_id, @sample = is_sample from sto_song where
> >     song_id = @song_id -- perform conditional code
> >     if (@sample = 1) begin
> >         begin transaction
> >         ... do something ...
> >         commit transaction
> >     end else begin
> >         ... do something else ...
> >     end
> >     -- return results
> >     select
> >         result1 = ... some expression ...,
> >         result2 = ... another expression ...
> > END
> >
> > I could not yet translate this to PgSQL, as I can't find any control
> > structures, variable declaractions, etc.
> > Am I missing something important?
> >
>
> Absolutely, that is a perfectly normal SP, i use those constructors
> everyday, maybe you dont have searched in the docs?.
> Perl?, i dont think so, PL/pgSQL is all what you need,
>

Yes, oops. I have overlooked this.
It wasn't listed where I expected it, sorry.

Greetings,
Andre




Re: Moving from Sybase to Postgres - Stored Procedures

From
Sven Willenberger
Date:

Andre Schnoor wrote:
> "Joshua D. Drake" wrote:
>
>>Andre Schnoor wrote:
>>
>>>Hi,
>>>
>>>I am moving from Sybase to pgsql but have problems with stored procedures.
>>>The typical procedure uses
>>>
>>>a) named parameters,
>>>b) local variable declarations and assignments
>>>c) transactions
>>>d) cursors, views, etc.
>>>
>>>I can't seem to find these things in the Postgres function syntax.
>
>
> [...]
>
>
>>Perhaps if you provided the actual problem? Is there a specific
>>procedure that you are trying to port that you do not understand in the
>>PgSQL sense?
>
>
> Thank you for asking, Joshua. I've put an example procedure skeleton here:
>
> CREATE PROCEDURE do_something
>     @song_id int,
>     @user_id int,
>     @method int,
>     @length int = 0,
>     @date_exact datetime,
>     @default_country int = null
> AS
>    -- temporary variables
>    DECLARE
>       @artist int,
>       @sample int,
>       @date varchar(32),
>       @country int
> BEGIN
>     -- assign temporary variables
>     select @date = convert(varchar(32),@date_exact,101)
>     select @artist = user_id, @sample = is_sample from sto_song where song_id = @song_id
>     -- perform conditional code
>     if (@sample = 1) begin
>         begin transaction
>         ... do something ...
>         commit transaction
>     end else begin
>         ... do something else ...
>     end
>     -- return results
>     select
>         result1 = ... some expression ...,
>         result2 = ... another expression ...
> END
>
> I could not yet translate this to PgSQL, as I can't find any control structures, variable declaractions, etc.
>
I think what you want is plpgsql (which needs to instantiated on the
database in question)
createlang -U postgres plgsql dbname (for example)

The documentation is pretty decent on the language itself: for example:

CREATE FUNCTION somefunction (integer, integer, timestamp) RETURNS
[setof] datatype AS $$
DECLARE
    -- alias the passed arguments
    thesong_id ALIAS FOR $1;
    theuser_id ALIAS FOR $2;
    datetime ALIAS FOR $3;
    -- temporary variables
    artist int;
    sample int;
    thedate date;
BEGIN
    thedate := datetime::date;
    SELECT INTO artist user_id from sto_song where song_id = thesong_id;
    SELECT INTO sample is_sample from sto_song where song_id = thesong_id;
    IF sample = 1 THEN
        -- do stuff
    ELSE
        -- do other stuff
    END IF;
    RETURN something;
END;
$$ LANGUAGE plpgsql;

See if that helps you ... it really looks as though the languages are
similar enough that moving the stored procedures should a fairly decent
proposition.

Sven