Функция LEFT в Oracle

Вопрос: Я просматриваю хранимую процедуру Oracle (10g) и нахожу следующую функцию LEFT/RIGHT. TO_DATE(LEFT('01-Jun-1201',9)) В редакторе Toad я не могу запустить эту функцию и изменить ее на LPAD TO_DATE(LPAD('01-Jun-1201',9)) Хранимая процедура работает нормально с функцией LEFT/RIGHT но она работает быстрее, если я использую LPAD/RPAD. Есть ли какая-либо функция LEFT в Oracle, и если нет, тогда почему

Вопрос:

Я просматриваю хранимую процедуру Oracle (10g) и нахожу следующую функцию LEFT/RIGHT.

TO_DATE(LEFT(’01-Jun-1201′,9))

В редакторе Toad я не могу запустить эту функцию и изменить ее на LPAD

TO_DATE(LPAD(’01-Jun-1201′,9))

Хранимая процедура работает нормально с функцией LEFT/RIGHT но она работает быстрее, если я использую LPAD/RPAD.

Есть ли какая-либо функция LEFT в Oracle, и если нет, тогда почему хранимая процедура работает нормально?

SELECT SUM(DECODE(SIGN(TO_DATE(LEFT(’01-Jun-12′, 9)) — TO_DATE(logdate)), -1, totaltime, 0, totaltime, 0)) AS totaltime FROM AREA2.v_area WHERE logdate >= TO_DATE(RIGHT(’01-Jun-12′, 9)) AND logdate <= TO_DATE(’30-Jun-12′) Лучший ответ:

В Oracle нет зарегистрированной функции LEFT(). Найдите полный набор здесь.

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

select * from all_objects where object_name = ‘LEFT’

Но возникает вопрос, почему хранимая процедура работает, а запрос – нет. Одно из возможных решений заключается в том, что хранимая процедура принадлежит другой схеме, которая также имеет функцию LEFT(). Они предоставили права на процедуру, но не ее зависимости. Это работает, потому что хранимые процедуры выполняются с привилегиями DEFINER по умолчанию, поэтому вы запускаете хранимую процедуру, как если бы вы были ее владельцем.

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

Ответ №1

Я обнаружил, что LEFT и RIGHT не поддерживаются в Oracle. Они используются в SQL Server, MySQL и некоторых других версиях SQL. В Oracle вам необходимо использовать функцию SUBSTR. Вот простые примеры:

LEFT (‘Data’, 2) = ‘Da’ -> SUBSTR(‘Data’,1,2) = ‘Da’ RIGHT (‘Data’, 2) = ‘ta’ -> SUBSTR(‘Data’,-2,2) = ‘ta’

Обратите внимание, что отрицательное число возвращается с конца.

Ответ №2

LEFT не является функцией в Oracle. Вероятно, это произошло от знакомого с SQL Server:

Возвращает левую часть символьной строки с указанным количеством символов.

— Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse LEFT ( character_expression , integer_expression ) Ответ №3

Левая функция в Oracle эквивалентна Substr (char_expr, -n). Например:

substr(txtCol, -3) = left(txtCol, 3)

Надеюсь это поможет.

Оцените статью
Добавить комментарий