[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 メーリングリストの案内