我正在查看Oracle(10g)存储过程并遇到以下LEFT
/ RIGHT
函数。
TO_DATE(LEFT('01-Jun-1201',9))
在Toad编辑器中,我无法运行此功能,必须将其更改为LPAD
TO_DATE(LPAD('01-Jun-1201',9))
使用LEFT
/ RIGHT
函数存储过程正常运行,但如果我使用LPAD
/ RPAD
,则运行速度会更快。
Oracle中是否有LEFT
函数,如果没有,那么为什么存储过程运行正常?
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')
答案 0 :(得分:4)
Oracle中没有记录的LEFT()函数。 Find the full set here
你所拥有的可能是用户定义的功能。您可以通过查询数据字典轻松检查:
select * from all_objects
where object_name = 'LEFT'
但是存在为什么存储过程有效而查询无效的问题。一种可能的解决方案是存储过程由另一个模式拥有,该模式也拥有LEFT()函数。他们已授予程序权利,但不授予其依赖权。这是有效的,因为默认情况下存储过程以DEFINER权限运行,因此您就像运行它的所有者一样运行存储过程。
如果是这样,那么我上面列出的数据字典查询将无法帮助您:它只返回您拥有权限的对象的行。在这种情况下,您将需要以存储过程的所有者身份运行查询,或者以具有查询DBA_OBJECTS的权限的用户身份进行连接。
答案 1 :(得分:4)
我发现Oracle中不支持LEFT和RIGHT功能。它们用于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 :(得分:0)
LEFT不是Oracle中的一项功能。这可能来自熟悉SQL Server的人:
返回具有指定字符数的字符串的左侧部分。
-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse
LEFT ( character_expression , integer_expression )
答案 3 :(得分:0)
Oracle中的左函数等效于Substr(char_expr,-n)。例如:
substr(txtCol, -3) = left(txtCol, 3)
希望这会有所帮助。