Este documento forma parte de una serie que proporciona información y directrices clave relacionadas con la planificación y la realización de migraciones de bases de datos Oracle® 11g/12c a la versión 12 de Cloud SQL para PostgreSQL. Además de la parte de configuración inicial, la serie incluye las siguientes partes:
- Migrar usuarios de Oracle a Cloud SQL para PostgreSQL: terminología y funciones
- Migrar usuarios de Oracle a Cloud SQL para PostgreSQL: tipos de datos, usuarios y tablas
- Migrar usuarios de Oracle a Cloud SQL para PostgreSQL: consultas, procedimientos almacenados, funciones y activadores (este documento)
- Migrar usuarios de Oracle a Cloud SQL para PostgreSQL: seguridad, operaciones, monitorización y registro
- Migrar usuarios y esquemas de bases de datos de Oracle a Cloud SQL para PostgreSQL
Consultas
Oracle y Cloud SQL para PostgreSQL admiten el estándar ANSI SQL. Por lo tanto, suele ser sencillo migrar instrucciones SQL usando solo elementos de sintaxis básicos (por ejemplo, sin especificar ninguna función escalar ni ninguna otra función ampliada de Oracle). En la siguiente sección se describen los elementos de consulta de Oracle habituales y sus equivalentes en Cloud SQL para PostgreSQL.
Sintaxis básica de SELECT y FROM
Nombre de la función o de la sintaxis de Oracle | Descripción general o implementación de Oracle | Compatibilidad con Cloud SQL para PostgreSQL | Solución correspondiente o alternativa de Cloud SQL para PostgreSQL |
---|---|---|---|
Sintaxis básica de SQL para recuperar datos | SELECT
|
Sí | SELECT
|
SELECT para la 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 en los nombres de las tablas | No se distingue entre mayúsculas y minúsculas (por ejemplo, el nombre de la tabla puede ser orders
o ORDERS ). |
Sí | No se distingue entre mayúsculas y minúsculas, a menos que se pongan entre comillas (por ejemplo, orders y ORDERS se tratan de la misma forma, mientras que "orders" y "ORDERS" se tratan de forma diferente). |
Para obtener más información sobre la sintaxis SELECT
de Cloud SQL para PostgreSQL, consulta la documentación.
Vistas insertadas
- Las vistas insertadas (también conocidas como tablas derivadas) son instrucciones
SELECT
que se encuentran en la cláusulaFROM
y se usan como subconsultas. - Las vistas insertadas pueden simplificar las consultas complejas eliminando cálculos compuestos o operaciones de unión, al tiempo que condensan varias consultas independientes en una sola consulta simplificada.
- Nota sobre la conversión: Las vistas insertadas de Oracle no requieren el uso de alias, mientras que Cloud SQL para PostgreSQL requiere alias específicos para cada vista insertada.
En la siguiente tabla se muestra un ejemplo de conversión de Oracle a Cloud SQL para PostgreSQL como una vista insertada.
Oracle 11g/12c | Cloud SQL para PostgreSQL 12 |
---|---|
SQL> SELECT FIRST_NAME,
La salida es similar a la siguiente:
FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
|
Sin alias para la vista insertada: postgres=> SELECT FIRST_NAME,
Añadir un alias a la vista insertada: postgres=> SELECT FIRST_NAME,
El resultado debería ser similar al siguiente:
first_name | department_id | salary | date_col
|
Instrucciones JOIN
Cloud SQL para PostgreSQL admite las instrucciones JOIN
de Oracle JOIN
. Sin embargo, Cloud SQL para PostgreSQL no admite el uso del operador de unión de Oracle (+)
. Para obtener el mismo resultado, tendrías que convertir la sintaxis de SQL a la sintaxis estándar de las uniones externas.
En la siguiente tabla se muestra un ejemplo de conversión de JOIN.
Tipo de JOIN de Oracle | Compatible con Cloud SQL para PostgreSQL | Sintaxis 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 admite 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
de 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 instruccionesSELECT
y elimina los registros duplicados.UNION ALL
: adjunta los conjuntos de resultados de dos o más instruccionesSELECT
sin eliminar los registros duplicados.INTERSECT
: devuelve la intersección de dos o másSELECT
instrucciones solo si existe un registro en ambos conjuntos de datos. Los registros duplicados no se eliminan.INTERSECT ALL
(solo en Cloud SQL para PostgreSQL): devuelve la intersección de dos o más instruccionesSELECT
solo si existe un registro en ambos conjuntos de datos.MINUS (EXCEPT
en Cloud SQL para PostgreSQL): compara dos o más instruccionesSELECT
y devuelve solo las filas distintas de la primera consulta que no devuelven las demás instrucciones.EXCEPT ALL
(solo Cloud SQL para PostgreSQL): compara dos o más instruccionesSELECT
y devuelve solo las filas de la primera consulta que no devuelven las demás instrucciones sin eliminar los registros duplicados.
Notas de conversión
Cuando conviertas operadores de Oracle MINUS
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 de 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 grupo
Cloud SQL para PostgreSQL ofrece una amplia lista de funciones escalares (de una sola fila) y de agregación. Algunas funciones de Cloud SQL para PostgreSQL son similares a sus equivalentes de Oracle (por nombre y funcionalidad, o con un nombre diferente pero con una funcionalidad similar). Aunque las funciones de Cloud SQL para PostgreSQL pueden tener nombres idénticos a sus equivalentes de Oracle, a veces tienen funcionalidades diferentes.
En las siguientes tablas se describe en qué casos Oracle y Cloud SQL para PostgreSQL son equivalentes por nombre y funcionalidad (especificados con "Sí") y en qué casos se recomienda una conversión (todos los casos que no sean "Sí").
Funciones de caracteres
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones 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 car con todas las letras en minúsculas o mayúsculas: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 hasta alcanzar la longitud n
caracteres con la secuencia de caracteres de expr2:LPAD('A',3,'*') = **A
|
Sí | LPAD/RPAD
|
Equivalente a Oracle:LPAD('A',3,'*') = **A
|
SUBSTR
|
Devuelve una parte de char, empezando por la posición del carácter,
subcadena- longitud de caracteres: 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 posición inicial en Oracle, se realiza una operación de subcadena desde el final de la cadena, que es diferente de Cloud SQL para PostgreSQL. Usa la función RIGHT
como sustituto si quieres que se comporte como Oracle. |
INSTR
|
Devuelve la posición (índice) de una cadena específica de una cadena determinada:INSTR('PostgreSQL', 'e')
|
No | N/A | Cloud SQL para PostgreSQL no tiene una función instr
integrada. Una función instr compatible con Oracle se puede implementar con PL/pgSQL. |
REPLACE
|
Devuelve el carácter con cada instancia de una cadena de búsqueda sustituida por una cadena de sustitución: REPLACE('ORADB', 'ORA', 'PostgreSQL')
|
Parcialmente | REPLACE
|
El parámetro de cadena de sustitución es opcional en Oracle, mientras que es obligatorio en Cloud SQL para PostgreSQL. Si se omite el parámetro, Oracle elimina todas las apariciones de las cadenas de búsqueda. El mismo comportamiento se puede conseguir en Cloud SQL para PostgreSQL proporcionando una cadena vacía como cadena de sustitución.REPLACE('ORADB', 'ORA', 'PostgreSQL')
|
TRIM
|
Recortar 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
|
Elimina del extremo izquierdo o derecho de la cadena todos los caracteres que aparezcan en la búsqueda: LTRIM(' PostgreSQL', ' ')
|
Sí | LTRIM/RTRIM
|
Equivalente a Oracle:LTRIM(' PostgreSQL', ' ')
= PostgreSQL
|
ASCII
|
Devuelve la representación decimal en el conjunto 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,
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 una cadena con un patrón de expresión regular:REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
Sí | REGEXP_REPLACE
|
Equivalente a Oracle:REGEXP_REPLACE('John', '[hn].', '1') = Jo1
|
REGEXP_SUBSTR
|
Amplía la funcionalidad 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 conseguir funciones similares. |
REGEXP_COUNT
|
Devuelve el número de veces que aparece un patrón en una cadena de origen. | No | N/A | Usa REGEXP_MATCH de PostgreSQL para conseguir funciones similares. |
REGEXP_INSTR
|
Busca una posición (índice) de una cadena para encontrar 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 | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones 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 menor número entero que sea superior o igual a n: CEIL(21.4) = 22
|
Sí | CEIL
|
Equivalente a Oracle:CEIL(21.4) = 22
|
FLOOR
|
Devuelve el mayor número entero igual o inferior a n: FLOOR(-23.7) = -24
|
Sí | FLOOR
|
Equivalente a Oracle:FLOOR(-23.7) = -24
|
MOD
|
Devuelve el resto de m dividido entre n :MOD(10, 3) = 1
|
Sí | MOD
|
Equivalente a Oracle:MOD(10, 3) = 1
|
ROUND
|
Devuelve n redondeado a los decimales indicados a la derecha de la coma decimal:ROUND(1.39, 1) = 1.4
|
Sí | ROUND
|
Equivalente a Oracle:ROUND(1.39, 1) = 1.4
|
TRUNC (número) |
Devuelve n1 truncado a n2 decimales:TRUNC(99.999) = 99
|
Sí | TRUNCATE
(número) |
Equivalente a Oracle:TRUNC(99.999) = 99
|
Funciones de fecha y hora
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
SYSDATE
|
Devuelve la fecha y la hora actuales definidas en el sistema operativo en el que reside el servidor de la base de datos:SELECT SYSDATE FROM DUAL
|
Parcialmente 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 fraccionarios y la zona horaria:SELECT SYSTIMESTAMP FROM DUAL
|
Parcialmente con un nombre de función diferente | CURRENT_TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente al 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 la hora actuales en la zona horaria de la sesión como un valor de
tipo de datos TIMESTAMP : SELECT LOCALTIMESTAMP
FROM DUAL
|
Parcialmente con un formato de fecha y hora diferente | LOCAL
TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente al de Oracle. El formato de fecha debe coincidir con el formato original de fecha y hora:SELECT LOCALTIMESTAMP
|
CURRENT_DATE
|
Devuelve la fecha actual en la zona horaria de la sesión: SELECT CURRENT_DATE FROM DUAL
|
Parcialmente con un formato de fecha y hora diferente | CURRENT_
DATE
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente al 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 la hora actuales en la zona horaria de la sesión: SELECT CURRENT_TIMESTAMP FROM DUAL
|
Parcialmente con un formato de fecha y hora diferente | CURRENT_TIMESTAMP
|
Cloud SQL para PostgreSQL devuelve un formato de fecha y hora diferente al de Oracle. El formato de fecha debe coincidir con el formato de fecha y hora original:SELECT CURRENT_TIMESTAMP FROM DUAL
|
ADD_MONTHS
|
Devuelve la fecha más los meses enteros:ADD_MONTHS(SYSDATE, 1)
|
No | N/A | Para conseguir la misma función en Cloud SQL para PostgreSQL, usa los operadores + / - y especifica el intervalo de tiempo:SELECT CURRENT_TIMESTAMP + INTERVAL '1 MONTH'
|
EXTRACT (parte de la fecha) |
Devuelve el valor de un campo de fecha y hora especificado a partir de una expresión de fecha y hora o de 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 el operador + para calcular el último día del mes. Es necesario aplicar un formato de fecha para que coincida 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 fecha1 y fecha2:MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
|
Parcialmente con Función diferente formato 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 obtener los mismos valores que la función MONTH_BETWEEN de Oracle, se requiere una conversión más específica. |
TO_CHAR (fecha/hora) |
Convierte un valor de fecha y hora o de marca de tiempo en un valor de tipo de datos VARCHAR2 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 | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
DECODE
|
Compara la expresión con cada valor de búsqueda uno por uno mediante una
declaración IF-THEN-ELSE . |
No | CASE
|
Usa la instrucción CASE de Cloud SQL para PostgreSQL para conseguir una función similar. |
DUMP
|
Devuelve un valor VARCHAR2 que contiene el código del tipo de datos, la longitud en bytes y la representación interna de la expresión. |
No | N/A | No es compatible. |
ORA_HASH
|
Calcula un valor hash para una expresión determinada. | No | MD5 / SHA224 / SHA256 / SHA385 / SHA512
|
Usa la función MD5 de Cloud SQL para PostgreSQL para obtener una suma de comprobación de 128 bits o la función SHA para obtener una suma de comprobación de 160 bitspara generar valores hash. |
Funciones de conversión
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones 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 entre los tipos de datos de las dos bases de datos:CAST('1' as int) + 1
|
CONVERT
|
Convierte una cadena de caracteres de un conjunto de caracteres a 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 juegos de caracteres
compatibles con PostgreSQL también son diferentes de los de Oracle.CONVERT('Ä Ê Í Õ Ø A B C D E', 'UTF8', 'LATIN1')
|
TO_CHAR (cadena o número) |
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 admite una lista de cadenas de formato ligeramente 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. Para evitarlo, usa 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
ligeramente diferente
de cadenas de formato:TO_DATE('2019/01/01', 'yyyy-mm-dd')
|
TO_NUMBER
|
Convierte la expresión en un valor de 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 en Oracle es opcional:TO_NUMBER('01234','99999')
Otra opción es usar la función CAST para las conversiones que no requieren cadenas de formato complejas:CAST('01234' AS NUMERIC)
|
Funciones SELECT condicionales
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
CASE
|
La instrucción CASE elige entre una secuencia de condiciones y ejecuta una instrucción 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 | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
COALESCE
|
Devuelve la primera expresión no nula de 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
|
Sustituye el valor nulo (que se devuelve como un espacio en blanco) por una cadena en los resultados de una consulta:
NVL(null, 'a')
|
No | COALESCE
|
Como alternativa, puedes usar la función COALESCE :COALESCE(null, 'a')
|
NVL2
|
Determina el valor devuelto por una consulta en función de si una expresión especificada es nula o no. |
No | COALESCE
|
Como alternativa, puedes usar la función COALESCE :COALESCE(null, 1, 'a')
|
Funciones de entorno e identificador
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones 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
|
Parcialmente con un nombre y un formato de función diferentes | UUID_GENERATE_V4
|
Cloud SQL para PostgreSQL admite la extensión uuid-ossp, que proporciona una lista de funciones de generación de UUIDs, como UUID_GENERATE_V4 :SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2. |
UID
|
Devuelve un número entero que identifica de forma única al usuario de la sesión (el usuario que ha iniciado sesión): 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 del 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, se pueden recuperar parámetros individuales, como USERENV('SID') , mediante funciones de información del sistema, como 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. ROWID es la dirección de la fila que contiene el número del objeto de datos, el bloque de datos de la fila, la posición de la fila y el archivo de datos. |
Parcialmente 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 la fila en su tabla, que es similar a ROWID de Oracle. |
ROWNUM
|
Devuelve un número que representa el orden en el que Oracle selecciona una fila de una tabla o de tablas combinadas. | No | LIMIT or ROW_NUMBER()
|
En lugar de limitar el número de resultados devueltos por las consultas mediante ROWNUM , Cloud SQL para PostgreSQL admite LIMIT y OFFSET para fines similares.ROW_NUMBER() window
function podría ser una solución alternativa para ROWNUM de Oracle en otros casos. Sin embargo, deben tenerse en cuenta el orden de los resultados y las diferencias de rendimiento antes de usarlo como sustituto. |
Funciones de agregación (grupo)
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
AVG
|
Devuelve el valor medio de la columna o la expresión. | Sí | AVG
|
Equivalente a Oracle |
COUNT
|
Devuelve el número de filas devueltas por una consulta. | Sí | COUNT
|
Equivalente a Oracle |
COUNT
(DISTINCT)
|
Devuelve el número de valores únicos de la columna o expresión. | Sí | COUNT
|
Equivalente a Oracle |
MAX
|
Devuelve el valor máximo de la columna o la expresión. | Sí | MAX
|
Equivalente a Oracle |
MIN
|
Devuelve el valor mínimo de la columna o la expresión. | Sí | MIN
|
Equivalente a Oracle |
SUM
|
Devuelve la suma de los valores de la columna o la expresión. | Sí | SUM
|
Equivalente a Oracle |
LISTAGG
|
Muestra los datos de cada grupo en una sola fila especificada en la cláusula ORDER BY concatenando los valores de la columna de medida: SELECT LISTAGG(
|
No | STRING_AGG
|
Usa la función STRING_AGG de Cloud SQL para PostgreSQL para obtener resultados similares a los de Oracle, pero ten en cuenta que la sintaxis es diferente en algunos casos:SELECT STRING_AGG(DEPARTMENT_NAME, ', ' order by DEPARTMENT_NAME) FROM DEPARTMENTS;
|
Obtención de Oracle 12c
Función de Oracle | Especificación o implementación de funciones de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones de Cloud SQL para PostgreSQL |
---|---|---|---|---|
FETCH
|
Obtiene filas de datos del conjunto de resultados de una consulta de varias filas:SELECT * FROM
|
No | LIMIT | 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 sencillos y requieren poco o ningún esfuerzo adicional.
Notas de conversión
Examina y corrige los formatos de fecha, ya que los formatos de Oracle y Cloud SQL para PostgreSQL devuelven resultados predeterminados diferentes:
- La función
SYSDATE
de Oracle devuelve01-AUG-19
de forma predeterminada. - La función
CURRENT_DATE
de PostgreSQL devuelve2019-08-01
de forma predeterminada (sin hora del día, incluso con formato). Para obtener la fecha y la 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 definir mediante las funciones de Cloud SQL para PostgreSQL
TO_CHAR
.
Función o subconsulta de Oracle | Equivalente de Cloud SQL para PostgreSQL | Función o subconsulta correspondiente de Cloud SQL para PostgreSQL | Especificación o implementación de funciones 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 SELECT nivel, para las instrucciones JOIN y para filtrar en las cláusulas WHERE/AND :-- SELECT SubQuery
|
Operadores | Sí | Operadores | Cloud SQL para PostgreSQL admite 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 funciones para calcular valores agregados en un grupo de filas (por ejemplo, RANK()
, ROW_NUMBER()
y FIRST_VALUE()
). Estas funciones se aplican a registros particionados lógicamente en el ámbito de una sola expresión de consulta.
Se suelen usar en el almacenamiento de datos junto con informes y analíticas de inteligencia empresarial.
Notas de conversión
Cloud SQL para PostgreSQL admite muchas funciones analíticas, conocidas en Postgres como funciones de agregación y funciones de ventana. Si tu aplicación usa una función menos habitual que no es compatible con PostgreSQL, tendrás que buscar una extensión compatible o mover la lógica a la capa de aplicación.
En la siguiente tabla se enumeran las funciones analíticas más habituales 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árquico | CONNECT BY
|
No |
Retraso | LAG
|
Sí (solo LAG y LEAD ) |
Expresión de tabla común (CTE)
Las CTEs proporcionan una forma de implementar la lógica del código secuencial para reutilizar el código SQL
que puede ser demasiado complejo o no eficiente para un uso múltiple. Las CTEs se pueden nombrar y, a continuación, usar varias veces en diferentes partes de una instrucción SQL mediante la cláusula WITH
. Tanto Oracle como Cloud SQL para PostgreSQL admiten CTEs.
Ejemplos
Oracle y Cloud SQL para PostgreSQL | |
---|---|
WITH DEPT_COUNT
|
Instrucción MERGE
La instrucción MERGE
(o UPSERT
) permite especificar instrucciones SQL únicas que realizan operaciones de DML de forma condicional en una operación MERGE
, en lugar de una sola operación de DML que se ejecuta por separado. Selecciona registros de la tabla de origen y, a continuación, al especificar una estructura lógica, realiza automáticamente 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 instrucción determinista, lo que significa que, una vez que una fila se ha procesado con la instrucción MERGE
, no se puede volver a procesar con la misma instrucción MERGE
.
Notas de conversión
Cloud SQL para PostgreSQL no admite la función MERGE
, a diferencia de Oracle. Para simular parcialmente la función MERGE
, Cloud SQL para PostgreSQL proporciona las instrucciones INSERT ... ON CONFLICT DO UPDATE
:
INSERT… ON CONFLICT DO UPDATE
: si una fila insertada provoca un error de infracción de unicidad o de restricción de exclusión, se lleva a cabo 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 función MERGE
en un procedimiento almacenado para gestionar las operaciones de DML, usando los comandos INSERT
, UPDATE
y DELETE
con gestión de excepciones y duplicaciones.
Pistas de instrucciones SQL
Oracle proporciona una gran colección de sugerencias de consultas de SQL que permiten a los usuarios influir en el comportamiento del optimizador para generar planes de ejecución de consultas más eficientes. Cloud SQL para PostgreSQL no ofrece un mecanismo de sugerencias comparable a nivel de instrucción SQL para influir en el optimizador.
Para influir en los planes de consulta elegidos 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 van desde habilitar o inhabilitar un determinado método de acceso hasta ajustar las constantes de coste del planificador. Por ejemplo, la siguiente instrucción inhabilita el uso de tipos de planes de análisis secuencial, como los análisis de tabla completa, por parte del planificador de consultas:
SET ENABLE_SEQSCAN=FALSE;
Para ajustar la estimación de costes del planificador de una petición aleatoria de una página de disco (el valor predeterminado es 4,0), utiliza la siguiente instrucción:
SET RANDOM_PAGE_COST=2.0;
Si se reduce este valor, Cloud SQL para PostgreSQL preferirá los análisis de índice. Si lo amplías, ocurre lo contrario.
Notas de conversión
Como existen diferencias fundamentales entre los optimizadores de Oracle y Cloud SQL para PostgreSQL, y Cloud SQL para PostgreSQL no admite sugerencias de consultas SQL de estilo Oracle, te recomendamos que elimines las sugerencias de consultas durante la migración a Cloud SQL para PostgreSQL. A continuación, realiza pruebas de rendimiento rigurosas con las herramientas de Cloud SQL para PostgreSQL, examina las consultas mediante planes de ejecución y ajusta los parámetros de la instancia o de la sesión según el caso práctico.
Planes de ejecución
El objetivo principal de los planes de ejecución es ofrecer una visión interna de las decisiones que toma 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 instrucciones SELECT
, INSERT
, UPDATE
y DELETE
de los usuarios de la base de datos, y también permite a los administradores tener una mejor visión de las consultas y las operaciones de DML específicas. Son especialmente útiles cuando necesitas ajustar el rendimiento de las consultas, por ejemplo, para determinar el rendimiento de los índices o para determinar si faltan índices que deban 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 instancia (parámetros globales o de sesión).
Consideraciones sobre las conversiones
Los planes de ejecución no son objetos de base de datos que deban migrarse, sino una herramienta para analizar las diferencias de rendimiento entre Oracle y Cloud SQL para PostgreSQL al ejecutar la misma instrucción en conjuntos de datos idénticos.
Cloud SQL para PostgreSQL no admite la misma sintaxis, funcionalidad ni salida del plan de ejecución que Oracle.
Aquí tienes un ejemplo de 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 procedimental ampliado de Oracle para crear, almacenar y aplicar soluciones basadas en código en la base de datos. En general, los procedimientos y las funciones almacenados de bases de datos son elementos de código que constan de ANSI SQL y lenguaje procedimental extendido de SQL. Por ejemplo, PL/SQL para Oracle y lenguaje procedimental de MySQL para MySQL. PL/pgSQL es el lenguaje de procedimiento extendido propio de PostgreSQL.
El objetivo de estos procedimientos y funciones almacenados es ofrecer soluciones para requisitos que se adapten mejor a la ejecución desde la base de datos y no desde la aplicación (por ejemplo, rendimiento, compatibilidad y seguridad). Aunque tanto los procedimientos almacenados como las funciones usan PL/SQL, los procedimientos almacenados se usan principalmente para realizar operaciones DDL o DML, y las funciones se usan principalmente para realizar cálculos y devolver resultados específicos.
De PL/SQL a PL/pgSQL
Desde el punto de vista de la migración de Oracle PL/SQL a Cloud SQL para PostgreSQL, PL/pgSQL es similar a Oracle PL/SQL en cuanto a su 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 es necesario traducir los nombres de los tipos de datos para asegurarse de que el código migrado use los nombres de los tipos de datos correspondientes admitidos por Cloud SQL para PostgreSQL. Para obtener una descripción detallada de las diferencias entre los dos lenguajes, consulta Porting from Oracle PL/SQL (Migración desde Oracle PL/SQL).
Privilegios y seguridad de los objetos de código
En Oracle, para crear un procedimiento o una función almacenados, el usuario debe tener el privilegio de sistema CREATE PROCEDURE
(para crear procedimientos o funciones en 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 el procedimiento o la 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 llame. También se puede especificar SECURITY DEFINER
para que la función se ejecute con los privilegios del usuario propietario.
Sintaxis de los procedimientos y funciones almacenados de Cloud SQL para PostgreSQL
En el siguiente ejemplo se muestra la sintaxis del procedimiento y la función 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 se produce 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 que pueden activar las alertas se incluyen los siguientes:
- Declaraciones de lenguaje de manipulación de datos (DML) (por ejemplo,
INSERT
,UPDATE
yDELETE
) - Instrucciones del lenguaje de definición de datos (DDL) (por ejemplo,
CREATE
,ALTER
oDROP
) - Eventos de la base de datos (por ejemplo,
LOGON
,STARTUP
ySHUTDOWN
)
Los activadores de Oracle pueden ser de los siguientes tipos:
- Activador simple: se activa exactamente una vez, antes o después del evento de activación especificado.
- Activador compuesto: se activa en varios eventos
INSTEAD OF
: 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 activa antes o después de una operación DML en una tabla, una vista o una tabla externa específicas. Se admite el activador INSTEAD OF
para proporcionar un mecanismo de actualización a las vistas. Un activador de operaciones DDL se denomina activador de eventos.
Cloud SQL para PostgreSQL no admite los activadores del sistema de Oracle basados en eventos de bases de datos.
A diferencia de los activadores de Oracle, los activadores de Cloud SQL para PostgreSQL no admiten el uso de un bloque PL/pgSQL anónimo como 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 activa el activador.
Sintaxis de los activadores y los activadores de eventos de Cloud SQL para PostgreSQL
En el siguiente ejemplo se muestra la sintaxis de activador y 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 uno de los siguientes: INSERT
, UPDATE [ OF column_name [, ... ] ]
, DELETE
o TRUNCATE
.
CREATE EVENT TRIGGER name ON event [ WHEN filter_value IN (filter_value [, ... ]) [ AND ... ] ] EXECUTE { FUNCTION | PROCEDURE } function_name()
event
puede ser uno de los siguientes: ddl_command_start
,
ddl_command_end
, table_rewrite
o sql_drop
.
filter_value
solo puede ser TAG
.
filter_value
puede ser una de las etiquetas de comando admitidas.
Siguientes pasos
- Consulta más información sobre las cuentas de usuario de Cloud SQL para PostgreSQL.
- Consulta arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Centro de arquitectura de Cloud.