2009-04-20 11 views
1

私は「パブリック」の資格がない場合。 account_categoryテーブルのout account_categoryは、account_categoryテーブル名と競合します。PostgreSQL: "public"です。 PostgreSQLのテーブル名を完全修飾するための標準的な方法は?

「公開しますか?」また、他のRDBMS上で動作しますか?

CREATE OR REPLACE FUNCTION X_RAIN(x VARCHAR, OUT user_id VARCHAR, out account_category varchar, out depth int) returns setof record 
AS 
$$ 
BEGIN 
    return query 
    select uar.account_id, c.account_category, c.depth 
    from account_with_types_chart_of_account uar 
    inner join public.account_category c using(account_category_id); 
END; 
$$ LANGUAGE 'plpgsql'; 

答えて

2

PostgreSQLのpublicに関しては、publicは、スキーマ名が指定されていない場合のデフォルトのスキーマ名として定義されます。ただし、これはsearch_path = xxx行のpostgresql.confファイルで変更できます。 、あなたが開いているクエリセッションでのデフォルトスキーマのパスを変更したい場合は

SHOW_ search_path; 

次のSQLコマンドを発行します:あなたの現在のデフォルトのスキーマは、次のSQLコマンドを発行するように設定されているかを確認するには

SET search_path = new_path; 

しかし、あなたが掲示した例では、私が問題を抱えている命名の競合は、スキーマ名ではなく、関数のパラメータ名 account_categoryとテーブル名account_categoryであると信じています。この矛盾を避けるために、パラメータ名の名前を変更できます。多くのスキーマを持つデータベースでは、わかりやすくするために、データベースオブジェクト名の先頭にpublicを指定することがよくあります。

あなたの2番目の質問については、私は、PostgreSQLは、公共のその使用にユニークだとは思わないが、私は、他の多くのデータベースが別の方法で自分のスキーマを行うことを知っています。

2

公開はデフォルトのスキーマ名です。

例えば、MySQLではスキーマはありません(私が思い出した場合)。また、publicの代わりに別のスキーマを使用すると、コードが破損します。

http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html

私は別の変数名を使用してお勧めします。おそらく別の方法もあります。

0

変数とテーブル名に同じ名前を使用したため、競合が発生します。

これは命名の非常に悪い選択であり、多くの問題を引き起こす可能性があります。例えば

:パーサは「somenameの= somenameの」手段をどのように伝えることができないので、

create function x (somename TEXT) returns bool as $$ 
declare 
    tempbool int4; 
begin 
    select true INTO tempbool from some_table where somename = somename; 
    return tempbool; 
end; 
$$ language plpgsql; 

このコードは、基本的には、どんな意味がありません。同じ(ある程度の)テーブル名のために行きます。

一般に、識別子(テーブル名、列名、変数名)を一意にする必要があります。

私は、引数に「IN_」接頭辞を使用することを好むが、名前付けスキーマの選択は異なる場合があります。