Запретить Postgres от преобразования имен столбцов в нижний регистр [дубликат]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

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

22
задан Milen A. Radev 15 February 2014 в 15:08
поделиться

1 ответ

a_horse_with_no_name является правильным.

В PostgreSQL имена без кавычек нечувствительны к регистру. Таким образом, SELECT * FROM hello и SELECT * FROM HELLO эквивалентны.

Однако цитируемые имена чувствительны к регистру. SELECT * FROM "hello" - , а не , эквивалентный SELECT * FROM "HELLO".

Чтобы создать «мост» между цитируемыми именами и именами без кавычек, неупомянутые имена неявно ограничены, таким образом hello, HELLO и HeLLo эквивалентны "hello", но не "HELLO" или "HeLLo" (OOPS!).

Таким образом, при создании объектов (таблицы, представления, процедуры и т. д.) в PostgreSQL, вы должны указать их как без кавычек, так и с кавычками, но с нижним.


Чтобы преобразовать существующие таблицы / представления / etc, вы можете использовать что-то вроде ALTER TABLE "FOO" RENAME TO "foo".

Или попробуйте изменить дамп из MSSQL, чтобы сделать его «совместимым с PostgreSQL» (чтобы он содержал foo s или "foo" s, но не "FOO" s).

  • Либо путем прямого редактирования файла дампа. (Если вы используете Linux, вы можете сделать sed -r 's/"[^"]+"/\L\0/g' dumpfile - однако следует предупредить, что эта команда также может изменять текст в строковых литералах.)
  • Или указав некоторые параметры при получении дампа из MSSQL. (Я не уверен, есть ли такие опции в MSSQL, никогда не использовал его, но, вероятно, такие варианты должны существовать.)
36
ответ дан Vikas Tikoo 3 September 2018 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: