Postgresql: является "публичным". стандартный способ полностью определить имя таблицы в Postgresql? - PullRequest
1 голос
/ 20 апреля 2009

Если я не квалифицируюсь как «публичный». в таблице account_category out account_category будет конфликт с именем таблицы account_category.

Имеет ли "общественность". также работает на других 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';

Ответы [ 3 ]

2 голосов
/ 20 апреля 2009

Что касается public в PostgreSQL, public определяется как имя схемы по умолчанию, если имя схемы не указано. Однако это можно изменить в файле postgresql.conf в строке search_path = xxx. Чтобы увидеть, какие текущие схемы по умолчанию настроены на выполнение следующей команды SQL:

SHOW_ search_path;

Если вы хотите изменить путь к схеме по умолчанию в сеансе открытых запросов, введите следующую команду SQL:

SET search_path = new_path;

Однако в примере, который вы опубликовали, я считаю, что конфликт имен, с которым у вас проблемы, связан не с именем схемы, а с функцией именем параметра account_category и именем таблицы account_category. Вы можете переименовать имя вашего параметра, чтобы избежать этого конфликта. В базах данных со многими схемами для ясности я часто явно указываю public в начале имен объектов базы данных.

Что касается вашего второго вопроса, я не думаю, что PostgreSQL уникален в своем использовании public, но я знаю, что многие другие базы данных делают свои схемы по-другому.

2 голосов
/ 20 апреля 2009

Public - имя схемы по умолчанию.

Например, в MySQL у него нет схемы (если я помню). Кроме того, если вы используете другую схему вместо общедоступной, ваш код будет поврежден.

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

Я бы рекомендовал использовать другое имя переменной. Вероятно, есть и другой путь.

0 голосов
/ 20 апреля 2009

Конфликт возникает из-за того, что вы использовали одно и то же имя для вашей переменной и имени таблицы.

Это очень плохой выбор имени, и он может привести ко многим проблемам.

Например:

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;

Этот код в принципе не имеет никакого смысла, потому что парсер не может сказать, что означает "somename = somename". То же самое касается имен таблиц (до некоторой степени).

Как правило, вы хотите, чтобы ваши идентификаторы (имена таблиц, имена столбцов, имена переменных) были уникальными.

Я предпочитаю использовать префикс "in_" для аргументов, но ваш выбор схемы именования может быть другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...