2012-07-03 19 views
1

Je regarde dans une procédure stockée Oracle (10g) et rencontre la fonction LEFT/RIGHT suivante.Fonction GAUCHE dans Oracle

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

Dans l'éditeur de crapaud, je ne suis pas en mesure d'exécuter cette fonction et doivent changer pour LPAD

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

La procédure stockée fonctionne très bien avec la fonction LEFT/RIGHT mais il court plus vite si J'utilise LPAD/RPAD.

Existe-t-il une fonction LEFT dans Oracle et si non, pourquoi la procédure stockée fonctionne-t-elle correctement?

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

Eh bien, avez-vous cherché dans la base de données, y at-il des fonctions 'LEFT'? – V4Vendetta

+1

'LEFT' et' RIGHT' sont des fonctions SQL Server qui font ce que 'LPAD' /' RPAD' font. Vous pouvez avoir une fonction définie par l'utilisateur dans votre base de données, ce qui expliquerait le ralentissement. – dasblinkenlight

+1

Pas très .NETy, imho – smp

Répondre

3

Il n'existe aucune fonction LEFT() documentée dans Oracle. Find the full set here.

Probablement ce que vous avez est une fonction définie par l'utilisateur. Vous pouvez vérifier que assez facilement en interrogeant le dictionnaire de données:

select * from all_objects 
where object_name = 'LEFT' 

Mais il y a la question de savoir pourquoi la procédure stockée fonctionne et que la requête ne fonctionne pas. Une solution possible est que la procédure stockée appartient à un autre schéma, qui possède également la fonction LEFT(). Ils ont accordé des droits sur la procédure mais pas ses dépendances. Cela fonctionne parce que les procédures stockées s'exécutent avec les privilèges DEFINER par défaut, donc vous exécutez la procédure stockée comme si vous étiez son propriétaire.

Si tel est le cas, la requête de dictionnaire de données que j'ai listée ci-dessus ne vous aidera pas: elle ne retournera que des lignes pour les objets sur lesquels vous avez des droits. Dans ce cas, vous devrez exécuter la requête en tant que propriétaire de la procédure stockée ou vous connecter en tant qu'utilisateur avec les droits d'interroger DBA_OBJECTS à la place.

+0

Oui GAUCHE/DROITE est une fonction définie par l'utilisateur et il est possible d'y accéder avec un nom d'utilisateur. SELECT TO_DATE (TS.LEFT ('01 -Jun-1201 ', 9)) FROM DUAL; – user1263981

0

LEFT n'est pas une fonction dans Oracle. Cela vient probablement de quelqu'un de familier avec SQL Server:

Renvoie la partie gauche d'une chaîne de caractères avec le nombre de caractères spécifié.

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

J'ai découvert que gauche et droite ne sont pas pris en charge les fonctions d'Oracle. Ils sont utilisés dans SQL Server, MySQL et d'autres versions de SQL. Dans Oracle, vous devez utiliser la fonction SUBSTR. Voici des exemples simples:

LEFT ('Data', 2) = 'Da' 

-> SUBSTR('Data',1,2) = 'Da' 

RIGHT ('Data', 2) = 'ta' 

-> SUBSTR('Data',-2,2) = 'ta' 

Notez qu'un nombre négatif compte à partir de la fin.