こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

pl/pgsqlで変数の扱い

pl/pgsqlで変数が文字列として扱われてしまうのですがどうすればいいのでしょうか。
具体的には以下のような感じです。

CREATE OR REPLACE FUNCTION test_func() RETURNS VOID AS $$
DECLARE

test_val TEXT ;
ofs_num INTEGER := 0;
lmt_num INTEGER := 0;
t_name TEXT := 'schema1.table1';

BEGIN

SELECT INTO ret_val * FROM t_name OFFSET ofs_num LIMIT lmt_num;

END;
$$ LANGUAGE plpgsql;

上記のofs_numやlmt_numは変数として認識してくれるのですが
FROMに続く「t_name」が変数ではなくそのままの文字列として認識されてしまいます。

t_nameを変数として認識させる方法はありませんでしょうか。

教えていただけると助かりますm(_)m

投稿日時 - 2013-03-18 23:07:45

QNo.8000308

困ってます

質問者が選んだベストアンサー

最新のバージョン9.2であっても、PL/pgSQL では SELECT INTO は使用できません。(下記ページの注釈参照)
http://www.postgresql.jp/document/9.2/html/sql-selectinto.html
したがって、SELECT INTO の様なことを行う場合は CREATE TABLE AS に書き直してやる必要が有ります。

また、PL/pgSQL 内で動的にSQLを生成して実行する場合は EXECUTE を使う必要性が有るようです。
http://www.postgresql.jp/document/9.2/html/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN


例)

BEGIN

EXECUTE 'CREATE TABLE ret_val AS SELECT * FROM ' || t_name::regclass || ' OFFSET ' || ofs_num || ' LIMIT ' || lmt_num;

END;

投稿日時 - 2013-03-19 08:27:26

お礼

お礼が遅くなってしまいすみませんでした。
かなり悩んでいた部分だったので本当に助かりました。
お教えいただいたとおりにしたところ期待通りの結果が得られました。
参考リンクも載せていただきありがとうございます。
ありがとうございました。m(_)m

投稿日時 - 2013-03-28 01:02:57

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問