Ce document fait partie d'une série qui fournit des informations clés et des conseils pour planifier et effectuer des migrations de bases de données Oracle® 11g/12c vers Cloud SQL pour PostgreSQL version 12. Outre la section d'introduction à la configuration, la série inclut les éléments suivants :
- Migrer des utilisateurs Oracle vers Cloud SQL pour PostgreSQL : terminologie et fonctionnalités
- Migrer des utilisateurs Oracle vers Cloud SQL pour PostgreSQL : types de données, utilisateurs et tables
- Migrer des utilisateurs Oracle vers Cloud SQL pour PostgreSQL : requêtes, procédures stockées, fonctions et déclencheurs (ce document)
- Migrer des utilisateurs Oracle vers Cloud SQL pour PostgreSQL : sécurité, opérations, surveillance et journalisation
- Migrer des utilisateurs et des schémas de Oracle Database vers Cloud SQL pour PostgreSQL
Requêtes
Oracle et Cloud SQL pour PostgreSQL sont compatibles avec la norme ANSI SQL. Il est donc simple de migrer des instructions SQL en n'utilisant que des éléments de syntaxe de base (par exemple, ne pas spécifier de fonctions scalaires ni aucune autre fonctionnalité étendue d'Oracle). La section suivante aborde les éléments de requête Oracle courants et leurs équivalents dans Cloud SQL pour PostgreSQL.
Syntaxe SELECT et FROM de base
Nom de la fonctionnalité ou syntaxe Oracle | Présentation ou mise en œuvre dans Oracle | Compatibilité avec Cloud SQL pour PostgreSQL | Solution Cloud SQL pour PostgreSQL correspondante ou alternative |
---|---|---|---|
Syntaxe SQL de base pour la récupération de données | SELECT
|
Oui | SELECT
|
SELECT pour l'impression en sortie |
SELECT 1 FROM DUAL
|
Oui | SELECT 1
|
Alias de colonne | SELECT COL1 AS C1
|
Oui | SELECT COL1 AS C1
|
Sensibilité à la casse des noms de table | Pas de sensibilité à la casse (par exemple, le nom de la table peut être orders et/ou ORDERS ). |
Oui | Les noms ne sont pas sensibles à la casse, sauf s'ils sont entre guillemets (par exemple, orders et ORDERS sont traités de la même manière, tandis que "orders" et "ORDERS" sont traités différemment). |
Pour en savoir plus sur la syntaxe SELECT
de Cloud SQL pour PostgreSQL, consultez la documentation.
Vues intégrées
- Les vues intégrées (également appelées tables dérivées) sont des instructions
SELECT
situées dans la clauseFROM
et utilisées comme sous-requêtes. - Les vues intégrées peuvent simplifier les requêtes complexes en supprimant les calculs composés ou en éliminant les opérations de jointure, tout en regroupant plusieurs requêtes distinctes en une seule requête simplifiée.
- Note de conversion : Les vues intégrées Oracle ne nécessitent pas l'utilisation d'alias, tandis que Cloud SQL pour PostgreSQL requiert des alias spécifiques pour chaque vue intégrée.
Le tableau suivant présente un exemple de conversion d'Oracle vers Cloud SQL pour PostgreSQL sous forme d'une vue intégrée.
Oracle 11g/12c | Cloud SQL pour PostgreSQL 12 |
---|---|
SQL> SELECT FIRST_NAME,
Le résultat ressemble à ce qui suit :
FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
|
Sans alias pour la vue intégrée : postgres=> SELECT FIRST_NAME,
Ajout d'un alias à la vue intégrée : postgres=> SELECT FIRST_NAME,
Le résultat ressemble à ce qui suit :
first_name | department_id | salary | date_col
|
Instructions JOIN
Les instructions JOIN
d'Oracle sont compatibles avec les instructions JOIN
de Cloud SQL pour PostgreSQL. Toutefois, l'opérateur de jointure (+)
d'Oracle n'est pas compatible avec Cloud SQL pour PostgreSQL. Pour obtenir le même résultat, vous devez le convertir en syntaxe SQL standard pour les jointures externes.
Le tableau suivant présente un exemple de conversion JOIN.
Type d'instruction JOIN Oracle | Compatible avec Cloud SQL pour PostgreSQL | Syntaxe JOIN de Cloud SQL pour PostgreSQL |
---|---|---|
INNER JOIN
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
CROSS JOIN
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
FULL JOIN
[ OUTER ]
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
LEFT JOIN [ OUTER ]
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
RIGHT JOIN
[ OUTER ]
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
SUBQUERY
|
Oui | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
UNION, UNION ALL, INTERSECT et MINUS
Cloud SQL pour PostgreSQL est compatible avec les opérateurs UNION
, UNION
ALL
et INTERSECT
d'Oracle. L'opérateur MINUS
n'est pas compatible. Cependant, Cloud SQL pour PostgreSQL met en œuvre l'opérateur EXCEPT
, qui est l'équivalent de l'opérateur MINUS
d'Oracle. De plus, Cloud SQL pour PostgreSQL est compatible avec les opérateurs INTERSECT ALL
et EXCEPT ALL
, qui ne sont pas compatibles avec Oracle.
UNION
: joint les ensembles de résultats d'au moins deux instructionsSELECT
et supprime les enregistrements en double.UNION ALL
: joint les ensembles de résultats d'au moins deux instructionsSELECT
sans éliminer les enregistrements en double.INTERSECT
: renvoie l'intersection de deux instructionsSELECT
ou plus uniquement si un enregistrement existe dans les deux ensembles de données. Les enregistrements en double ne sont pas éliminés.INTERSECT ALL
(Cloud SQL pour PostgreSQL uniquement) : renvoie l'intersection de deux instructionsSELECT
ou plus uniquement si un enregistrement existe dans les deux ensembles de données.MINUS (EXCEPT
(dans Cloud SQL pour PostgreSQL) : compare deux instructionsSELECT
ou plus, en renvoyant uniquement les lignes distinctes de la première requête qui ne sont pas renvoyées par les autres instructions.EXCEPT ALL
(Cloud SQL pour PostgreSQL uniquement) : compare deux instructionsSELECT
ou plus, en renvoyant uniquement les lignes de la première requête qui ne sont pas renvoyées par les autres instructions sans éliminer les enregistrements en double.
Notes de conversion
Lors de la conversion d'opérateurs MINUS
d'Oracle vers Cloud SQL pour PostgreSQL, utilisez plutôt les opérateurs EXCEPT
.
Exemples
Fonction Oracle | Mise en œuvre dans Oracle | Compatibilité avec Cloud SQL pour PostgreSQL | Solution Cloud SQL pour PostgreSQL correspondante ou alternative |
---|---|---|---|
UNION
|
SELECT COL1 FROM TBL1
|
Oui | SELECT COL1 FROM TBL1
|
UNION ALL
|
SELECT COL1 FROM TBL1
|
Oui | SELECT COL1 FROM TBL1
|
INTERSECT
|
SELECT COL1 FROM TBL1
|
Oui | SELECT COL1 FROM TBL1
|
MINUS
|
SELECT COL1 FROM TBL1
|
Oui (de Convert MINUS à EXCEPT dans PostgreSQL) |
SELECT COL1 FROM TBL1
|
Fonctions scalaires (à une ligne) et de groupe
Cloud SQL pour PostgreSQL fournit une longue liste de fonctions scalaires (à une seule ligne) et d'agrégation. Certaines fonctions Cloud SQL pour PostgreSQL sont similaires à leurs équivalents Oracle (nom et fonctionnalité identiques, ou nom différent et fonctionnalité similaire). Bien que les fonctions Cloud SQL pour PostgreSQL portent des noms identiques à leurs équivalents Oracle, elles présentent parfois des fonctionnalités différentes.
Les tableaux suivants indiquent quand Oracle et Cloud SQL pour PostgreSQL sont identiques en nom et fonctionnalité (mention "Oui") et quand une conversion est recommandée (tous les cas autres que "Oui").
Fonctions de caractères
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
CONCAT
|
Renvoie str1 concaténé avec str2 :CONCAT('A', 1) = A1
|
Yes | CONCAT
|
Équivalent dans Oracle :CONCAT('A', 1) = A1
|
LOWER/UPPER
|
Renvoie char, avec toutes les lettres en minuscules ou en majuscules :LOWER('SQL') = sql
|
Yes | LOWER/UPPER
|
Équivalent dans Oracle :LOWER('SQL') = sql
|
LPAD/RPAD
|
Renvoie expr1, complétée à gauche ou à droite (pour atteindre une longueur de n caractères) à l'aide de la séquence de caractères de expr2 :LPAD('A',3,'*') = **A
|
Yes | LPAD/RPAD
|
Équivalent dans Oracle :LPAD('A',3,'*') = **A
|
SUBSTR
|
Renvoie une partie de char qui commence à la position du caractère sous la forme d'une sous-chaîne dont la longueur est de : SUBSTR('PostgreSQL', 8, 3)
|
En partie | SUBSTR
|
Identique à Oracle lorsque la position de départ est un nombre positif.SUBSTR('PostgreSQL', 8, 3) Le fait de fournir un nombre négatif en tant que position de départ dans Oracle résulte en une opération de sous-chaîne appliquée à partir de la fin de la chaîne, ce qui est différent du comportement dans Cloud SQL pour PostgreSQL. Utilisez la fonction RIGHT en remplacement si vous souhaitez bénéficier du comportement habituel d'Oracle. |
INSTR
|
Renvoie la position (index) d'une chaîne spécifique à partir d'une chaîne donnée :INSTR('PostgreSQL', 'e')
|
Non | ND | Cloud SQL pour PostgreSQL ne dispose pas de fonction instr intégrée. Une fonction instr compatible avec Oracle peut être mise en œuvre à l'aide de PL/pgSQL. |
REPLACE
|
Renvoie char avec chaque occurrence d'une chaîne de recherche remplacée par une chaîne de remplacement : REPLACE('ORADB', 'ORA', 'PostgreSQL') |
En partie | REPLACE
|
Le paramètre de chaîne de remplacement est facultatif dans Oracle alors qu'il est obligatoire dans Cloud SQL pour PostgreSQL. Lorsque le paramètre est omis, Oracle supprime toutes les occurrences des chaînes de recherche. Vous pouvez obtenir le même comportement dans Cloud SQL pour PostgreSQL en fournissant une chaîne vide comme chaîne de remplacement.REPLACE('ORADB', 'ORA', 'PostgreSQL')
|
TRIM
|
Coupe les caractères de début ou de fin (ou les deux) d'une chaîne :TRIM(both '-' FROM '-PostgreSQL-')
|
Yes | TRIM
|
Équivalent dans Oracle :TRIM(both '-' FROM '-PostgreSQL-')
|
LTRIM/RTRIM
|
Supprime de l'extrémité gauche ou droite de la chaîne tous les caractères qui apparaissent dans la recherche : LTRIM(' PostgreSQL', ' ')
|
Yes | LTRIM/RTRIM
|
Équivalent dans Oracle :LTRIM(' PostgreSQL', ' ')
= PostgreSQL
|
ASCII
|
Renvoie la représentation décimale (dans le jeu de caractères de la base de données)
du premier caractère de "char" : ASCII('A') = 65
|
Yes | ASCII
|
Équivalent dans Oracle :ASCII('A') = 65
|
CHR
|
Renvoie la valeur du code ASCII (valeur numérique comprise entre 0 et 225)
pour un caractère :CHR(65) = A
|
Yes | CHAR
|
Équivalent dans Oracle :CHR(65) = A
|
LENGTH
|
Renvoie la longueur d'une chaîne donnée :LENGTH ('PostgreSQL') = 10
|
Yes | LENGTH
|
Équivalent dans Oracle :LENGTH ('PostgreSQL') = 10
|
REGEXP_REPLACE
|
Recherche un modèle d'expression régulière dans une chaîne :REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
Yes | REGEXP_REPLACE
|
Équivalent dans Oracle :REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
REGEXP_SUBSTR
|
Étend la fonctionnalité de la fonction SUBSTR en recherchant un modèle d'expression régulière dans une chaîne : REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?')
|
Non | ND | Utilisez la fonction REGEXP_MATCH de PostgreSQL pour obtenir une fonctionnalité similaire. |
REGEXP_COUNT
|
Renvoie le nombre d'occurrences d'un modèle dans une chaîne source. | Non | ND | Utilisez la fonction REGEXP_MATCH de PostgreSQL pour obtenir une fonctionnalité similaire. |
REGEXP_INSTR
|
Recherche une position de chaîne (index) d'un motif d'expression régulière |
Non | ND | Convertissez la fonctionnalité en couche d'application. |
REVERSE
|
Renvoie une chaîne inversée.REVERSE('PostgreSQL') = LQSergtsoP
|
Yes | REVERSE
|
Équivalent à Oracle :REVERSE('PostgreSQL') = LQSergtsoP |
Fonctions numériques
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
ABS
|
Valeur absolue de n : ABS(-4.6) = 4.6
|
Yes | ABS
|
Équivalent dans Oracle :ABS(-4.6) = 4.6
|
CEIL
|
Renvoie le plus petit entier supérieur ou égal à n :CEIL(21.4) = 22
|
Yes | CEIL
|
Équivalent dans Oracle :CEIL(21.4) = 22
|
FLOOR
|
Renvoie le plus grand nombre entier inférieur ou égal à n : FLOOR(-23.7) = -24
|
Yes | FLOOR
|
Équivalent dans Oracle :FLOOR(-23.7) = -24
|
MOD
|
Renvoie le reste de m divisé par n :MOD(10, 3) = 1
|
Yes | MOD
|
Équivalent dans Oracle :MOD(10, 3) = 1
|
ROUND
|
Renvoie n arrondi à un nombre entier de chiffres à droite de la virgule :ROUND(1.39, 1) = 1.4
|
Yes | ROUND
|
Équivalent dans Oracle :ROUND(1.39, 1) = 1.4
|
TRUNC (numéro) |
Renvoie n1 tronqué à n2 décimales :TRUNC(99.999) = 99
|
Yes | TRUNCATE
(number) |
Équivalent dans Oracle :TRUNC(99.999) = 99
|
Fonctions de date et heure
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
SYSDATE
|
Renvoie la date et l'heure actuelles définies pour le système d'exploitation sur lequel
réside le serveur de base de données :SELECT SYSDATE FROM DUAL
|
En partie, avec un nom et une mise en forme de fonction différents | CURRENT_TIMESTAMP
|
La fonction CURRENT_TIMESTAMP renvoie un format de date et d'heure différent
de la fonction SYSDATE d'Oracle :SELECT CURRENT_TIMESTAMP
|
SYSTIMESTAMP
|
Renvoie la date du système, y compris les secondes fractionnelles et le fuseau horaire :SELECT SYSTIMESTAMP FROM DUAL
|
En partie avec un nom de fonction différent | CURRENT_TIMESTAMP
|
Cloud SQL pour PostgreSQL renvoie un format de date/heure différent de celui d'Oracle. Le format de date doit correspondre aux formats de date et d'heure d'origine :SELECT CURRENT_TIMESTAMP
|
LOCAL TIMESTAMP
|
Renvoie la date et l'heure actuelles dans le fuseau horaire de la session dans une valeur dont
le type de données est TIMESTAMP :SELECT LOCALTIMESTAMP
FROM DUAL
|
En partie avec une mise en forme de date/heure différente | LOCAL
TIMESTAMP
|
Cloud SQL pour PostgreSQL renvoie un format de date/heure différent de celui d'Oracle. Le format de la date doit être identique au format de date/heure d'origine :SELECT LOCALTIMESTAMP
|
CURRENT_DATE
|
Renvoie la date actuelle dans le fuseau horaire de la session :SELECT CURRENT_DATE FROM DUAL
|
En partie avec une mise en forme de date/heure différente | CURRENT_
DATE
|
Cloud SQL pour PostgreSQL renvoie un format de date/heure différent de celui d'Oracle. Le format de la date doit être identique au format de date/heure d'origine :SELECT CURRENT_DATE
|
CURRENT_TIMESTAMP
|
Renvoie la date et l'heure actuelles dans le fuseau horaire de la session :SELECT CURRENT_TIMESTAMP FROM DUAL
|
En partie, avec une mise en forme de date/heure différente | CURRENT_TIMESTAMP
|
Cloud SQL pour PostgreSQL renvoie un format de date et d'heure différent de celui d'Oracle. Le format de la date doit être identique au format de date/heure d'origine :SELECT CURRENT_TIMESTAMP FROM DUAL
|
ADD_MONTHS
|
Renvoie la date et un nombre entier de mois :ADD_MONTHS(SYSDATE, 1)
|
Non | Non disponible | Pour obtenir la même fonctionnalité dans Cloud SQL pour PostgreSQL, utilisez les opérateurs + / - et spécifiez l'intervalle de temps :SELECT CURRENT_TIMESTAMP + INTERVAL '1 MONTH'
|
EXTRACT (partie de la date) |
Renvoie la valeur d'un champ de date/heure spécifié à partir d'une expression
de date/heure ou d'intervalle :EXTRACT(YEAR FROM DATE '2019-01-31')
|
Yes | EXTRACT (partie de la date) |
Équivalent dans Oracle :EXTRACT(YEAR FROM DATE '2019-01-31')
|
LAST_DAY
|
Renvoie la date du dernier jour du mois contenant la date
spécifiée :LAST_DAY('01-JAN-2019')
|
Non | ND | Pour contourner le problème, utilisez DATE_TRUNC et un opérateur + pour calculer le dernier jour du mois. Le format de date doit être identique à la mise en forme de date/heure d'origine :SELECT DATE_TRUNC('MONTH', DATE '01-JAN-2019') + INTERVAL '1 MONTH -1 DAY'
|
MONTH_BETWEEN
|
Renvoie le nombre de mois compris entre les dates date1 et date2 :MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
|
En partie, avec un format de date/heure différent de la fonction |
AGE
|
La fonction Cloud SQL pour PostgreSQL AGE renvoie l'intervalle entre deux horodatages :AGE(DATE '01-JAN-2019', DATE '01-JAN-2019' - 60)
Pour parvenir aux mêmes valeurs que la fonction Oracle MONTH_BETWEEN , une conversion plus spécifique est requise. |
TO_CHAR (date/heure) |
Convertit une date/heure ou un horodatage en type de données ou en valeur de
VARCHAR2 type de données au format spécifié par le format de date : TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS')
|
Yes | To_CHAR
|
Équivalent dans Oracle :TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
|
Fonctions d'encodage et de décodage
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
DECODE
|
Compare l'expression à chaque valeur de recherche une par une à l'aide d'une instruction IF-THEN-ELSE . |
Non | CASE
|
Utilisez l'instruction Cloud SQL pour PostgreSQL CASE pour obtenir une fonctionnalité similaire. |
DUMP
|
Renvoie une valeur VARCHAR2 contenant le code du type de données, la longueur en octets
et la représentation interne de l'expression. |
Non | N/A | Non compatible |
ORA_HASH
|
Calcule une valeur de hachage pour une expression donnée. | Non | MD5 / SHA224 / SHA256 / SHA385 / SHA512
|
Utilisez la fonction Cloud SQL pour PostgreSQL MD5 pour la somme de contrôle à 128 bits
ou la fonction SHA pour la somme de contrôle à 160 bitsafin de générer des valeurs de hachage. |
Fonctions de conversion
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
CAST
|
Convertit un type de données intégré ou une valeur de type collection en un autre type de données intégré ou valeur de type collection : CAST('1' as int) + 1
|
En partie | CAST
|
La fonction Cloud SQL pour PostgreSQLCAST est similaire à celle d'Oracle CAST mais, dans certains cas, elle doit être ajustée en raison des différences de type de données entre les deux bases de données :CAST('1' as int) + 1
|
CONVERT
|
Convertit une chaîne de caractères d'un jeu de caractères en un autre : CONVERT (
'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
|
En partie | CONVERT
|
La fonction CONVERT de Cloud SQL pour PostgreSQL renvoie une valeur bytea qui est une chaîne binaire plutôt que VARCHAR ou TEXT . Les ensembles de caractères compatibles avec PostgreSQL sont également différents de ceux d'Oracle.CONVERT('Ä Ê Í Õ Ø A B C D E', 'UTF8', 'LATIN1')
|
TO_CHAR (chaîne/numérique) |
La fonction convertit un nombre ou une date en chaîne : TO_CHAR(22.73,'$99.9')
|
En partie | TO_CHAR
|
La fonction TO_CHAR de Cloud SQL pour PostgreSQL offre une fonctionnalité semblable à celle d'Oracle. Cloud SQL pour PostgreSQL accepte une liste de chaînes de mise en forme légèrement différente. Par défaut, Cloud SQL pour PostgreSQL réserve une colonne pour le signe. Il y aura donc un espace avant les nombres positifs. Ce comportement peut être évité en utilisant le préfixe FM :TO_CHAR(22.73,'FM$99.9')
|
TO_DATE
|
La fonction Oracle TO_DATE convertit une chaîne en date en utilisant le format de date/heure spécifique à la source :TO_DATE('2019/01/01', 'yyyy-mm-dd')
|
En partie | TO_DATE
|
La fonction TO_DATE de Cloud SQL pour PostgreSQL offre une fonctionnalité semblable à celle d'Oracle. Cloud SQL pour PostgreSQL accepte une liste de chaînes de mise en forme légèrement différente :TO_DATE('2019/01/01', 'yyyy-mm-dd')
|
TO_NUMBER
|
Convertit l'expression en une valeur d'un type de données NUMBER :
TO_NUMBER('01234')
|
En partie | TO_NUMBER
|
La fonction TO_NUMBER de Cloud SQL pour PostgreSQL requiert une chaîne de mise en forme en tant qu'entrée, bien qu'elle soit facultative dans Oracle :TO_NUMBER('01234','99999')
Vous pouvez également utiliser la fonction CAST pour les conversions
ne nécessitant pas de chaînes de mise en forme complexes :CAST('01234' AS NUMERIC)
|
Fonctions SELECT conditionnelles
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
CASE
|
L'instruction CASE choisit parmi une séquence de conditions et exécuteune instruction correspondante avec la syntaxe suivante : CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
Yes | CASE
|
Équivalent dans Oracle :CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
Fonctions nulles
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
COALESCE
|
Renvoie la première expression non nulle de la liste d'expressions :COALESCE(null, '1', 'a')
|
Yes | COALESCE
|
Équivalent dans Oracle :COALESCE(null, '1', 'a')
|
NULLIF
|
Compare expr1 et expr2. Si les expression sont égales, la fonction renvoie la valeur "null". Si elles ne sont pas égales, la fonction renvoie expr1 :NULLIF('1', '2')
|
Yes | NULLIF
|
Équivalent dans Oracle :NULLIF('1', '2')
|
NVL
|
Remplace la valeur "null" (renvoyée sous forme de valeur vide) par une chaîne dans les résultats d'une requête :
NVL(null, 'a')
|
Non | COALESCE
|
Vous pouvez également utiliser la fonction COALESCE :COALESCE(null, 'a')
|
NVL2
|
Détermine la valeur renvoyée par une requête selon qu'une expression spécifiée est nulle ou non nulle. |
Non | COALESCE
|
Vous pouvez également utiliser la fonction COALESCE :COALESCE(null, 1, 'a')
|
Fonctions d'environnement et d'identification
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
SYS_GUID
|
Génère et renvoie un identifiant global unique (valeur RAW) composé de 16 octets : SELECT SYS_GUID() FROM DUAL
|
En partie, avec un nom et un format de fonction différents | UUID_GENERATE_V4
|
CloudSQL pour Cloud SQL pour PostgreSQL est compatible avecExtension de uuid-ossp qui fournit une liste de fonctions de génération d'UUID telles que UUID_GENERATE_V4 :SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2 |
UID
|
Renvoie un entier qui identifie de manière unique l'utilisateur de la session (l'utilisateur qui s'est connecté) : SELECT UID FROM DUAL
|
Non | N/A | Non disponible |
USER
|
Renvoie le nom de l'utilisateur de la session actuelle :SELECT USER FROM DUAL
|
Yes | USER
|
Équivalent dans Oracle :SELECT USER;
|
USERENV
|
Renvoie des informations sur la session utilisateur actuelle avec la configuration de paramètre actuelle :SELECT USERENV('LANGUAGE') FROM DUAL
|
Non | ND | Bien qu'il n'existe pas de fonction USERENV équivalente dans Cloud SQL pour PostgreSQL, des paramètres individuels tels que USERENV('SID') peuvent être récupérés à l'aide des fonctions d'informations système telles que PG_BACKGROUND_PID() . |
ROWID
|
Le serveur Oracle attribue à chaque ligne de chaque table un ROWID unique pour identifier la ligne dans la table. ROWID est l'adresse de la ligne contenant le numéro de l'objet de données, le bloc de données de la ligne, la position de la ligne et le fichier de données. |
En partie avec un nom de fonction différent | ctid
|
Dans Cloud SQL pour PostgreSQL, ctid identifie l'emplacement physique de la version de ligne dans sa table, de manière similaire à la méthode ROWID d'Oracle. |
ROWNUM
|
Renvoie un nombre représentant l'ordre dans lequel une ligne est sélectionnée par Oracle dans une table ou des tables jointes. | Non | LIMIT or ROW_NUMBER()
|
Au lieu de limiter le nombre de résultats renvoyés par les requêtes à l'aide de ROWNUM , Cloud SQL pour PostgreSQL est compatible avec LIMIT et OFFSET à des fins similaires.La fonction de fenêtrage ROW_NUMBER() permet de remplacer l'élément ROWNUM d'Oracle pour les autres scénarios. Toutefois, l'ordre des résultats et les deltas de performances doivent être pris en compte avant de l'utiliser en tant que remplacement. |
Fonctions d'agrégation (groupe)
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
AVG
|
Renvoie la valeur moyenne dans la colonne ou l'expression. | Oui | AVG
|
Équivalent à Oracle |
COUNT
|
Renvoie le nombre de lignes renvoyées par une requête. | Oui | COUNT
|
Équivalent à Oracle |
COUNT
(DISTINCT)
|
Renvoie le nombre de valeurs uniques dans la colonne ou l'expression. | Oui | COUNT
|
Équivalent à Oracle |
MAX
|
Renvoie la valeur maximale dans la colonne ou l'expression. | Oui | MAX
|
Équivalent à Oracle |
MIN
|
Renvoie la valeur minimale dans la colonne ou l'expression. | Oui | MIN
|
Équivalent à Oracle |
SUM
|
Renvoie la somme des valeurs dans la colonne ou l'expression. | Oui | SUM
|
Équivalent à Oracle |
LISTAGG
|
Affiche les données de chaque groupe sur une seule ligne spécifiée dans la clause ORDER BY en concaténant les valeurs de la colonne de mesure :SELECT LISTAGG(
|
Non | STRING_AGG
|
Utilisez la fonction Cloud SQL pour PostgreSQL STRING_AGG pour renvoyer des résultats semblables à ceux d'Oracle, mais attendez-vous des différences de syntaxe dans certains cas :SELECT STRING_AGG(DEPARTMENT_NAME, ', ' order by DEPARTMENT_NAME) FROM DEPARTMENTS;
|
Oracle 12c Fetch
Fonction Oracle | Spécification ou mise en œuvre de la fonction Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction correspondante dans Cloud SQL pour PostgreSQL | Mise en œuvre ou spécification de fonction Cloud SQL pour PostgreSQL |
---|---|---|---|---|
FETCH
|
Récupère les lignes de données de l'ensemble de résultats d'une requête sur plusieurs lignes : SELECT * FROM
|
Non | LIMIT | Utilisez la clause Cloud SQL pour PostgreSQL LIMIT pour ne récupérer qu'un ensemble spécifique d'enregistrements :SELECT * FROM
EMPLOYEES
LIMIT 10;
|
Filtrage de base, opérateurs et sous-requêtes
Lors de la conversion, le filtrage de base, les fonctions d'opérateur et les sous-requêtes sont relativement simples à effectuer et ne nécessitent presque aucun effort.
Notes de conversion
Vérifiez et gérez les formats de date car les différents formats d'Oracle et Cloud SQL pour PostgreSQL renvoient des résultats par défaut différents :
- La fonction
SYSDATE
Oracle renvoie par défaut01-AUG-19
. - La fonction
CURRENT_DATE
par défaut de PostgreSQL renvoie2019-08-01
(sans heure de la journée, même avec mise en forme). Pour récupérer la date et l'heure actuelles, utilisez la fonctionCURRENT_TIMESTAMP
qui renvoie par défaut la valeur 2019-08-01 00:00:00.000000+00. - Les formats de date et d'heure peuvent être définis à l'aide des fonctions Cloud SQL pour PostgreSQL
TO_CHAR
.
Fonction ou sous-requête Oracle | Équivalent Cloud SQL pour PostgreSQL | Fonction ou sous-requête correspondante dans Cloud SQL pour PostgreSQL | Spécification ou mise en œuvre de la fonction Cloud SQL pour PostgreSQL |
---|---|---|---|
EXISTS/
NOT EXISTS
|
Oui | EXISTS/
NOT EXISTS
|
SELECT * FROM DEPARTMENTS D
|
IN/NOT IN
|
Oui | IN/NOT IN
|
SELECT * FROM DEPARTMENTS D
|
LIKE/NOT LIKE
|
Oui | LIKE/NOT LIKE
|
SELECT * FROM EMPLOYEES
|
BETWEEN/
NOT BETWEEN
|
Oui | BETWEEN/
|
SELECT * FROM EMPLOYEES
|
AND/OR
|
Oui | AND/OR
|
SELECT * FROM EMPLOYEES
|
SubQuery
|
Yes | SubQuery
|
Cloud SQL pour PostgreSQL est compatible avec les sous-requêtes au niveau SELECT pour les instructions JOIN et pour le filtrage dans les clauses WHERE/AND :-- SELECT SubQuery
|
Opérateurs | Oui | Opérateurs | Cloud SQL pour PostgreSQL est compatible avec tous les opérateurs de base :> | >= | < | <= | = | <> | !=
|
Fonctions d'analyse (ou fonctions de fenêtre et de classement)
Les fonctions analytiques d'Oracle étendent les fonctionnalités des opérations SQL standard en permettant de calculer des valeurs agrégées sur un groupe de lignes (par exemple RANK()
, ROW_NUMBER()
, FIRST_VALUE()
). Ces fonctions sont appliquées aux enregistrements partitionnées de manière logique dans le cadre d'une seule expression de requête.
Elles sont généralement utilisées pour l'entreposage de données, conjointement aux rapports d'analyse et à l'analytique en général.
Notes de conversion
Cloud SQL pour PostgreSQL intègre de nombreuses fonctions analytiques, appelées fonctions d'agrégation et fonctions de fenêtrage. Si votre application utilise une fonction moins courante qui n'est pas acceptée dans Postgres, vous devez rechercher une extension compatible ou déplacer la logique vers la couche d'application.
Le tableau suivant répertorie les fonctions analytiques les plus courantes d'Oracle.
Famille de fonctions | Fonctions associées | Compatible avec Cloud SQL pour PostgreSQL |
---|---|---|
Analyse et classement | RANK
|
Oui (sauf AVERAGE_RANK ) |
Hiérarchique | CONNECT BY
|
Non |
Lag | LAG
|
Oui (LAG et LEAD uniquement) |
Expression de table commune (CTE)
Les CTE permettent de mettre en œuvre la logique du code séquentiel afin de réutiliser du code SQL pouvant être trop complexe ou peu efficace pour une utilisation polyvalente. Les CTE peuvent être nommées, puis utilisées plusieurs fois dans différentes parties d'une instruction SQL à l'aide de la clause WITH
. Les CTE sont compatibles avec Oracle et Cloud SQL pour PostgreSQL.
Exemples
Oracle et Cloud SQL pour PostgreSQL | |
---|---|
WITH DEPT_COUNT
|
Instruction MERGE
L'instruction MERGE
(ou UPSERT
) permet de spécifier des instructions SQL uniques permettant d'effectuer des opérations LMD de manière conditionnelle dans une opération MERGE
, au lieu d'une seule opération LMD exécutée séparément. Elle sélectionne les enregistrements de la table source, puis, en spécifiant une structure logique, effectue automatiquement plusieurs opérations LMD sur la table cible. Cette fonctionnalité vous permet d'éviter l'utilisation de plusieurs insertions, mises à jour ou suppressions. Notez que MERGE
est une instruction déterministe, ce qui signifie qu'une fois qu'une ligne a été traitée par l'instruction MERGE
, elle ne peut plus être traitée à l'aide de la même instruction MERGE
.
Notes de conversion
Contrairement à Oracle, Cloud SQL pour PostgreSQL n'est pas compatible avec la fonctionnalité MERGE
. Pour simuler partiellement la fonctionnalité MERGE
, Cloud SQL pour PostgreSQL fournit les instructions INSERT ... ON CONFLICT DO UPDATE
:
INSERT… ON CONFLICT DO UPDATE
: Si une ligne insérée entraîne une erreur de violation unique ou une erreur de violation de contrainte d'exclusion, l'action alternative spécifiée dans la clauseON CONFLICT DO UPDATE
est appliquée, par exemple :
INSERT INTO tbl (a,b,c) VALUES (1,2,3)
ON CONFLICT (a) DO UPDATE SET b = 2, c = 3;
Une autre solution consiste à convertir la fonctionnalité MERGE
en procédure stockée pour gérer les opérations LMD à l'aide des commandes INSERT
, UPDATE
et DELETE
avec gestion des exceptions et des doublons.
Suggestions pour les instructions SQL
Oracle fournit une vaste collection d'indicateurs de requête SQL permettant aux utilisateurs d'influencer le comportement de l'optimiseur dans le but de produire des plans d'exécution des requêtes plus efficaces. Cloud SQL pour PostgreSQL n'offre pas de mécanisme comparable basé sur un niveau d'instruction SQL pour influencer l'optimiseur.
Pour influencer les plans de requête choisis par le planificateur de requêtes, Cloud SQL pour PostgreSQL fournit un ensemble de paramètres de configuration qui peuvent être appliqués au niveau de la session. Les effets de ces paramètres de configuration incluent l'activation ou la désactivation d'une certaine méthode d'accès ainsi que l'ajustement des constantes de coût du planificateur. Par exemple, l'instruction suivante désactive l'utilisation par le planificateur de requêtes des types de plans d'analyse séquentiels tels que les analyses complètes de table :
SET ENABLE_SEQSCAN=FALSE;
Pour ajuster l'estimation du coût de récupération d'une page de disque aléatoire (4.0 par défaut), utilisez l'instruction suivante :
SET RANDOM_PAGE_COST=2.0;
Lorsque vous réduisez cette valeur, Cloud SQL pour PostgreSQL favorise les analyses d'index. Le fait d'augmenter cette valeur produit l'effet inverse.
Notes de conversion
Du fait des différences fondamentales entre les optimiseurs Oracle et Cloud SQL pour PostgreSQL et dans la mesure où Cloud SQL pour PostgreSQL n'est pas compatible avec les suggestions de requête SQL de type Oracle, nous vous recommandons de supprimer toutes les suggestions de requête lors de votre migration vers Cloud SQL pour PostgreSQL. Effectuez ensuite des tests de performances rigoureux avec les outils Cloud SQL pour PostgreSQL, examinez vos requêtes à l'aide des plans d'exécution et ajustez les paramètres de l'instance ou de la session en fonction du cas d'utilisation.
Plans d'exécution
L'objectif principal des plans d'exécution est de fournir un aperçu des choix effectués par l'optimiseur de requête pour accéder aux données de la base de données. L'optimiseur de requête génère des plans d'exécution pour les instructions SELECT
, INSERT
, UPDATE
et DELETE
pour les utilisateurs de base de données, ce qui offre aux administrateurs une visibilité accrue sur des requêtes et des opérations LMD spécifiques. Ils sont particulièrement utiles lorsque vous devez ajuster les performances des requêtes, par exemple pour déterminer les performances d'index ou pour déterminer si des index manquants doivent être créés.
Les plans d'exécution peuvent être affectés par les volumes de données, les statistiques de données et les paramètres d'instance (paramètres globaux ou de session).
Remarques sur les conversions
Les plans d'exécution ne sont pas des objets de base de données à migrer. Au lieu de cela, ils constituent un outil permettant d'analyser les différences de performances entre Oracle et Cloud SQL pour PostgreSQL en exécutant une même instruction sur des ensembles de données identiques.
Cloud SQL pour PostgreSQL ne prend pas en charge les mêmes syntaxes, fonctionnalités ou sorties de plan d'exécution qu'Oracle.
Voici un exemple de plan d'exécution :
Plan d'exécution Oracle | Plan d'exécution de Cloud SQL pour PostgreSQL |
---|---|
SQL> EXPLAIN PLAN FOR
|
postgres=> EXPLAIN SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105;
QUERY PLAN
--------------------------------------------------------------------------------
Index Scan using emp_emp_id_pk on employees (cost=0.14..8.16 rows=1 width=71)
Index Cond: (employee_id = '105'::numeric)
(2 rows)
|
Procédures stockées, fonctions et déclencheurs
PL/SQL est le langage procédural étendu d'Oracle permettant de créer, de stocker et d'appliquer des solutions basées sur du code directement dans la base de données. En général, les procédures et fonctions de base de données sont des éléments de code composés d'ANSI SQL et de langage procédural étendu SQL (par exemple, PL/SQL pour Oracle ou le langage procédural MySQL pour MySQL). PL/pgSQL désigne le langage procédural étendu de PostgreSQL.
Le but de ces procédures et fonctions stockées est de fournir des solutions pour des exigences plus adaptées à l'exécution depuis la base de données et non depuis l'application (par exemple, performances, compatibilité et sécurité). Bien que les procédures stockées et les fonctions utilisent toutes deux PL/SQL, les procédures stockées sont principalement utilisées pour effectuer des opérations LDD/LMD, alors que les fonctions sont principalement utilisées pour effectuer des calculs afin de renvoyer des résultats spécifiques.
PL/SQL vers PL/pgSQL
Du point de vue de la migration d'Oracle PL/SQL vers Cloud SQL pour PostgreSQL, PL/pgSQL est semblable au PL/SQL d'Oracle en termes de structure et de syntaxe. Cependant, quelques différences majeures nécessitent une migration de code. Par exemple, les types de données différents entre Oracle et Cloud SQL pour PostgreSQL nécessitent souvent une traduction pour s'assurer que le code migré utilise les noms de type de données correspondants compatibles avec Cloud SQL pour PostgreSQL. Pour en savoir plus sur les différences entre les deux langages, consultez la section Portage depuis Oracle PL/SQL.
Droits et sécurité des objets de code
Dans Oracle, pour créer une procédure ou une fonction stockée, l'utilisateur doit disposer du droit système CREATE PROCEDURE
(pour créer des procédures ou des fonctions pour des utilisateurs différents, les utilisateurs de la base de données doivent disposer du droit CREATE
ANY PROCEDURE
). Pour exécuter une procédure ou une fonction stockée, les utilisateurs de la base de données doivent disposer du droit EXECUTE
.
Dans PostgreSQL, pour créer une procédure de code ou une fonction, l'utilisateur doit disposer du privilège USAGE
. Pour exécuter une procédure ou une fonction, l'utilisateur doit disposer du privilège EXECUTE
sur la procédure ou la fonction.
Par défaut, une procédure ou une fonction PL/pgSQL est définie comme SECURITY INVOKER
, ce qui signifie que la procédure ou la fonction doit être exécutée avec les privilèges de l'utilisateur qui l'appelle. Vous pouvez également spécifier SECURITY DEFINER
pour que la fonction soit exécutée avec les privilèges de l'utilisateur qui en est le propriétaire.
Syntaxe de procédure ou de fonction stockée dans Cloud SQL pour PostgreSQL
L'exemple suivant montre la syntaxe de procédure ou de fonction stockée dans Cloud SQL pour PostgreSQL :
CREATE [ OR REPLACE ] PROCEDURE name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) { LANGUAGE lang_name | TRANSFORM { FOR TYPE type_name } [, ... ] | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | SET configuration_parameter { TO value | = value | FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ... CREATE [ OR REPLACE ] FUNCTION name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) [ RETURNS rettype | RETURNS TABLE ( column_name column_type [, ...] ) ] { LANGUAGE lang_name | TRANSFORM { FOR TYPE type_name } [, ... ] | WINDOW | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | PARALLEL { UNSAFE | RESTRICTED | SAFE } | COST execution_cost | ROWS result_rows | SUPPORT support_function | SET configuration_parameter { TO value | = value | FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ...
Déclencheurs
Un déclencheur est une procédure stockée qui se déclenche lorsqu'un événement spécifique se produit. Dans Oracle, l'événement déclencheur est associé à une table, à une vue, à un schéma ou à la base de données. Les types d'événements déclencheurs sont les suivants :
- Instructions LMD (langage de manipulation de données) (par exemple,
INSERT
,UPDATE
,DELETE
) - Instructions LDD (langage de définition de données) (par exemple,
CREATE
,ALTER
,DROP
) - Événements de base de données (par exemple,
LOGON
,STARTUP
,SHUTDOWN
)
Les déclencheurs d'Oracle peuvent être des types suivants :
- Déclencheur simple : se déclenche exactement une seule fois, avant ou après l'événement déclencheur spécifié
- Déclencheur composé : se déclenche en réponse plusieurs événements
- Déclencheur
INSTEAD OF
: type spécial de déclencheur LMD qui fournit un mécanisme de mise à jour transparent pour les vues complexes et non modifiables - Déclencheur système : se déclenche en réponse à des événements de base de données spécifiques
Dans Cloud SQL pour PostgreSQL, un déclencheur s'active avant ou après une opération LMD sur une table, une vue ou une table étrangère spécifique. Le déclencheur INSTEAD OF
est compatible et constitue un mécanisme de mise à jour des vues. Un déclencheur qui s'active en réponse à des opérations LDD est appelé un déclencheur d'événement.
Cloud SQL pour PostgreSQL n'est pas compatible avec les déclencheurs système d'Oracle basés sur des événements de base de données.
Contrairement aux déclencheurs Oracle, les déclencheurs Cloud SQL pour PostgreSQL ne sont pas compatibles avec l'utilisation d'un bloc PL/pgSQL anonyme comme corps de déclencheur. Une fonction nommée qui utilise zéro arguments ou plus et renvoie un déclencheur de type doit être fournie dans la déclaration de déclencheur. Cette fonction est exécutée lorsque le déclencheur est activé.
Syntaxe du déclencheur Cloud SQL pour PostgreSQL et du déclencheur d'événements
L'exemple suivant illustre la syntaxe du déclencheur Cloud SQL pour PostgreSQL et du déclencheur d'événement :
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name [ FROM referenced_table_name ] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ] [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ] [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )
event
peut être une valeur parmi : INSERT
, UPDATE [ OF column_name [, ... ] ]
, DELETE
, TRUNCATE
CREATE EVENT TRIGGER name ON event [ WHEN filter_value IN (filter_value [, ... ]) [ AND ... ] ] EXECUTE { FUNCTION | PROCEDURE } function_name()
event
peut être une valeur parmi : ddl_command_start
,
ddl_command_end
, table_rewrite
, sql_drop
filter_value
ne peut être qu'une valeur : TAG
filter_value
peut être l'un des tags de commande compatibles.
Étape suivante
- En savoir plus sur les comptes utilisateur Cloud SQL for PostgreSQL.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.