Вопрос:
Я просматриваю хранимую процедуру 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)
Надеюсь это поможет.