1

PostgreSQL で単純な SELECT を使用してストアド プロシージャ/関数を作成しました。

CREATE FUNCTION select_proc2()
RETURNS SETOF procedure AS
$DELIMETER$
SELECT * FROM procedure;
$DELIMETER$
LANGUAGE 'sql'

これは機能しますが、次のように具体的にしようとしたとき:

CREATE FUNCTION select_proc2(INT)
RETURNS SETOF procedure AS
$DELIMETER$
SELECT "Fname" FROM procedure where "Id" = $1;
$DELIMETER$
LANGUAGE 'sql'

エラーを返します。

エラー: プロシージャを返すように宣言された関数の戻り値の型が一致しません
詳細: 最後のステートメントは、整数ではなく文字を返します
列 1. CONTEXT: SQL 関数 "select_proc2"

思いつく限りの解決策を試しました。このエラーを解決する方法を知っている人はいますか?

4

2 に答える 2

1

RETURN実際に返されるものに型を適合させる必要があります。

CREATE OR REPLACE FUNCTION select_proc2(int)
  RETURNS SETOF text AS
$func$
SELECT "Fname" FROM procedure WHERE "Id" = $1;
$func$ LANGUAGE sql

2 番目のバージョンでは、1 つの列のみを返します。名前からデータ型を導き出していますtextが、それは単なる推測です。

がまたは別の方法で定義され"Id"た の主キー列である場合、返されるのは 1 行のみであり、次のように簡略化できます。procedureUNIQUE

  RETURNS text

また、言語名を引用しないでください。sqlここでは識別子であり、文字列リテラルではありません。歴史的な理由で許容されているだけですが、将来のバージョンではおそらくエラーになるでしょう。

列名に関して: 私のアドバイスは、引用符で囲まれていない小文字の識別子を Postgres だけで使用することです。「識別子とキーワード」の章を読んで、列名としての"id""Id"IDまたはの意味を理解してください。id

于 2013-02-03T22:33:45.213 に答える
0

フィールド名を囲む引用符を削除します (" なし):

  CREATE FUNCTION select_proc2(INT)
  RETURNS SETOF procedure AS
  $DELIMETER$
  SELECT Fname FROM procedure where Id = $1;
  $DELIMETER$
  LANGUAGE 'sql'
于 2013-02-02T17:57:07.160 に答える