[pgsql-jp: 35835] PL/pgSQL でユーザ定義型を渡す方法

Yoshiko Kayano Yoshiko.Kayano @ nsgnet.co.jp
2005年 8月 16日 (火) 15:28:24 JST


萱野と申します。

postgreSQL 7.4.8 でストアドプロシージャの作成に挑戦しています。
Oracleのストアドはある程度経験がありますが、こちらは初挑戦です。

カラムが50近くあるテーブルがあり、これにデータをインサートする
ストアドプロシージャを作り、javaから呼び出すことを考えている
のですが、1カラム1引数では、ストアドプロシージャの引数が32まで
という制限にかかってしまいます。

ERROR:  functions cannot have more than 32 arguments

このため、引数として1レコード分をいっぺんに渡したいと
考え、いろいろ調べていましたら、テーブル名を指定することで
その型をあらわすことができるような感じだったので作ってみました。
(この「感じ」自体が間違っているかも・・)

たとえば 以下のようなテーブルがあります。

create table KTST(id SMALLINT, NAME VARCHAR(12));

これにデータを1引数で入れるつもりでストアドを作成しました。

CREATE OR REPLACE FUNCTION INS_KTST(KTST) RETURNS INTEGER
 AS '
DECLARE rec ALIAS FOR $1;
BEGIN
	INSERT INTO KTST (ID, NAME)
		VALUES(rec.ID, rec.NAME);
	RETURN 0;
END;
'
LANGUAGE 'plpgsql';

このストアドをテストするため以下のようなストアドを作りました。

CREATE OR REPLACE FUNCTION SET_KTST() RETURNS INTEGER
 AS '
DECLARE rec KTST;
BEGIN
	rec.ID := 1;
	rec.NAME := ''テスト'';
	PERFORM INS_KTST(rec);
				
	RETURN 0;	
END;
'
LANGUAGE 'plpgsql';

どちらのファンクションもエラーなくCREATEできるのですが、
SET_KTST()実行時に

ERROR:  column "rec" does not exist
CONTEXT:  PL/pgSQL function "set_ktst" line 6 at perform

というエラーが出て、実行できません。

KTST%ROWTYPE という宣言もやってみたのですが、これは
INS_KTST の宣言部分で

syntax error at or near "%" at character 41

となり、作成もできませんでした。

呼び出し方が間違っているのか、また、そもそもINS_KTSTが
合っているのか、Javaから呼べるのか、途方にくれています。
ある程度の数の引数をまとめて渡したい場合、どのように
するのが一般的なのでしょうか。



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