Доступ к отдельному столбцу с помощью ссылки на базу данных - PullRequest
0 голосов
/ 10 января 2019

Я новичок в мире Oracle. Недавно я создал ссылку на базу данных в Oracle для извлечения данных из SQL Server, и я могу получить данные.

SELECT * FROM emp@dblink

Приведенный выше запрос извлекает все строки из таблицы "emp", размещенной на SQL Server.

Но когда я ссылаюсь на конкретный столбец, как показано ниже, Oracle выдает ошибку.

--This query failed
SELECT empid FROM emp@dblink

Ошибка: ORA-00904: «EMPID»: неверный идентификатор

Но когда я заключил столбец empid в двойные кавычки, он начал работать.

--This query passed
SELECT "empid" FROM emp@dblink

Мне интересно, почему я получил ошибку, когда ссылаюсь на отдельный столбец, не заключая его в двойные кавычки.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

В Oracle столбцы в словаре данных обычно нечувствительны к регистру в следующем:

select empno from EMP
select EMPNO from emp
select EMPNO from Emp

будет счастливо совпадать со столбцом EMPNO в словаре данных для вызываемой EMP. Если вы хотите иметь чувствительность к регистру, используйте двойные кавычки, например

select "EmpNo" from EMP

будет работать до тех пор, пока таблица EMP была первоначально определена с:

create table emp ("EmpNo" int)

и т.д.. SQL Server отличается и сохраняет регистр в словаре, поэтому, когда мы запрашиваем его из Oracle по ссылке dblink, мы сохраняем регистр. Таким образом, столбец MixedCase в SQL Server должен называться «MixedCase» из Oracle.

0 голосов
/ 10 января 2019

[TL; DR] Самое простое, что можно сделать, это никогда не использовать двойные кавычки вокруг имен объектов и просто позволить oracle управлять чувствительностью к регистру по умолчанию, а также если вы ссылаетесь на столбцы в базе данных, чувствительной к регистру. через dblink затем назовите эти столбцы в верхнем регистре, чтобы вам не приходилось использовать двойные кавычки в Oracle.

По умолчанию базы данных Oracle чувствительны к регистру; однако по умолчанию они также преобразуют все в верхний регистр, так что чувствительность к регистру абстрагируется от вас, пользователя.

CREATE TABLE emp ( empid NUMBER(12,0) );

Тогда:

SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;

Все будут выдавать одинаковый вывод и:

SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;

Выходы:

TABLE_NAME COLUMN_NAME
---------- -----------
EMP        EMPID

(обратите внимание, что имя таблицы в верхнем регистре).

Если вы используете двойные кавычки, то oracle будет уважать ваше использование регистра в идентификаторах объектов:

CREATE TABLE emp ( "empid" NUMBER(12,0) );

Тогда:

SELECT TABLE_NAME, COLUMN_NAME FROM USER_TAB_COLUMNS;

Выходы:

TABLE_NAME COLUMN_NAME
---------- -----------
EMP        empid

(Примечание. Oracle учитывает регистр символов в столбце empid).

и теперь вы можете ссылаться только на столбец, используя:

SELECT "empid" FROM emp;

и эти запросы не будут выполнены:

SELECT empid FROM emp;
SELECT Empid FROM emp;
SELECT EMPID FROM emp;
SELECT eMpId FROM emp;
SELECT "EMPID" FROM emp;

Поскольку Oracle преобразует идентификатор в верхний регистр и столбец EMPID отсутствует, только столбец empid.

Либо используйте двойные кавычки для ссылки на столбец, либо переименуйте столбец в EMPID, чтобы позволить вам использовать стандартное поведение Oracle, заключающееся в абстрагировании от пользователя чувствительности к регистру (но это может нарушить другие запросы, которые используют двойные кавычки) на имя столбца не в верхнем регистре).

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