[pgsql-jp: 38124] Re: pl/pgsqlのinsertファンクションについて

shigemiya acid_rain @ hotpop.com
2007年 3月 8日 (木) 23:52:03 JST


繁宮です。
お世話になっております。

佐藤様、ご教授ありがとうございました。
少ない情報から、的確な回答有難うございました。
以後、環境面などの情報も気をつけます。

今回、私が使用している環境は8.1.8です。
指摘していただきました通り、EXECUTE文を変更したら
なんとか、1レコードのinsertは可能になりました。

複数レコード分の情報を引数に指定してinsertには
まだ道のりが遠いように感じますが、マニュアルを
見ながら頑張ってみたいと思います。


以上です。ありがとうございました。
On Wed, 07 Mar 2007 23:59:22 +0900 (JST)
Tomoaki Sato <sato @ sraoss.co.jp> wrote:

> 佐藤です。
> 
> > 初めまして。繁宮と申します。
> > PostgreSQLを勉強し始めた初心者です。よろしくお願いします。
> > 
> > pl/pgsqlで単一テーブルに対して複数レコードをinsertするファンクションを
> > 作ろうとしていますが、上手くいきません。
> 
> 何がうまくいかないのか、どのバージョンを使っているのか、そういったこと
> を書きましょう。とりあえずそれは置いておくとして、
> 
>   <〜中略〜>
> ここで関数を定義した際にはエラーにならなかったと思いますが、
> 
> > #使用方法
> > select test_insert(('1','tarou'));
> > ================================================================
> 
> おそらく関数を実行するとエラーになったと思います。
> 
> > どのようにファンクション定義をすれば上手くいくかご教授お願いします。
> 
> それは EXECUTE 文に問題があるからです。以下のように EXECUTE 文を記述し
> ていますが、
> 
>   execute ''insert into test(id,name) values(result.id, result.name)'';
> 
> 変数を参照する際には、上記のように文字列リテラルに変数を直接埋め込まず、
> 以下のように文字列リテラルと変数を || 演算子で結合して組み立てる必要が
> あります。
> 
>   execute ''insert into test(id,name) values(''
>       || quote_literal(result.id)
>       || '', ''
>       || quote_literal(result.name)
>       || '')'';
> 
> なお、quote_literal 関数は変数に特殊文字が含まれていた場合に文字列リテ
> ラルとして適切なエスケープを行う関数です。
> 
> マニュアルには PL/pgSQL について詳しい説明が載っているので、使っている
> バージョンが 8.2 であれば以下の URL に書いてあることに一度目を通してお
> いたほうがいいでしょう。
> 
>   第 37 章 PL/pgSQL - SQL 手続き言語:
>     http://www.postgresql.jp/document/pg823doc/html/plpgsql.html
> 
>   37.6.5. 動的コマンドの実行:
>     http://www.postgresql.jp/document/pg823doc/html/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
> 
> > 過去ログの検索をしたのですが、欲しい情報に上手くたどり着けませんでした。
> > 重複した質問になってしまっていれば、申し訳ありません。
> > 
> > ご教授の程、よろしくお願いします。
> 
> 
> ----
> Tomoaki Sato <sato @ sraoss.co.jp>
> SRA OSS, Inc. Japan

--------------------------
 shige<acid_rain @ hotpop.com>





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