Ошибка: отношение не существует в базе данных greenplum

Я работаю над PostgreSQL 8.2.15 (база данных Greenplum 4.2.0, сборка 1) (HAWQ 1.2.1.0, сборка 10335).

Я написал функцию типа

create or replace function my_function ( 
...
    select exists(select 1 from my_table1 where condition) into result;

я проверял вроде

select my_function(params);

Вполне может работать!

Вот проблема, если я вызову функцию типа

select my_function(params) from my_table2;

Postgres сказал мне, что вы ошибаетесь!

ОШИБКА: отношение "my_table1" не существует (segXX sliceX xx.xx.xx:40003 pid=570406)

  • Эти таблицы и функции находятся в одной схеме.
  • Я могу получить к ним доступ.
  • Оба имени в нижнем регистре.

Итак, помогите мне, пожалуйста.

Что я пробовал

  • переместите эти таблицы из my_schema в общедоступные
  • переместить функцию в общедоступную
  • добавьте префикс схемы, например my_schema.my_table1.

Отредактировано 19.04.2015

Постгрес -> Постгрес

И я попробовал это как

select my_function(params) from pg_stat_activity;

It's OK.

Если отредактировать эту функцию, например

create or replace function my_function ( 
...
    select true into result;

Он может работать в любом случае.


person Clxy    schedule 07.04.2015    source источник
comment
Если вам нужен ответ на этот вопрос, вы можете помочь, предоставив полное определение функции, определение таблицы, схему для каждого объекта и то, что вы получите за SHOW search_path. Также: вы запускали все тесты в одном сеансе с одинаковыми настройками? Кстати, Postgre не является общепринятым названием Postgres.   -  person Erwin Brandstetter    schedule 17.04.2015
comment
@Cixy: не знаю, в вашем ли случае, но вы создаете my_table1 как временную таблицу? Насколько мне известно, в Postgres 8.2 есть ошибка, которая возникает, когда вы пытаетесь выбрать временную таблицу, созданную функцией и выбранную другой... обходным путем является выбор временной таблицы с помощью инструкции выполнения. проверьте это: stackoverflow.com /вопросы/19353438/   -  person Christian    schedule 17.04.2015
comment
@Кристиан Б. Алмейда. Нет, не временная таблица. Просто нормально   -  person Clxy    schedule 18.05.2015
comment
Оператор «существует» не работает с greenplum, использующим postgres 8.2.   -  person precose    schedule 18.05.2015


Ответы (3)


В Postgresql функции обычно выполняются в текущем пути поиска сеанса, поэтому проблема может заключаться в том, что схема my_schema не находится в текущем пути поиска, когда вы запускаете функцию.

Вы можете решить проблему, изменив объявление вашей функции на:

create or replace function my_function (...) ... as $$
 ....
$$ language plpgsql set search_path from current;

(Я не уверен, работает ли это в версии 8)

Если пункт set search_path from current не работает в версии 8.2, здесь пример того, как временно задать путь поиска внутри функции.

person Gregor Raýman    schedule 14.04.2015
comment
Это явно не так, поскольку tables and function are in same schema. Если my_table2 можно найти, то же самое верно и для my_table1. - person Erwin Brandstetter; 15.04.2015
comment
Было бы полезно иметь хотя бы минимальный пример компилируемого кода, демонстрирующего проблему, чтобы мы могли ее воспроизвести. - person Gregor Raýman; 15.04.2015
comment
Извините, что отвечаю так поздно. Мы пошли другим путем. Я проверил ваш ответ сегодня. Это может работать (используя метод по той ссылке, которую вы дали). Большое спасибо!!! Попробуйте добавить награду, но не удалось. Я попробую еще раз позже. - person Clxy; 14.05.2015
comment
Жаль, что я сделал ошибку. Это НЕ может работать. Но тоже большое спасибо. - person Clxy; 18.05.2015

Наконец, я нашел способ, не усовершенствованный, но работающий.

Так как я могу получить доступ к таблице из сегмента. Таким образом, перемещение этой функции из сегмента в качестве подзапроса решит эту проблему.

SQL-скрипт нравится ниже:

select t.*, f.* from my_table2 t join (select my_function(params)) f on true;

Тем не менее, все предложения приветствуются.

person Clxy    schedule 29.05.2015

Ответ — типы функций.

По официальным документам

http://www.greenplumdba.com/greenplum-dba-faq/whatareimmutablestableandvolatilefunctionsingreenplum

person Clxy    schedule 10.06.2015