[pgsql-jp: 33012] Re: functionにてERROR: parser: parse error at or near "$1" と出力されます

Katsuhiko Okano k_okano @ po.ntts.co.jp
2004年 5月 27日 (木) 17:59:54 JST


岡野と申します。はじめまして。

テーブル定義が不明なため推測ですが、INSERT文に書かれている列名の'box_no'と、
関数内のDECLAREで定義している変数名の'box_no'が同じ名前なのが原因ではないでしょうか。

私の環境(Fedora Core 1 + PostgreSQL7.4.2)では、
以下のテーブル定義を使ったところ、同じエラーが出ましたので、
関数内の変数として使っている'box_no'を'box_no_wrk'に変更した結果、
菊地さんの書かれているエラーは出なくなりました。

列名と同じ名前の変数名がないか確認されてはいかがでしょう。


CREATE TABLE t_zaiko_detail (
 control_no VARCHAR(5),
 branch_no VARCHAR(1),
 box_no VARCHAR(3),
 carry_date DATE,
 page INTEGER,
 flg_check BOOL,
 flg_printed BOOL,
 status VARCHAR(1),
 consent BOOL
);


CREATE OR REPLACE FUNCTION f_zd_insert2 (
    varchar(5), varchar(1), date, int, int, int)
returns int as '
DECLARE
    box_no_wrk int;
    start  int;
    end_no int;
BEGIN
    start  := $5 + 1;
    end_no := $5 + $6;

    FOR box_no_wrk IN start .. end_no LOOP

        INSERT INTO t_zaiko_detail (
            control_no, branch_no, box_no, carry_date, page,
            flg_check, flg_printed, status, consent)
        VALUES (
            $1, $2, trim(to_char(box_no_wrk, ''000'')), $3, $4,
            false, false, 0, false);
    END LOOP;
--    return true;
    return 123;
END;
' LANGUAGE 'plpgsql';



Takashi Kikuchi wrote:
> はじめまして菊地孝志と申します。
> 初歩的な質問かと思いますが、いろいろ探し回ったものの解決できないためご教授い
> ただければと思います。
> 
> あるテーブルに子定数だけレコードを追加するというfunctionを作ろうとしていま
> す。
> CREATE FUNCTION自体は通過するのですが、実際に使用しようとすると下記のような
> エラーが表示されます。
> 
> どのあたりに問題があるのでしょうか。
> 申し訳ありませんが、よろしくお願いいたします。
> 
>   test=> SELECT f_zd_insert('00760', '0', '2004/5/26', 1000, 2, 5);
>   WARNING:  Error occurred while executing PL/pgSQL function f_zd_insert
>   WARNING:  line 11 at SQL statement
>   ERROR:  parser: parse error at or near "$1" at character 54
> 
> 
> 作成したfanctionは下記の通りです。
>   CREATE OR REPLACE FUNCTION f_zd_insert (
>       varchar(5), varchar(1), date, int, int, int)
>   returns int as '
>   DECLARE
>       box_no int;
>       start  int;
>       end_no int;
>   BEGIN
>       start  := $5 + 1;
>       end_no := $5 + $6;
> 
>       FOR box_no IN start .. end_no LOOP
> 
>           INSERT INTO t_zaiko_detail (
>               control_no, branch_no, box_no, carry_date, page,
>               flg_check, flg_printed, status, consent)
>           VALUES (
>               $1, $2, trim(to_char(box_no, ''000'')), $3, $4,
>               false, false, 0, false);
>       END LOOP;
>       return true;
>   END;
>   ' LANGUAGE 'plpgsql';
> 
> ----
> Takashi Kikuchi
> kikuchi @ jix.co.jp
> 
> 

-- 
----------------------------------------
Katsuhiko Okano
k_okano @ po.ntts.co.jp




pgsql-jp メーリングリストの案内