Oracle中的LEFT函数

use*_*981 4 sql oracle

我正在寻找Oracle(10g)存储过程,并遇到以下LEFT/ RIGHT函数。

TO_DATE(LEFT('01-Jun-1201',9))
Run Code Online (Sandbox Code Playgroud)

在Toad编辑器中,我无法运行此功能,而必须将其更改为 LPAD

TO_DATE(LPAD('01-Jun-1201',9))
Run Code Online (Sandbox Code Playgroud)

使用LEFT/ RIGHT函数,存储过程运行良好,但是如果使用LPAD/,它将运行得更快RPAD

LEFTOracle中是否有任何Function,如果没有,为什么存储过程运行良好?

TO_DATE(LEFT('01-Jun-1201',9))
Run Code Online (Sandbox Code Playgroud)

Mar*_*inM 9

我发现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'
Run Code Online (Sandbox Code Playgroud)

请注意,负数从末尾算起。


APC*_*APC 5

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

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

select * from all_objects
where object_name = 'LEFT'
Run Code Online (Sandbox Code Playgroud)

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

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