Thread: Error when calling this function....

Error when calling this function....

From
Dan Jewett
Date:
Am I wrong to assume that I can simply call the following function
with SELECT catalog_batch(); ?
Additionally, I am still unclear as to how I should handle the return
type for this function.  Is what I have ok?  Should the word Complete
in the return statement be quoted?


CREATE FUNCTION catalog_batch() RETURNS text AS '

    DECLARE
        mp3rec RECORD;
    BEGIN
        FOR mp3rec IN SELECT * FROM mp3catalog LOOP

        INSERT INTO album (title, media, path, release_date)
VALUES (mp3catalog.album, mp3catalog.audioformat, mp3catalog.path,
mp3catalog.year);

        INSERT INTO track (album_id, trk_no, trk_title, time,
genre, bitrate, channel, notes) VALUES (SELECT
currval("album_album_id_seq"), mp3catalog.track, mp3catalog.title,
mp3catalog.time, mp3catalog.genre, mp3catalog.bitrate,
mp3catalog.channels, mp3catalog.comment);

        INSERT INTO participant (name) VALUES (mp3catalog.artist);

        INSERT INTO performance (album_id, participant_id)
VALUES (SELECT currval("album_album_id_seq"), SELECT
currval("participant_participant_id_seq"));

        END LOOP;
        RETURN Complete;
    END;'

    LANGUAGE 'plpgsql';

recordings=> select catalog_batch();
NOTICE:  Error occurred while executing PL/pgSQL function catalog_batch
NOTICE:  line 9 at SQL statement
ERROR:  parser: parse error at or near "SELECT"

and from phpPgAdmin:

Database recordings

No table detected... unable to retrieve primary or unique keys for edit/delete
Error - /Library/WebServer/Documents/phpPgAdmin/sql.php -- Line: 112

PostgreSQL said: ERROR: parser: parse error at or near "SELECT"
Your query:
select catalog_batch()


Re: Error when calling this function....

From
"Henshall, Stuart - Design & Print"
Date:

Dan Jewett wrote:
> Am I wrong to assume that I can simply call the following function
> with SELECT catalog_batch(); ?
> Additionally, I am still unclear as to how I should handle the return
> type for this function.  Is what I have ok?  Should the word Complete
> in the return statement be quoted?
>
>
> CREATE FUNCTION catalog_batch() RETURNS text AS '
>
>       DECLARE
>               mp3rec RECORD;
>       BEGIN
>               FOR mp3rec IN SELECT * FROM mp3catalog LOOP
>
>               INSERT INTO album (title, media, path, release_date)
> VALUES (mp3catalog.album, mp3catalog.audioformat, mp3catalog.path,
> mp3catalog.year);
>
>               INSERT INTO track (album_id, trk_no, trk_title, time,
> genre, bitrate, channel, notes) VALUES (SELECT
> currval("album_album_id_seq"), mp3catalog.track, mp3catalog.title,
> mp3catalog.time, mp3catalog.genre, mp3catalog.bitrate,
> mp3catalog.channels, mp3catalog.comment);
>
>               INSERT INTO participant (name) VALUES
> (mp3catalog.artist);
>
>               INSERT INTO performance (album_id, participant_id)
> VALUES (SELECT currval("album_album_id_seq"), SELECT
> currval("participant_participant_id_seq"));
>
>               END LOOP;
>               RETURN Complete;
>       END;'
>
>       LANGUAGE 'plpgsql';
>
> recordings=> select catalog_batch();
> NOTICE:  Error occurred while executing PL/pgSQL function
> catalog_batch NOTICE:  line 9 at SQL statement
> ERROR:  parser: parse error at or near "SELECT"
>
> and from phpPgAdmin:
>
> Database recordings
>
> No table detected... unable to retrieve primary or unique keys for
> edit/delete Error - /Library/WebServer/Documents/phpPgAdmin/sql.php
> -- Line: 112
>
> PostgreSQL said: ERROR: parser: parse error at or near "SELECT" Your
> query: select catalog_batch()
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to
> majordomo@postgresql.org)
You don't need the VALUES when you select ie:
INSERT INTO tbl (a,b) SELECT a,b FROM tbl2;
hth,
- Stuart

Re: Error when calling this function....

From
Dan Jewett
Date:

You don't need the VALUES when you select ie:
INSERT INTO tbl (a,b) SELECT a,b FROM tbl2;
hth,
- Stuart

Stuart,

Thanks for the help on the syntax.  My new problem is that now the function seems to be looping endlessly.  No records are being inserted but when I check the 'album_album_id_seq' after stopping the function I see that it's value has been incremented to some really high number.  I've tried stripping the function down to just the first INSERT statement with the same result.  Does the fact that I don't have a WHERE clause in the FOR/SELECT make any difference?

Thanks for any input,
Dan

My new function:

CREATE FUNCTION catalog_batch() RETURNS text AS '

       DECLARE
                mp3rec RECORD;
        BEGIN
           FOR mp3rec IN SELECT * FROM mp3catalog LOOP
            
                INSERT INTO album (title, media, path, release_date) VALUES (mp3catalog.album, mp3catalog.audioformat, mp3catalog.path, mp3catalog.year);
              
                INSERT INTO track (album_id, trk_no, trk_title, time, genre, bitrate, channel, notes) SELECT currval("album_album_id_seq"), mp3catalog.track, mp3catalog.title, mp3catalog.time, mp3catalog.genre, mp3catalog.bitrate, mp3catalog.channels, mp3catalog.comment;
       
                INSERT INTO participant (name) VALUES (mp3catalog.artist);
             
                INSERT INTO performance (album_id, participant_id) SELECT currval("album_album_id_seq"), currval("participant_participant_id_seq");

             END LOOP;
               RETURN Complete;
        END;'
  
        LANGUAGE 'plpgsql';