2016-07-05 21 views
0

列名を指定した後、私はエラーを取得し、この関数を呼び出した後、このPostgreSQLのあいまいな列参照

CREATE OR REPLACE FUNCTION factors_apart_sa() 
    RETURNS TABLE(surf_area integer, sa_factor numeric) AS 
$BODY$ 
BEGIN 
    RETURN QUERY SELECT factors_apart_sa.surf_area, factors_apart_sa.sa_factor FROM factors_apart_sa; 
END; 

$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 

のような機能を持っている:私が指定している場合

column reference "factors_apart_sa.surf_area" is ambiguous 

はどのように来るが、それはまだ曖昧ですテーブル名ここで

は、テーブルfactors_apart_saです:

CREATE TABLE factors_apart_sa 
(
    factors_apar_sa_id bigserial NOT NULL, 
    surf_area integer, 
    sa_factor numeric(19,4) NOT NULL 
) 
+0

がされていないため、列 'surf_area'でテーブルを返すfactors_apart_sa'関数':

は、行の機能returnigセットはFROM句に入れ呼び出すには?関数とテーブルが同じ名前で始まるのはなぜですか? – freakish

+0

ありがとう、しかし、関数の戻り値の名前を変更すると、エラーは出ませんが、結果として1つの列しか得られません。私は結果がPK列のないテーブルのクローンであることが必要です。 – KasparTr

答えて

1

表の別名使用します。テーブルや関数の同じ名前を持つことは良い考えではありません

CREATE OR REPLACE FUNCTION factors_apart_sa() 
    RETURNS TABLE(surf_area integer, sa_factor numeric) AS 
$BODY$ 
BEGIN 
    RETURN QUERY SELECT f.surf_area, f.sa_factor FROM factors_apart_sa f; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE; 

を。

select f.* 
from factors_apart_sa() f; 
+0

このメソッドは、1つの列を持つテーブルを返します。私は、 "surf_area"と "sa_factor"という名前の2つのカラムを持つ返されたテーブルが必要です。これは、既存のjavaコードの制限のためです。 – KasparTr

+0

いいえ、関数を正しく呼び出さない。編集された答えを参照してください。 – klin

+0

そうですが、これはコードからjavaから関数を呼び出すときに機能します:CallableStatement文= con.prepareCall( "{call factors_apart_sa()}"); ? – KasparTr

関連する問題