Клиент Oracle требует скобки вокруг имен столбцов? - PullRequest
0 голосов
/ 10 января 2012

Меня недавно попросили перенести нашу базу данных MSSQL в базу данных Oracle.

Я использую старый традиционный способ выполнения SQL-запросов.

по какой-то причине, неизвестной мнеOracle требует, чтобы я поставил круглые скобки вокруг имен столбцов (почему?) Есть ли обходной путь для этого?

Следующий код не будет выполнен из-за круглых скобок (используется для правильной работы под MSSQL)

using (var msq = new OracleConnection(sConnectionString))
{
    msq.Open();
    OracleCommand msc = msq.CreateCommand();
    msc.CommandText = @"SELECT level_1,element_id FROM tnuot_menu_tree 
                       WHERE level_1 IN 
                           (SELECT mt.level_1 FROM tnuot_menu_tree mt 
                               WHERE mt.element_id IN
                               (SELECT element_tree_id FROM tnuot_menu_elements 
                                WHERE UPPER(element_link) LIKE :url)) 
                       AND level_2 = 0 AND level_3 = 0";

    msc.Parameters.Add("url", SqlDbType.VarChar);
    msc.Parameters["url"].Value = "%" + sName.ToUpper();
    OracleDataReader mrdr = msc.ExecuteReader();

    while (mrdr.Read())
    {
        sResult.arDirectResult.Add(mrdr[0].ToString());
        sResult.arDirectResult.Add(mrdr[1].ToString());
        break;
    }

    msc.Dispose();
    mrdr.Dispose();
    msq.Close();
}

Вместо этого в обозревателе серверов VS последний запрос «переводится» на

SELECT "level_1", "element_id"
FROM "tnuot_menu_tree"
WHERE ("level_1" IN
    (SELECT "level_1" FROM "tnuot_menu_tree" mt
     WHERE ("element_id" IN
         (SELECT "element_tree_id" FROM "tnuot_menu_elements"
          WHERE (UPPER("element_link") LIKE '%DEFAULT.ASPX'))))) 
AND ("level_2" = 0) AND ("level_3" = 0)

, что хорошо работает.

Есть идеи, как избавиться от этой неприятной задачи?

Ответы [ 2 ]

5 голосов
/ 10 января 2012

Возможно, это не скобки, которые необходимы; это двойные кавычки. Это эквивалентно использованию в SQLServer квадратных скобок - здесь это может быть необходимо, поскольку таблицы были созданы с именами в нижнем регистре, но без двойных кавычек Oracle автоматически преобразует имена в верхний регистр.

3 голосов
/ 10 января 2012

Основное различие между вашим первым и вторым запросом заключается в кавычках (а не в скобках). Дополнительные скобки не нужны. Они кажутся странным артефактом проводника VS-сервера.

Вопреки распространенному мнению, Oracle учитывает регистр. Имена столбцов level_1 и LEVEL_1 различны. Если имена столбцов и таблиц в верхнем регистре, регистр не имеет значения, поскольку Oracle преобразует все идентификаторы без кавычек в операторах SQL в верхний регистр.

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

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