Este documento es parte de una serie que proporciona información clave y orientación relacionada con la planificación y realización de migraciones de bases de datos de Oracle® 11g/12c a Cloud SQL para PostgreSQL versión 12. Además de la sección de configuración de introducción, la serie incluye las siguientes partes:
- Migra usuarios de Oracle a Cloud SQL para PostgreSQL: terminología y funcionalidad.
- Migra usuarios de Oracle a Cloud SQL para PostgreSQL: tipos de datos, usuarios y tablas.
- Migra usuarios de Oracle a Cloud SQL para PostgreSQL: consultas, procedimientos almacenados, funciones y activadores (este documento).
- Migra usuarios de Oracle a Cloud SQL para PostgreSQL: seguridad, operaciones, supervisión y registro.
- Migra usuarios y esquemas de base de datos de Oracle a Cloud SQL para PostgreSQL.
Consultas
Oracle y Cloud SQL para PostgreSQL admiten la norma ANSI SQL. En general, es sencillo migrar sentencias de SQL usando solamente elementos de sintaxis básicos (por ejemplo, sin especificar ninguna función escalar o cualquier otra característica extendida de Oracle). En la siguiente sección, se analizan los elementos de consulta comunes de Oracle y sus equivalentes de Cloud SQL para PostgreSQL.
Sintaxis básica de SELECT y FROM
| Nombre de sintaxis o nombre de la característica de Oracle | Implementación o descripción general de Oracle | Compatibilidad con Cloud SQL para PostgreSQL | Solución correspondiente o alternativa para Cloud SQL para PostgreSQL |
|---|---|---|---|
| Sintaxis básica de SQL para la recuperación de datos | SELECT
|
Sí | SELECT
|
SELECT para impresión de salida |
SELECT 1 FROM DUAL
|
Sí | SELECT 1
|
| Alias de columna | SELECT COL1 AS C1
|
Sí | SELECT COL1 AS C1
|
| Distinción entre mayúsculas y minúsculas del nombre de la tabla | Sin distinción entre mayúsculas y minúsculas (por ejemplo, el nombre de la tabla puede ser orders o bien ORDERS). |
Sí | Los nombres no distinguen mayúsculas de minúsculas, a menos que se escriban entre comillas (por ejemplo,
orders y
ORDERS se tratan de la misma manera, mientras que
"orders" y
"ORDERS" se tratan de manera diferente). |
Si deseas obtener más detalles sobre la sintaxis de SELECT de Cloud SQL para PostgreSQL, consulta la
documentación.
Vistas en línea
- Las vistas en línea (también conocidas como tablas derivadas) son declaraciones
SELECT, que se ubican en la cláusulaFROMy se usan como subconsultas. - Las vistas en línea pueden ayudar a simplificar las consultas complejas, ya que quitan los cálculos compuestos, o eliminan las operaciones de unión, a la vez que condensan varias consultas separadas en una sola consulta simplificada.
- Nota de conversión: Las vistas en línea de Oracle no requieren el uso de alias, mientras que Cloud SQL para PostgreSQL requiere alias específicos para cada vista en línea.
En la siguiente tabla, se presenta un ejemplo de conversión de Oracle a Cloud SQL para PostgreSQL como una vista en línea.
| Oracle 11g/12c | Cloud SQL para PostgreSQL 12 |
|---|---|
SQL> SELECT FIRST_NAME,
El resultado es similar a lo siguiente:
FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
|
Sin alias para la vista en línea: postgres=> SELECT FIRST_NAME,
Agregar un alias a la vista en línea: postgres=> SELECT FIRST_NAME,
El resultado es similar a lo siguiente:
first_name | department_id | salary | date_col
|
Instrucciones JOIN
Las sentencias JOIN de Oracle son compatibles con las sentencias
JOIN de Cloud SQL para PostgreSQL. Sin embargo, Cloud SQL para PostgreSQL no admite
el uso del operador de unión (+) de Oracle. A fin de lograr el mismo resultado, deberás
convertir a la sintaxis de SQL estándar para las uniones externas.
En la siguiente tabla, se presenta un ejemplo de conversión JOIN.
| Tipo de JOIN de Oracle | Compatible con Cloud SQL para PostgreSQL | Sintaxis de JOIN de Cloud SQL para PostgreSQL |
|---|---|---|
INNER JOIN
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
CROSS JOIN
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
FULL JOIN
[ OUTER ]
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
LEFT JOIN [ OUTER ]
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
RIGHT JOIN
[ OUTER ]
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
SUBQUERY
|
Sí | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
UNION, UNION ALL, INTERSECT y MINUS
Cloud SQL para PostgreSQL es compatible con los operadores UNION, UNION ALL y
INTERSECT de Oracle. No se admite el operador MINUS. Sin embargo,
Cloud SQL para PostgreSQL implementa el operador EXCEPT, que es
equivalente al operador MINUS en Oracle. Además,
Cloud SQL para PostgreSQL admite los operadores INTERSECT ALL y EXCEPT ALL,
que no son compatibles con Oracle.
UNION: Adjunta los conjuntos de resultados de dos o más sentenciasSELECTy elimina los registros duplicados.UNION ALL: Adjunta los conjuntos de resultados de dos o más sentenciasSELECTsin eliminar los registros duplicados.INTERSECT: Muestra la intersección de dos o más sentenciasSELECTsolo si existe un registro en ambos conjuntos de datos. Los registros duplicados no se borran.INTERSECT ALL(solo Cloud SQL para PostgreSQL): Muestra la intersección de dos o más sentenciasSELECTsolo si existe un registro en ambos conjuntos de datos.MINUS (EXCEPT(en Cloud SQL para PostgreSQL): Compara dos o más sentenciasSELECTy devuelve solo filas distintas de la primera consulta que no muestran las otras sentencias.EXCEPT ALL(solo Cloud SQL para PostgreSQL): Compara dos o más sentenciasSELECTy muestra solo filas de la primera consulta que no son devueltas por las otras sentencias sin eliminar los registros duplicados.
Notas de la conversión
Cuando conviertas los operadores MINUS de Oracle a
Cloud SQL para PostgreSQL, usa operadores EXCEPT.
Ejemplos
| Función de Oracle | Implementación de Oracle | Compatibilidad con Cloud SQL para PostgreSQL | Solución correspondiente o alternativa para Cloud SQL para PostgreSQL |
|---|---|---|---|
UNION
|
SELECT COL1 FROM TBL1
|
Sí | SELECT COL1 FROM TBL1
|
UNION ALL
|
SELECT COL1 FROM TBL1
|
Sí | SELECT COL1 FROM TBL1
|
INTERSECT
|
SELECT COL1 FROM TBL1
|
Sí | SELECT COL1 FROM TBL1
|
MINUS
|
SELECT COL1 FROM TBL1
|
Sí (Convert MINUS a EXCEPT en PostgreSQL) |
SELECT COL1 FROM TBL1
|
Funciones escalares (de una sola fila) y de grupos
Cloud SQL para PostgreSQL proporciona una lista extensa de funciones escalares (de una sola fila) y de agregación. Algunas de las funciones de Cloud SQL para PostgreSQL son similares a sus equivalentes de Oracle (por nombre y funcionalidad, o tienen un nombre diferente, pero con una funcionalidad similar). Aunque las funciones de Cloud SQL para PostgreSQL pueden tener nombres idénticos a sus contrapartes de Oracle, a veces tienen una funcionalidad diferente.
En las siguientes tablas, se describe en qué casos son equivalentes Oracle y Cloud SQL para PostgreSQL en cuanto a nombre y funcionalidad (especificado con "Sí") y en qué casos se recomienda una conversión (todos los casos distintos de "Sí").
Funciones de caracteres
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
CONCAT
|
Devuelve str1 concatenado con str2: CONCAT('A', 1) = A1
|
Sí | CONCAT
|
Equivalente a Oracle:CONCAT('A', 1) = A1
|
LOWER/UPPER
|
Devuelve char, con todas las letras en minúscula o mayúscula:LOWER('SQL') = sql
|
Sí | LOWER/UPPER
|
Equivalente a Oracle:LOWER('SQL') = sql
|
LPAD/RPAD
|
Devuelve expr1, con relleno a la izquierda o a la derecha con n
caracteres con la secuencia de caracteres en expr2:LPAD('A',3,'*') = **A
|
Sí | LPAD/RPAD
|
Equivalente a Oracle:LPAD('A',3,'*') = **A
|
SUBSTR
|
Devuelve una parte de char; comienza en la posición del carácter,
y tiene la longitud
de la subcadena : SUBSTR('PostgreSQL', 8, 3)
|
Parcialmente | SUBSTR
|
Equivalente a Oracle cuando la posición inicial es un número positivo.SUBSTR('PostgreSQL', 8, 3)
Cuando se proporciona un número negativo como una posición inicial en Oracle, se realiza una operación de subcadena desde el final de la cadena, lo cual es diferente en Cloud SQL para PostgreSQL. Usa la función RIGHT
como reemplazo si el comportamiento de Oracle es el deseado. |
INSTR
|
Devuelve la posición (índice) de una cadena a partir de una cadena determinada:INSTR('PostgreSQL', 'e')
|
No | N/A | Cloud SQL para PostgreSQL no tiene una función instr
incorporada. Una función instr compatible con Oracle podría implementarse
con PL/pgSQL. |
REPLACE
|
Devuelve char con cada caso de una cadena de búsqueda sustituida por una cadena de reemplazo: REPLACE('ORADB', 'ORA', 'PostgreSQL')
|
Parcialmente | REPLACE
|
El parámetro de cadena de reemplazo es opcional en Oracle,
pero es obligatorio en Cloud SQL para PostgreSQL. Cuando se omite el parámetro,
Oracle quita todos los casos de las cadenas de búsqueda. El mismo comportamiento
se puede lograr en Cloud SQL para PostgreSQL si se proporciona una cadena vacía como la
cadena de reemplazo.REPLACE('ORADB', 'ORA', 'PostgreSQL')
|
TRIM
|
Recorta los caracteres iniciales o finales (o ambos) de una cadena:TRIM(both '-' FROM '-PostgreSQL-')
|
Sí | TRIM
|
Equivalente a Oracle:TRIM(both '-' FROM '-PostgreSQL-')
|
LTRIM/RTRIM
|
Quita del extremo izquierdo o derecho de la cadena todos los caracteres que aparecen en la búsqueda: LTRIM(' PostgreSQL', ' ')
|
Sí | LTRIM/RTRIM
|
Equivalente a Oracle:LTRIM(' PostgreSQL', ' ')
= PostgreSQL
|
ASCII
|
Devuelve la representación decimal en el grupo de caracteres de la base de datos del
primer carácter de char: ASCII('A') = 65
|
Sí | ASCII
|
Equivalente a Oracle:ASCII('A') = 65
|
CHR
|
Devuelve el valor del código ASCII, que es un valor numérico entre 0 y 225,
correspondiente a un carácter:CHR(65) = A
|
Sí | CHAR
|
Equivalente a Oracle:CHR(65) = A
|
LENGTH
|
Devuelve la longitud de una cadena determinada:LENGTH ('PostgreSQL') = 10
|
Sí | LENGTH
|
Equivalente a Oracle:LENGTH ('PostgreSQL') = 10
|
REGEXP_REPLACE
|
Busca un patrón de expresión regular en una cadena:REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
Sí | REGEXP_REPLACE
|
Equivalente a Oracle:REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
REGEXP_SUBSTR
|
Extiende el comportamiento de la función SUBSTR buscando un
patrón de expresión regular en una cadena : REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?')
|
No | N/A | Usa REGEXP_MATCH de PostgreSQL para lograr funciones
similares. |
REGEXP_COUNT
|
Muestra la cantidad de veces que se produce un patrón en una cadena de origen. | No | N/A | Usa REGEXP_MATCH de PostgreSQL para lograr funciones
similares. |
REGEXP_INSTR
|
Busca una posición de cadena (índice) para un patrón de expresión regular. |
No | N/A | Convierte la funcionalidad en la capa de aplicación. |
REVERSE
|
Devuelve una cadena invertida.REVERSE('PostgreSQL') = LQSergtsoP
|
Sí | REVERSE
|
Equivalente a Oracle:REVERSE('PostgreSQL') = LQSergtsoP
|
Funciones numéricas
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
ABS
|
Valor absoluto de n:ABS(-4.6) = 4.6
|
Sí | ABS
|
Equivalente a Oracle:ABS(-4.6) = 4.6
|
CEIL
|
Devuelve el número entero más pequeño mayor o igual que n:CEIL(21.4) = 22
|
Sí | CEIL
|
Equivalente a Oracle:CEIL(21.4) = 22
|
FLOOR
|
Devuelve el número entero más grande igual o menor que n: FLOOR(-23.7) = -24
|
Sí | FLOOR
|
Equivalente a Oracle:FLOOR(-23.7) = -24
|
MOD
|
Devuelve el resto de m dividido por n:MOD(10, 3) = 1
|
Sí | MOD
|
Equivalente a Oracle:MOD(10, 3) = 1
|
ROUND
|
Devuelve n redondeado a números enteros a la derecha del punto decimal:ROUND(1.39, 1) = 1.4
|
Sí | ROUND
|
Equivalente a Oracle:ROUND(1.39, 1) = 1.4
|
TRUNC (cantidad) |
Devuelve n1 truncado en lugares decimales n2:TRUNC(99.999) = 99
|
Sí | TRUNCATE
(cantidad) |
Equivalente a Oracle:TRUNC(99.999) = 99
|
Funciones de fecha y hora
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
SYSDATE
|
Devuelve la fecha y hora actuales establecidas para el sistema operativo en el que
reside el servidor de la base de datos:SELECT SYSDATE FROM DUAL
|
De forma parcial, con un nombre de función y un formato diferentes | CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP devolverá un formato de fecha y hora diferente
al de la función SYSDATE de Oracle:SELECT CURRENT_TIMESTAMP
|
SYSTIMESTAMP
|
Devuelve la fecha del sistema, incluidos los segundos y la zona horaria:SELECT SYSTIMESTAMP FROM DUAL
|
De forma parcial, con un nombre de función diferente | CURRENT_TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente del de
Oracle. El formato de fecha debe coincidir con los formatos de fecha y hora
originales:SELECT CURRENT_TIMESTAMP
|
LOCAL TIMESTAMP
|
Devuelve la fecha y hora actuales en la zona horaria de la sesión en un valor de
tipo de datos TIMESTAMP:SELECT LOCALTIMESTAMP
FROM DUAL
|
De forma parcial con un formato de fecha y hora diferente | LOCAL
TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente del de
Oracle. El formato de fecha debe coincidir con el formato de fecha y hora
original:SELECT LOCALTIMESTAMP
|
CURRENT_DATE
|
Devuelve la fecha actual en la zona horaria de la sesión:SELECT CURRENT_DATE FROM DUAL
|
De forma parcial con un formato de fecha y hora diferente | CURRENT_
DATE
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente del de Oracle. El formato de fecha
debe coincidir con el formato de fecha y hora original:SELECT CURRENT_DATE
|
CURRENT_TIMESTAMP
|
Devuelve la fecha y hora actuales en la zona horaria de la sesión:SELECT CURRENT_TIMESTAMP FROM DUAL
|
De forma parcial con un formato de fecha y hora diferente | CURRENT_TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente del de
Oracle. El formato de fecha deberá coincidir con el formato de fecha y hora
original:SELECT CURRENT_TIMESTAMP FROM DUAL
|
ADD_MONTHS
|
Devuelve la fecha y los meses en números enteros:ADD_MONTHS(SYSDATE, 1)
|
No | N/A | Si deseas lograr la misma funcionalidad en Cloud SQL para PostgreSQL, usa los operadores
+ / - y especifica el intervalo:SELECT CURRENT_TIMESTAMP + INTERVAL '1 MONTH'
|
EXTRACT (parte de la fecha) |
Devuelve el valor de un campo de fecha/hora especificado de una expresión de fecha/hora o
intervalo: EXTRACT(YEAR FROM DATE '2019-01-31')
|
Sí | EXTRACT (parte de la fecha) |
Equivalente a Oracle:EXTRACT(YEAR FROM DATE '2019-01-31')
|
LAST_DAY
|
Devuelve la fecha del último día del mes que contiene la fecha
especificada:LAST_DAY('01-JAN-2019')
|
No | N/A | Como solución alternativa, usa DATE_TRUNC y un operador +
para calcular el último día del mes. Un formato de fecha
debe coincidir con el formato de fecha y hora original:SELECT DATE_TRUNC('MONTH', DATE '01-JAN-2019') + INTERVAL '1 MONTH -1 DAY'
|
MONTH_BETWEEN
|
Devuelve el número de meses entre las fechas date1 y date2:MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
|
Parcial con Formato diferente de fecha y hora |
AGE
|
La función AGE de Cloud SQL para PostgreSQL devuelve el
intervalo entre dos marcas de tiempo:AGE(DATE '01-JAN-2019', DATE '01-JAN-2019' - 60)
Para lograr los mismos valores que la función MONTH_BETWEEN de Oracle,
se requiere una conversión más específica. |
TO_CHAR (fecha y hora) |
Convierte un valor de fecha y hora o una marca de tiempo en
VARCHAR2un tipo de datos en el formato especificado por el formato de fecha: TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS')
|
Sí | To_CHAR
|
Equivalente a Oracle:TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
|
Funciones de codificación y decodificación
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
DECODE
|
Compara la expresión con cada valor de búsqueda, uno por uno, usando
una sentencia IF-THEN-ELSE. |
No | CASE
|
Usa la sentencia CASE de Cloud SQL para PostgreSQL a fin de lograr
una funcionalidad similar. |
DUMP
|
Devuelve un valor VARCHAR2 que contiene el código de tipo de datos, la longitud en bytes
y la representación interna de la expresión. |
No | N/A | No compatible. |
ORA_HASH
|
Calcula un valor de hash para una expresión determinada. | No | MD5 / SHA224 / SHA256 / SHA385 / SHA512
|
Usa la función MD5 de Cloud SQL para PostgreSQL para la suma de comprobación de 128 bits
o la función SHA para la suma de comprobación de 160 bitscon el objetivo de generar valores de hash. |
Funciones de conversión
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
CAST
|
Convierte un tipo de datos integrado o un valor de tipo colección en otro
tipo de datos integrado o valor de tipo colección:CAST('1' as int) + 1
|
Parcialmente | CAST
|
La función CAST de Cloud SQL para PostgreSQL es similar a
la función CAST de Oracle, pero, en algunos casos, debe
ajustarse debido a las diferencias de tipo de datos entre las dos bases de datos:CAST('1' as int) + 1
|
CONVERT
|
Convierte una cadena de caracteres de un grupo de caracteres en otro:CONVERT (
'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
|
Parcialmente | CONVERT
|
La función CONVERT de Cloud SQL para PostgreSQL devuelve un
valor bytea, que es una cadena binaria en lugar de
VARCHAR o TEXT. Los
grupos de caracteres compatibles con PostgreSQL también son diferentes de Oracle.CONVERT('Ä Ê Í Õ Ø A B C D E', 'UTF8', 'LATIN1')
|
TO_CHAR (cadena/numérica) |
La función convierte un número o una fecha en una cadena: TO_CHAR(22.73,'$99.9')
|
Parcialmente | TO_CHAR
|
La función TO_CHAR de Cloud SQL para PostgreSQL es
similar a la de Oracle. Cloud SQL para PostgreSQL es compatible con una
lista de cadenas de formato
un poco diferente. De forma predeterminada, Cloud SQL para PostgreSQL
reserva una columna para el signo, por lo que habrá un espacio antes de los números
positivos. Esto se puede suprimir con el prefijo FM:TO_CHAR(22.73,'FM$99.9')
|
TO_DATE
|
La función TO_DATE de Oracle convierte una cadena en una fecha según el
formato de fecha y hora específico de la fuente:TO_DATE('2019/01/01', 'yyyy-mm-dd')
|
Parcialmente | TO_DATE
|
La función TO_DATE de Cloud SQL para PostgreSQL es
similar a la de Oracle. Cloud SQL para PostgreSQL admite una
lista
de cadenas de formato
un poco diferente:TO_DATE('2019/01/01', 'yyyy-mm-dd')
|
TO_NUMBER
|
Convierte la expresión en un valor de un tipo de datos NUMBER:
TO_NUMBER('01234')
|
Parcialmente | TO_NUMBER
|
La función TO_NUMBER de Cloud SQL para PostgreSQL requiere una
cadena de formato como entrada, mientras que esto es opcional en Oracle:TO_NUMBER('01234','99999')
Una alternativa es usar la función CAST para las conversiones
que no necesitan cadenas de formato complejas:CAST('01234' AS NUMERIC)
|
Funciones SELECT condicionales
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
CASE
|
La sentencia CASE elige desde una secuencia de condiciones y
ejecuta unasentencia correspondiente con la siguiente sintaxis: CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
Sí | CASE
|
Equivalente a Oracle:CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
Funciones nulas
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
COALESCE
|
Devuelve la primera expresión que no es nula en la lista de expresiones: COALESCE(null, '1', 'a')
|
Sí | COALESCE
|
Equivalente a Oracle:COALESCE(null, '1', 'a')
|
NULLIF
|
Compara expr1 y expr2. Si son iguales, la función
devuelve un valor nulo. Si no son iguales, la función devuelve expr1:
NULLIF('1', '2')
|
Sí | NULLIF
|
Equivalente a Oracle:NULLIF('1', '2')
|
NVL
|
Reemplaza nulo (se devuelve como un espacio en blanco) por una cadena en los resultados de una consulta:
NVL(null, 'a')
|
No | COALESCE
|
Como alternativa, usa la función COALESCE:COALESCE(null, 'a')
|
NVL2
|
Determina el valor que devuelve una consulta en función de si una expresión especificada es nula o no. |
No | COALESCE
|
Como alternativa, usa la función COALESCE:COALESCE(null, 1, 'a')
|
Funciones de identificador y entorno
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
SYS_GUID
|
Genera y devuelve un identificador único global (valor RAW) compuesto por 16 bytes: SELECT SYS_GUID() FROM DUAL
|
De forma parcial, con un nombre de función y un formato diferentes | UUID_GENERATE_V4
|
CloudSQL para Cloud SQL para PostgreSQL es compatible con la
extensión uuid-ossp que proporciona una lista de las funciones que generan UUID, como
UUID_GENERATE_V4:SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2 |
UID
|
Devuelve un número entero que identifica de manera inequívoca al usuario de la sesión
(el usuario que accedió): SELECT UID FROM DUAL
|
No | N/A | N/A |
USER
|
Devuelve el nombre de usuario de la sesión actual:SELECT USER FROM DUAL
|
Sí | USER
|
Equivalente a Oracle:SELECT USER;
|
USERENV
|
Devuelve información sobre la sesión de usuario actual con la
configuración de parámetros actual:SELECT USERENV('LANGUAGE') FROM DUAL
|
No | N/A | Aunque no hay una función USERENV equivalente en Cloud SQL para PostgreSQL,
los parámetros individuales como
USERENV('SID') se pueden recuperar con las
funciones de información del sistema, por ejemplo,
PG_BACKGROUND_PID(). |
ROWID
|
El servidor de Oracle asigna a cada fila de cada tabla un ROWID único
para identificar la fila en la tabla. El ROWID
es la dirección de la fila que contiene el número de objeto de datos,
el bloque de datos de la fila, la posición de la fila y el archivo de datos. |
De forma parcial, con un nombre de función diferente | ctid
|
ctid en Cloud SQL para PostgreSQL identifica la ubicación física
de la versión de fila dentro de su tabla, que es similar a ROWID
de Oracle. |
ROWNUM
|
Muestra un número que representa el orden en que Oracle selecciona una fila de una tabla o tablas unidas. | No | LIMIT or ROW_NUMBER()
|
En lugar de limitar la cantidad de resultados que devuelven las consultas con ROWNUM,
Cloud SQL para PostgreSQL admite LIMIT
y OFFSET con fines similares.La función analítica de ROW_NUMBER()
podría ser un reemplazo provisional para ROWNUM de Oracle
en otras situaciones. Sin embargo, se deben tener en cuenta el orden de los resultados
y los deltas de rendimiento antes de usarla como
reemplazo. |
Funciones de agregación (grupo)
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
AVG
|
Devuelve el valor promedio de una columna o expresión. | Sí | AVG
|
Equivalente a Oracle |
COUNT
|
Muestra la cantidad de filas que muestra una consulta. | Sí | COUNT
|
Equivalente a Oracle |
COUNT
(DISTINCT)
|
Muestra el número de valores únicos en la columna o expresión. | Sí | COUNT
|
Equivalente a Oracle |
MAX
|
Devuelve el valor máximo de la columna o expresión. | Sí | MAX
|
Equivalente a Oracle |
MIN
|
Devuelve el valor mínimo de la columna o expresión. | Sí | MIN
|
Equivalente a Oracle |
SUM
|
Devuelve la suma de los valores de la columna o expresión. | Sí | SUM
|
Equivalente a Oracle |
LISTAGG
|
Muestra los datos dentro de cada grupo con una sola fila especificada en la cláusula
ORDER BY mediante la concatenación de los valores de la columna de
medición: SELECT LISTAGG(
|
No | STRING_AGG
|
Usa la función STRING_AGG de Cloud SQL para PostgreSQL para
devolver resultados similares a los de Oracle.
Verás diferencias de sintaxis en ciertos casos:SELECT STRING_AGG(DEPARTMENT_NAME, ', ' order by DEPARTMENT_NAME) FROM DEPARTMENTS;
|
Recuperación de Oracle 12c
| Función de Oracle | Implementación o especificación de la función de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|---|
FETCH
|
Recupera filas de datos del conjunto de resultados de una consulta de varias filas:SELECT * FROM
|
No | LÍMITE | Usa la cláusula LIMIT de Cloud SQL para PostgreSQL
para recuperar solo un conjunto específico de registros:SELECT * FROM
EMPLOYEES
LIMIT 10;
|
Filtrado básico, operadores y subconsultas
Durante la conversión, el filtrado básico, las funciones de operador y las subconsultas son relativamente sencillas y no requieren ningún esfuerzo adicional.
Notas de la conversión
Examina y aborda los formatos de fecha porque los formatos de Oracle y Cloud SQL para PostgreSQL devuelven diferentes resultados predeterminados:
- La función
SYSDATEde Oracle devuelve01-AUG-19de forma predeterminada. - La función
CURRENT_DATEde PostgreSQL devuelve2019-08-01de forma predeterminada (sin la hora del día, incluso con formato). Para recuperar la fecha y hora actuales, usa la funciónCURRENT_TIMESTAMP, que devuelve 2019-08-01 00:00:00.000000+00 de forma predeterminada. - Los formatos de fecha y hora se pueden configurar con las funciones
TO_CHARde Cloud SQL para PostgreSQL.
| Función o subconsulta de Oracle | Equivalente de Cloud SQL para PostgreSQL | Subconsulta o función de Cloud SQL para PostgreSQL correspondiente | Implementación o especificación de la función de Cloud SQL para PostgreSQL |
|---|---|---|---|
EXISTS/
NOT EXISTS
|
Sí | EXISTS/
NOT EXISTS
|
SELECT * FROM DEPARTMENTS D
|
IN/NOT IN
|
Sí | IN/NOT IN
|
SELECT * FROM DEPARTMENTS D
|
LIKE/NOT LIKE
|
Sí | LIKE/NOT LIKE
|
SELECT * FROM EMPLOYEES
|
BETWEEN/
NOT BETWEEN
|
Sí | BETWEEN/
|
SELECT * FROM EMPLOYEES
|
AND/OR
|
Sí | AND/OR
|
SELECT * FROM EMPLOYEES
|
SubQuery
|
Sí | SubQuery
|
Cloud SQL para PostgreSQL admite subconsultas en el nivel SELECT,
para sentencias JOIN y para filtrar en las
cláusulas WHERE/AND:-- SELECT SubQuery
|
| Operadores | Sí | Operadores | Cloud SQL para PostgreSQL es compatible con todos los operadores básicos:> | >= | < | <= | = | <> | !=
|
Funciones analíticas (o funciones de ventana y de clasificación)
Las funciones analíticas de Oracle amplían la funcionalidad de las operaciones de SQL estándar,
ya que proporcionan capacidades para calcular valores agregados en un grupo de filas
(por ejemplo, RANK(), ROW_NUMBER(), FIRST_VALUE()). Estas funciones se aplican
a registros particionados de forma lógica dentro del permiso de una sola expresión de consulta.
Por lo general, se usan en el almacenamiento de datos, junto con estadísticas y con
informes de inteligencia empresarial.
Notas de la conversión
Cloud SQL para PostgreSQL admite muchas funciones analíticas que se conocen en Postgres como funciones de agregación y funciones analíticas. Si tu aplicación usa una función menos común no compatible con Postgres, deberás buscar una extensión compatible o trasladar la lógica a la capa de aplicación.
En la siguiente tabla, se enumeran las funciones analíticas más comunes de Oracle.
| Familia de funciones | Funciones relacionadas | Compatible con Cloud SQL para PostgreSQL |
|---|---|---|
| Analíticas y de clasificación | RANK
|
Sí (excepto AVERAGE_RANK) |
| Jerárquicas | CONNECT BY
|
No |
| Lag | LAG
|
Sí (solo LAG y LEAD) |
Expresión de tabla común (CTE)
Las CTE proporcionan una forma de implementar la lógica del código secuencial a fin de reutilizar el código SQL que puede ser demasiado complejo o no eficiente para varios usos. Las CTE se pueden nombrar
y, luego, usar muchas veces en distintas partes de una sentencia de SQL con la cláusula WITH. Oracle y las CTE son compatibles con Oracle y
Cloud SQL para PostgreSQL.
Ejemplos
| Oracle y Cloud SQL para PostgreSQL | |
|---|---|
WITH DEPT_COUNT
|
Sentencia MERGE
La declaración MERGE (o UPSERT) proporciona un medio para especificar instrucciones de SQL individuales que realizan operaciones DML de forma condicional en una operación MERGE, en lugar de una sola operación DML, que se ejecuta por separado. Selecciona registros de la tabla de origen y, luego, especifica una estructura lógica a fin de realizar de forma automática varias operaciones DML en la tabla de destino. Esta función te ayuda
a evitar el uso de varias inserciones, actualizaciones o eliminaciones. Ten en cuenta que MERGE es una
sentencia determinística, lo que significa que una vez que la
sentencia MERGE procesó una fila, esta no se puede volver a procesar con la misma sentencia
MERGE.
Notas de la conversión
A diferencia de Oracle,
Cloud SQL para PostgreSQL no admite la funcionalidad de MERGE. Para simular de forma parcial la funcionalidad de MERGE, Cloud SQL para PostgreSQL proporciona
las sentencias
INSERT ... ON CONFLICT DO UPDATE:
INSERT… ON CONFLICT DO UPDATE: Si una fila insertada causará un error de incumplimiento único o de incumplimiento de la restricción de exclusión, se toma la acción alternativa especificada en la cláusulaON CONFLICT DO UPDATE. Por ejemplo:
INSERT INTO tbl (a,b,c) VALUES (1,2,3)
ON CONFLICT (a) DO UPDATE SET b = 2, c = 3;
Otra solución sería convertir la funcionalidad de MERGE en un procedimiento almacenado
para administrar las operaciones DML mediante los comandos INSERT, UPDATE y DELETE
con manejo de duplicaciones y excepciones.
Sugerencias de sentencias de SQL
Oracle proporciona una gran colección de sugerencias de consultas en SQL que permiten a los usuarios influir en el comportamiento del optimizador, con el objetivo de producir planes de ejecución de consultas más eficientes. Cloud SQL para PostgreSQL no ofrece un mecanismo de sugerencias comparable, a nivel de sentencia de SQL, que permita influir en el optimizador.
Para influir en los planes de consulta escogidos por el planificador de consultas, Cloud SQL para PostgreSQL proporciona un conjunto de parámetros de configuración que se pueden aplicar a nivel de sesión. Los efectos de estos parámetros de configuración varían desde habilitar o inhabilitar un método de acceso determinado hasta ajustar las constantes de costos del planificador. Por ejemplo, la siguiente sentencia inhabilita el uso del planificador de consultas de los tipos de plan de análisis secuencial, como los análisis de tabla completos:
SET ENABLE_SEQSCAN=FALSE;
Para ajustar la estimación de costos del planificador de una recuperación de página de disco aleatoria (el valor predeterminado es 4.0), usa la siguiente sentencia:
SET RANDOM_PAGE_COST=2.0;
Reducir este valor hace que Cloud SQL para PostgreSQL prefiera los análisis de índices. Aumentarlo hace lo contrario.
Notas de la conversión
Debido a que existen diferencias fundamentales entre los optimizadores de Oracle y Cloud SQL para PostgreSQL, y como Cloud SQL para PostgreSQL no admite sugerencias de consultas en SQL al estilo de Oracle, recomendamos que quites las sugerencias de consulta durante tu migración a Cloud SQL para PostgreSQL. Luego, realiza pruebas rigurosas del rendimiento con las herramientas de Cloud SQL para PostgreSQL, examina las consultas con planes de ejecución y ajusta la instancia o los parámetros de la sesión según el caso de uso.
Planes de ejecución
El objetivo principal de los planes de ejecución es proporcionar una mirada interna a las elecciones que realiza el optimizador de consultas para acceder a los datos de la base de datos. El optimizador de consultas
genera planes de ejecución para las sentencias SELECT, INSERT, UPDATE y DELETE
para los usuarios de la base de datos, lo que también permite que los administradores tengan
una mejor vista de las consultas y operaciones DML específicas. Son útiles en especial cuando necesitas
ajustar el rendimiento de las consultas, por ejemplo, para determinar el rendimiento del índice
o si faltan índices que deben crearse.
Los planes de ejecución pueden verse afectados por los volúmenes de datos, las estadísticas de datos y los parámetros de las instancias (parámetros globales o de sesión).
Consideraciones sobre las conversiones
Los planes de ejecución no son objetos de base de datos que se deban migrar; en cambio, son una herramienta para analizar las diferencias de rendimiento entre Oracle y Cloud SQL para PostgreSQL que ejecutan la misma sentencia en conjuntos de datos idénticos.
Cloud SQL para PostgreSQL no admite la misma sintaxis, funcionalidad o resultado del plan de ejecución que Oracle.
A continuación, se muestra un ejemplo de un plan de ejecución:
| Plan de ejecución de Oracle | Plan de ejecución de Cloud SQL para 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)
|
Procedimientos almacenados, funciones y activadores
PL/SQL es el lenguaje de procedimiento extendido de Oracle para crear, almacenar y aplicar soluciones basadas en código dentro de la base de datos. En general, las funciones y los procedimientos almacenados en la base de datos son elementos de código que constan de ANSI SQL y del lenguaje de procedimiento extendido de SQL; por ejemplo, PL/SQL para Oracle y el lenguaje de procedimiento de MySQL para MySQL. PL/pgSQL es el lenguaje de procedimiento extendido de PostgreSQL.
El propósito de estas funciones y procedimientos almacenados es brindar soluciones para aquellos requisitos que son más adecuados para ejecuciones desde la base de datos y no desde la aplicación (por ejemplo, rendimiento, compatibilidad y seguridad). Aunque las funciones y los procedimientos almacenados usan PL/SQL, los procedimientos almacenados se usan en especial para realizar operaciones DDL/DML, y las funciones se usan principalmente para realizar cálculos con el objetivo de devolver resultados específicos.
De PL/SQL a PL/pgSQL
Desde la perspectiva de la migración de Oracle PL/SQL a Cloud SQL para PostgreSQL, PL/pgSQL es similar a Oracle PL/SQL en términos de estructura y sintaxis. Sin embargo, hay algunas diferencias principales que requieren una migración de código. Por ejemplo, los tipos de datos son diferentes entre Oracle y Cloud SQL para PostgreSQL, y a menudo se necesita una traducción para garantizar que el código migrado use los nombres de tipo de datos correspondientes compatibles con Cloud SQL para PostgreSQL. Para obtener un análisis detallado de las diferencias entre los dos lenguajes, consulta Portabilidad desde Oracle PL/SQL.
Seguridad y privilegios de objetos de código
En Oracle, para crear un procedimiento almacenado o una función, el usuario debe tener el privilegio del sistema CREATE PROCEDURE (a fin de crear procedimientos o funciones con otros usuarios, los usuarios de la base de datos deben tener el privilegio CREATE
ANY PROCEDURE). Para ejecutar un procedimiento almacenado o una función,
los usuarios de la base de datos deben tener el privilegio EXECUTE.
En PostgreSQL, para crear un procedimiento de código o una función, el usuario debe
tener el privilegio USAGE. Para ejecutar un procedimiento o una función, el usuario debe
tener el privilegio EXECUTE en dicho procedimiento o función.
De forma predeterminada, un procedimiento o una función de PL/pgSQL se define como SECURITY INVOKER,
lo que significa que el procedimiento o la función se ejecutará con los privilegios
del usuario que lo llama. Como alternativa, se puede especificar SECURITY DEFINER
para que la función se ejecute con los privilegios del usuario que la posee.
Sintaxis almacenada de funciones y procedimientos de Cloud SQL para PostgreSQL
En el siguiente ejemplo, se muestra la sintaxis de funciones y procedimientos almacenados de Cloud SQL para 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'
} ...
Activadores
Un activador es un procedimiento almacenado que se activa cuando ocurre un evento específico. En Oracle, el evento de activación se asocia a una tabla, una vista, un esquema o la base de datos. Entre los tipos de eventos de activación, se incluyen los siguientes:
- Sentencias de lenguaje de manipulación de datos (DML) (por ejemplo,
INSERT,UPDATE,DELETE) - Sentencias de lenguaje de definición de datos (DDL) (por ejemplo,
CREATE,ALTER,DROP) - Eventos de bases de datos (por ejemplo,
LOGON,STARTUP,SHUTDOWN)
Los activadores de Oracle podrían ser de los siguientes tipos:
- Activador simple: Se activa una sola vez, antes o después del evento de activación especificado.
- Activador compuesto: Se activa con varios eventos.
- Activador
INSTEAD OF: Es un tipo especial de activador DML que proporciona un mecanismo de actualización transparente para vistas complejas no editables. - Activador del sistema: Se activa en eventos de bases de datos específicos.
En Cloud SQL para PostgreSQL, un activador se dispara antes o después de una operación DML
en una tabla, una vista o una tabla
externa específicas. El activador INSTEAD OF es admitido para proporcionar un mecanismo de actualización
para las vistas. Un activador en las operaciones DDL se denomina
activador de eventos.
Cloud SQL para PostgreSQL no admite los activadores del sistema de Oracle según los eventos de la base de datos.
A diferencia de los activadores de Oracle, los de Cloud SQL para PostgreSQL no admiten el uso de un bloque PL/pgSQL anónimo como el cuerpo del activador. En la declaración del activador, se debe proporcionar una función con nombre que tome cero o más argumentos y devuelva un activador de tipo. Esta función se ejecuta cuando se dispara el activador.
Sintaxis del activador y activador de eventos de Cloud SQL para PostgreSQL
En el siguiente ejemplo, se muestra la sintaxis del activador y el activador de eventos de Cloud SQL para PostgreSQL:
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 puede ser una de las siguientes opciones: 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 puede ser una de las siguientes opciones: ddl_command_start,
ddl_command_end, table_rewrite, sql_drop.
filter_value solo puede ser TAG.
filter_value puede ser una de las
etiquetas de comando compatibles.
¿Qué sigue?
- Obtén más información sobre las cuentas de usuario de Cloud SQL para PostgreSQL.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta el Cloud Architecture Center.