10

我正在查看一个 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')
4

3 回答 3

26

我发现 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'

请注意,负数从末尾开始倒数。

于 2017-08-03T22:48:59.340 回答
8

Oracle 中没有记录的 LEFT() 函数。 在这里找到全套

可能您拥有的是用户定义的函数。您可以通过查询数据字典轻松检查:

select * from all_objects
where object_name = 'LEFT'

但是有一个问题是为什么存储过程有效而查询无效。一种可能的解决方案是存储过程由另一个模式拥有,该模式也拥有 LEFT() 函数。他们已授予程序权限,但未授予其依赖项。这是因为存储过程在默认情况下以 DEFINER 权限运行,因此您运行存储过程就像您是它的所有者一样。

如果是这样,那么我上面列出的数据字典查询将无法帮助您:它只会返回您拥有权限的对象的行。在这种情况下,您需要以存储过程的所有者身份运行查询,或者以有权查询 DBA_OBJECTS 的用户身份连接。

于 2012-07-03T10:58:06.670 回答
0

LEFT 不是 Oracle 中的函数。这可能来自熟悉SQL Server的人:

返回具有指定字符数的字符串的左侧部分。

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
LEFT ( character_expression , integer_expression )  
于 2017-06-13T18:54:02.950 回答