2012-07-03 33 views
1

我正在查看Oracle(10g)存儲過程,並遇到以下LEFT/RIGHT函數。Oracle中的左函數

TO_DATE(LEFT('01-Jun-1201',9)) 

在蟾蜍的編輯,我無法運行該功能,並有將其更改爲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') 
+0

你是否搜索過數據庫,有沒有函數'LEFT'? – V4Vendetta

+1

'LEFT'和'RIGHT'是執行'LPAD' /'RPAD'的SQL Server函數。您可能在數據庫中有一個用戶定義的函數,這將解釋放緩。 – dasblinkenlight

+1

不是很.NETY,imho – smp

回答

3

在Oracle中沒有記錄的LEFT()函數。 Find the full set here

你可能是用戶定義的函數。您可以通過查詢數據字典檢查很輕鬆地:

select * from all_objects 
where object_name = 'LEFT' 

但就是爲什麼存儲過程工程和查詢不的問題。一種可能的解決方案是存儲過程由另一個架構擁有,該架構也擁有LEFT()函數。他們已經授予程序權利,但沒有賦予其依賴性。這是有效的,因爲默認情況下存儲過程以DEFINER權限運行,因此您運行存儲過程就好像您是它的所有者一樣。

如果是這樣,那麼我上面列出的數據字典查詢將無濟於事:它只會返回您擁有權限的對象的行。在這種情況下,您需要將查詢作爲存儲過程的所有者運行,或者以具有查詢DBA_OBJECTS權限的用戶身份進行連接。

+0

是左/右是用戶定義的功能,可以用用戶名訪問它們。 SELECT TO_DATE(TS.LEFT('01 -Jun-1201',9))FROM DUAL; – user1263981

0

LEFT在Oracle中不是一個函數。這可能來自熟悉SQL Server的人:

返回具有指定字符數的字符串的左側部分。

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse 
LEFT (character_expression , integer_expression) 
0

我發現,左,右的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' 

請注意,負數從最後算起。