iakioの日記 RSSフィード

2010-11-03

EXIT WHEN NOT FOUND

| 19:19 | EXIT WHEN NOT FOUND - iakioの日記 を含むブックマーク はてなブックマーク - EXIT WHEN NOT FOUND - iakioの日記

昔書いた、PREPARE / EXECUTEにrefcursorを渡すというヤツは無くなったのかもしれない。

無くなっても別に困りはしないのだけれど。

それよりこのテストケースのplpgsql、"exit when not found"って初めて見ました。なんかカッコイイ。

  open c for select * from forc_test;
  loop
    fetch c into r;
    exit when not found;
    raise notice '%, %', r.i, r.j;
    update forc_test set i = i * 100, j = r.j * 2 where current of c;
  end loop;

後置if的なもの?かと思ったらEXITステートメントのオプションですか。CONTINUE WHEN... もあるそうですよ。

MithaMitha2014/03/17 01:17I really wish there were more arecilts like this on the web.

ManjushekharManjushekhar2014/03/17 09:14What a pleasure to find someone who <a href="http://mbooyio.com">idtnfieies</a> the issues so clearly

DilanDilan2014/03/18 09:53Great <a href="http://wghzsgjcy.com">thinikng!</a> That really breaks the mold!

AdrianAdrian2014/03/18 13:33That's not just the best anrews. It's the bestest answer! http://ezmgepcz.com [url=http://wvwrgxj.com]wvwrgxj[/url] [link=http://ptyenh.com]ptyenh[/link]

CelesteCeleste2014/03/18 23:27If inmotfarion were soccer, this would be a goooooal! http://brqkfpiq.com [url=http://hrtbbv.com]hrtbbv[/url] [link=http://hudxxrt.com]hudxxrt[/link]

ychwgqkgfcychwgqkgfc2014/03/19 23:20anmeiqptuhsftrm, <a href="http://www.fxkwmddkmc.com/">rtgdbrqqic</a> , [url=http://www.zboyralwnn.com/]gjafdryuig[/url], http://www.pcpxifkqhj.com/ rtgdbrqqic

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20101103

2008-05-13

複数行複数列を返すPL/pgSQL関数

| 21:43 | 複数行複数列を返すPL/pgSQL関数 - iakioの日記 を含むブックマーク はてなブックマーク - 複数行複数列を返すPL/pgSQL関数 - iakioの日記

たまスパ

IN/OUTパラメータが導入されてからset return functionってどう書くのかいまいちわかってなかったので調べてみました。

OUTパラメータを使う(8.1くらい以降)

CREATE OR REPLACE FUNCTION hoge(OUT a integer, OUT b integer, OUT c integer)
RETURNS SETOF RECORD AS '
BEGIN
  SELECT 1, 2, 3 INTO a, b, c;
  RETURN NEXT;
  RETURN;
END
' LANGUAGE plpgsql;
SELECT * FROM hoge();

引数無しのRETURN NEXTを使うのがポイントのようです。

で、次の2つは伝統的な方法。

CREATE TYPEする

CREATE TABLEでもいいけど。

CREATE TYPE hoge_type AS (a integer, b integer, c integer);
CREATE OR REPLACE FUNCTION hoge()
RETURNS SETOF hoge_type AS '
DECLARE
  rec RECORD;
BEGIN
  SELECT 1 AS a, 2 AS b, 3 AS c INTO rec;
  RETURN NEXT rec;
  RETURN;
END
' LANGUAGE plpgsql;
SELECT * FROM hoge();

aliasを使う

RETURNS SET OF RECORDでも、SELECTする時に明示的に型指定することができます。

CREATE OR REPLACE FUNCTION hoge()
RETURNS SETOF RECORD AS '
DECLARE
  rec RECORD;
BEGIN
  SELECT 1 AS a, 2 AS b, 3 AS c INTO rec;
  RETURN NEXT rec;
  RETURN;
END
' LANGUAGE plpgsql;
=> SELECT * FROM hoge() AS (a integer, b integer, c integer);
 a | b | c
---+---+---
 1 | 2 | 3
(1 row)

LarkLark2012/01/12 03:40Percfet shot! Thanks for your post!

vyrugouvyrugou2012/01/12 18:07WqdaHu <a href="http://bikcuisoadpz.com/">bikcuisoadpz</a>

mgkcabbquvxmgkcabbquvx2012/01/13 23:30ET5tQD , [url=http://oisjuydxiaem.com/]oisjuydxiaem[/url], [link=http://okvxreacafxh.com/]okvxreacafxh[/link], http://yggbtzibtmma.com/

htoxjqbvmzhtoxjqbvmz2012/01/14 20:56Olo51I <a href="http://wiqeutrwdgcf.com/">wiqeutrwdgcf</a>

tcreketcreke2012/01/16 20:33QVaXyc , [url=http://mbbmjjjnoxlu.com/]mbbmjjjnoxlu[/url], [link=http://mnpppqwdumdl.com/]mnpppqwdumdl[/link], http://jdoqylxyapyb.com/

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080513

2008-04-29

カンマ区切りの文字列を複数の行に分割する方法

| 02:31 | カンマ区切りの文字列を複数の行に分割する方法 - iakioの日記 を含むブックマーク はてなブックマーク - カンマ区切りの文字列を複数の行に分割する方法 - iakioの日記

ある列以外の全ての列をSELECTする方法(又は複数行をカンマ区切りで連結する方法) - iakioの日記 - postgresqlグループで書いた

=> select array_to_string(ARRAY(select t from tbl1), ',');
 array_to_string
-----------------
 aaa,bbb,ccc
(1 row)

の逆はできないのかな、とふと思いました。つまり、

=> select * from HOGEHOGE(string_to_array('aaa,bbb,ccc', ','));
 HOGEHOGE
----------
 aaa
 bbb
 ccc
(3 row)

となるような関数HOGEHOGEです。

で、無さそうなのでPL/pgSQLで作ってみました。

create or replace function array_enum(anyarray)
  returns setof anyelement as $$
declare
  i integer;
begin
  for i in array_lower($1, 1)..array_upper($1, 1) loop
    return next ($1)[i];
  end loop;
  return;
end;
$$ language plpgsql immutable strict;

PL/pgSQLってanyarray使えるんだ。

=> select * from array_enum(string_to_array('aaa,bbb,ccc', ','));
 array_enum
------------
 aaa
 bbb
 ccc
(3 rows)

5/2追記

コメントいただきました。8.3からregexp_split_to_table()という関数が追加されているそうです。

パターンマッチ - PostgreSQL 8.3.1文章

=> select regexp_split_to_table('aaa,bbb,ccc,ddd', ',');
 regexp_split_to_table
-----------------------
 aaa
 bbb
 ccc
 ddd
(4 rows)

これは簡単♪

syachi5150syachi51502008/04/30 19:378.3以降ならregexp_split_to_table()も使えそうですね

トラックバック - http://postgresql.g.hatena.ne.jp/iakio/20080429