PL/pgSQLの返り値の取得方法について

このQ&Aのポイント
  • now()の結果を返すだけの以下の2つのPL/pgSQLを試しに作りました。
  • SQL1は正しく結果が返ってきますが、SQL2は結果が何も返ってきません。
  • どなたか説明できる方、いらっしゃいますでしょうか。
回答を見る
  • ベストアンサー

PL/pgSQLの返り値の取得方法について

now()の結果を返すだけの以下の2つのPL/pgSQLを試しに作りました。SQL1は正しく結果が返ってきますが、SQL2は結果が何も返ってきません。どなたか説明できる方、いらっしゃいますでしょうか。宜しくお願い致します。 ■SQL1 CREATE OR REPLACE FUNCTION select_now1() RETURNS date AS $$ DECLARE d_current DATE := NULL; BEGIN SELECT INTO d_current now(); RETURN d_current; END; $$ LANGUAGE PLpgSQL; ■結果1 select_now1 ------------- 2011-03-19 (1 行) ■SQL2 CREATE OR REPLACE FUNCTION select_now2(OUT d_current date) AS $$ DECLARE d_current DATE := NULL; BEGIN SELECT INTO d_current now(); END; $$ LANGUAGE PLpgSQL; ■結果2 select_now2 ------------- (1 行)

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

  • ベストアンサー
  • gacky-79
  • ベストアンサー率100% (14/14)
回答No.1

SQL2 では DECLARE d_current DATE:= NULL; が不要です。この2行を削除すれば、結果が返ることを確認しました。名前がかぶっているため、OUT パラメータを隠してしまっているようです。

oneonelife
質問者

お礼

早々のご回答ありがとうございます。教えて頂いた方法でできました。 OUTパラメータに指定した変数はDECLAREで宣言してはいけないのですね。 どうもありがとうございました。

関連するQ&A

  • 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

  • PL/pgSQLの使い方

    PL/pgSQLについて質問させてください。 以下のような2つのテーブルAとBがあります。 テーブルA: aid | fall0 | fall1 -----+-------+------- 001 | 0 | 0 002 | 0 | 0 テーブルB: bid | aid | fall --------+-----+------ 000001 | 001 | 0 000002 | 001 | 0 000003 | 002 | 0 000004 | 002 | 0 テーブルAとテーブルBの関係は1:nの関係です。 以下のような2つのことがやりたいです。 テーブルAのfall0,fall1,テーブルBのfallはフラグです。 今、テーブルBのaid=001であるすべての行のfallを0から1に変えたとき、 それに対応するテーブルAの行のfall1が0から1にかわる。またテーブルBのaid=001である少なくとも一つの行のfallを0から1に変えたとき、 それに対応するテーブルAの行のfall0が0から1にかわるようなプログラムを作りたいのですが、なかなかうまくいきません。今aid=001のときをやりましたが、aidは任意のときを想定しています。もし、ご存知の方がいらっしゃいましたら教えていただけないでしょうか? よろしくお願いいたします。以下は自分が書いたプログラムです。 drop table b; drop table a; create table A ( aid text primary key, fall0 integer, fall1 integer ); create table B ( bid text primary key, aid text not null references A(aid), fall integer ); insert into A values ('001',0,0); insert into A values ('002',0,0); insert into A values ('003',0,0); insert into B values ('000001','001',0); insert into B values ('000002','001',0); insert into B values ('000003','002',0); insert into B values ('000004','002',0); /* 関数の定義 */ create function tri_test() returns trigger as ' begin declare aid_rec if old.fall=0 and new.fall=1 then update a set fall1=1 where a.aid = select b.aid from b where b.fall = 1); end if; return new; end; ' language 'plpgsql'; /* トリガーの定義 */ create trigger tri_b after update or insert on b for each row execute procedure tri_test(); /* B テーブルへのデータ操作 */ update b set fall=1 where aid='001';

  • プログラムよりファンクションで結果を取得したい

    お世話になります。 vb.net+PostgreSQLでプログラムを作成しております。 接続は「Npgsql.dll」を使用してます。 そこで、プログラムよりファンクションをコールし、 引数で渡した値に一致する結果の取得をしたいのですが、 パターン(2)の様に引数の記述を行うと結果の取得ができません。 どなたか引数で指定した値に一致した結果を取得する方法を お教え頂ければと思います。 【パターン(1)】正常に結果の取得ができた CREATE OR REPLACE FUNCTION pr_select_ok() RETURNS SETOF refcursor AS $BODY$declare cur refcursor; 条件 numeric; begin 条件 := 999; open cur for select 列01, 列02, 列03, 列04 from テーブル where 列01 = 条件 ; return next cur; return; end$BODY$ LANGUAGE 'plpgsql' VOLATILE 【パターン(2)】結果の取得ができない CREATE OR REPLACE FUNCTION pr_select_ok(条件 numeric) RETURNS SETOF refcursor AS $BODY$declare cur refcursor; begin open cur for select 列01, 列02, 列03, 列04 from テーブル where 列01 = 条件 ; return next cur; return; end$BODY$ LANGUAGE 'plpgsql' VOLATILE 以上、よろしくお願い致します。

  • 手続き言語のPl/pgSQLをcreate languageで登録しようとすると。。

    Vine Linux をベースにPostgresSQL-8.0.1で手続き言語のPl/pgSQLをcreate languageで登録しようとすると、function plpgsql () dose not existとなります。 下記のサイトを見てもいまいちわかりません。 http://shigehiro.hp.infoseek.co.jp/pgsql702-user/sql-createlanguage.htm それで、 create function plpgsql () returns plpgsql as 'usr/local/pgsql/lib/plpgsql.so' language 'c'; と打ち込むと Notice: type "plpgsql" is not yet defined Detail: creating a shell type definition. Error: could not access file "usr/local/pgsql/lib/plpgsql.so": そのようなファイルやディレクトリはありません とでます。linux のコマンドに戻って find file のコマンドを打つと、ファイルは存在します。 どうすればよいのか、御存じの方よろしければ教えていただきたいです。

  • PL/pgSQLについて

    お世話になっております。 PL/pgSQLでPostgreSQLのあるテーブルにinsertがかかったら、別のテーブルをtriggerを使ってupdateする構文を書いていますが、上手くいきません。 insertを実行すると、変数が割り当てられていない旨が表示されます。 サンプルは以下の通り DROP FUNCTION k_trig(); CREATE FUNCTION k_trig() RETURNS OPAQUE AS' DECLARE ov1 RECORD; ov2 RECORD; BEGIN SELECT * FROM 個別集計 INTO ov1 WHERE id = new.id; UPDATE 個別集計 SET a1 = ov1.a1 + new.a1, a2 = ov1.a2 + new.a2, a3 = ov1.c + new.a3 WHERE id = new.id; *****以下省略 insert実行 ↓ 「record ov1 is unassigned yet」と表示されます。 declareで宣言しているのですが・・・ 何が原因か教えてください

  • php×postgresでのストアド利用について

    postgresで作成済みの手続き(ストアド)をphpから呼び出し結果を取得したいです。 ■スキーマ CREATE SCHEMA test AUTHORIZATION postgres; ■テーブル CREATE TABLE test.tbl1 ( item1 char(1), item2 int4 ) WITHOUT OIDS; ■ストアド CREATE OR REPLACE FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) AS $BODY$declare begin select current_date + in_para1 into ot_para1; select tablename from pg_tables into ot_para2; select * from test.tbl1 into ot_para3; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) OWNER TO postgres; サンプル的に下準備をしました。 この後、php側でこのストアドを呼び出すコードを教えて下さい。

    • ベストアンサー
    • PHP
  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • PL/SQLでカーソルを指定する方法

    以下のSQL文で、 あるストアドプロシージャを作成し、その引数の値を WHERE句の検索条件に取ってカーソルを宣言したいので すが、どうやってもエラーが出ます。結果として カーソルで格納したデータを呼び出し元に返したいの ですが…。下記の文は間違ってますか? CREATE OR REPLACE PROCEDURE ss( quote IN NUMBER result OUT CHAR ) IS CURSOR cur IS SELECT empname FROM emp WHERE empno = quote; result cur%rowtype; BEGIN OPEN cur; LOOP FETCH cur INTO result; ~ END; どうかよろしくお願いします。

  • PL/SQLのCREATE文でCHAR型で項目ができない

    PL/SQLで以下のようにCREATE文を発行しました。 Bテーブルの項目 項目1,'1'を持つテーブルを作成したいのです。 DECLARE  KBN CHAR(1);  WK_SQL VARCHAR2(4000); BEGIN  KBN := '1';  WK_SQL := 'CREATE TABLE A_TBL AS    SELECT B.項目1 , ' || KBN || ' AS A項目    FROM B_TBL B ' ;  EXECUTE IMMEDIATE WK_SQL; END; 結果はA_TBLの項目、A項目がどうしてもNUMBER型になるのです。初心者で、質問に不備なところもあるかもしれませんが、どうすればよいか、ご教授ください。

  • PL/SQLの文法

    oracle8,windows95を使用しています。 PL/SQLで、シーケンスを削除して再度作成するという処理を書きたいのですが、PL/SQLはまったくの素人のためアドバイスをいただけたら、と思います。 実行したいのは、以下のSQL文です。 1) SQL>DROP SEQUENCE SQC_TEST 2) SQL>CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; これを、PL/SQLで実行するにはどうかけばよいでしょうか? CREATE OR REPLACE PROCEDURE HC_CREATE_SEQ BEGIN DROP SEQUENCE SEQ_車両申請 FROM DUAL; CREATE SEQUENCE SQC_TEST INCREMENT BY 1 START WITH 1 MAXVALUE 9999 MINVALUE 1 CYCLE; END; / と書いてみましたがコンパイルに失敗しましたとおこられてしまいます。 ヒントだけでもいただけたら、と思います。 よろしくお願いいたします。