Migrar usuarios de Oracle® a Cloud SQL para PostgreSQL: consultas, procedimientos almacenados, funciones y activadores

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:

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
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
para la impresión de salida
SELECT 1 FROM DUAL SELECT 1
Alias de columna SELECT COL1 AS C1 SELECT COL1 AS C1
OR
SELECT COL1 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).
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áusula FROM 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,
DEPARTMENT_ID,
SALARY,
DATE_COL
FROM EMPLOYEES,
(SELECT SYSDATE AS DATE_COL FROM DUAL);


La salida es similar a la siguiente:

FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
-------------------- ------------- ---------- ---------
Steven 90 24000 30-JUL-19
Neena 90 17000 30-JUL-19
Lex 90 17000 30-JUL-19

Sin alias para la vista insertada:

postgres=> SELECT FIRST_NAME,
postgres-> DEPARTMENT_ID,
postgres-> SALARY,
postgres-> DATE_COL
postgres-> FROM EMPLOYEES, (SELECT NOW() AS DATE_COL);

ERROR: subquery in FROM must have an alias
LINE 5: FROM EMPLOYEES, (SELECT NOW() AS DATE_COL);

HINT: For example, FROM (SELECT ...) [AS] foo.

Añadir un alias a la vista insertada:

postgres=> SELECT FIRST_NAME,
postgres-> DEPARTMENT_ID,
postgres-> SALARY,
postgres-> DATE_COL
postgres-> FROM EMPLOYEES, (SELECT NOW() AS DATE_COL) AS C1;

El resultado debería ser similar al siguiente:

first_name | department_id | salary | date_col
-------------+---------------+----------+--------------------------------
Steven | 90 | 24000.00 | 10/16/2020 08:35:18.470089 UTC
Neena | 90 | 17000.00 | 10/16/2020 08:35:18.470089 UTC
Lex | 90 | 17000.00 | 10/16/2020 08:35:18.470089 UTC

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 SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
CROSS JOIN SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D;
FULL JOIN [ OUTER ] SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E FULL JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
LEFT JOIN [ OUTER ] SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
RIGHT JOIN [ OUTER ] SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
SUBQUERY SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN (SELECT * FROM DEPARTMENTS)D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

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 instrucciones SELECT y elimina los registros duplicados.
  • UNION ALL: adjunta los conjuntos de resultados de dos o más instrucciones SELECT sin eliminar los registros duplicados.
  • INTERSECT: devuelve la intersección de dos o más SELECT 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 instrucciones SELECT solo si existe un registro en ambos conjuntos de datos.
  • MINUS (EXCEPT en Cloud SQL para PostgreSQL): compara dos o más instrucciones SELECT 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 instrucciones SELECT 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
UNION
SELECT COL1 FROM TBL2
SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
UNION ALL SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
INTERSECT SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
MINUS SELECT COL1 FROM TBL1
MINUS
SELECT COL1 FROM TBL2
Sí (Convert MINUS a EXCEPT en PostgreSQL) SELECT COL1 FROM TBL1
EXCEPT
SELECT COL1 FROM TBL2

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
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
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
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)
= SQL
Parcialmente SUBSTR Equivalente a Oracle cuando la posición inicial es un número positivo.

SUBSTR('PostgreSQL', 8, 3)
= SQL

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')
= 7
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')
= PostgreSQLDB
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')
= PostgreSQLDB
TRIM Recortar los caracteres iniciales o finales (o ambos) de una cadena:

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
TRIM Equivalente a Oracle:

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
LTRIM/RTRIM Elimina del extremo izquierdo o derecho de la cadena todos los caracteres que
aparezcan en la búsqueda:

LTRIM(' PostgreSQL', ' ')
= PostgreSQL
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
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
CHAR Equivalente a Oracle:

CHR(65) = A
LENGTH Devuelve la longitud de una cadena determinada:

LENGTH ('PostgreSQL') = 10
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
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}/?')
= https://console.cloud.google.com/
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
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
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
CEIL Equivalente a Oracle:

CEIL(21.4) = 22
FLOOR Devuelve el mayor número entero igual o inferior a n:

FLOOR(-23.7) = -24
FLOOR Equivalente a Oracle:

FLOOR(-23.7) = -24
MOD Devuelve el resto de m dividido entre n:

MOD(10, 3) = 1
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
ROUND Equivalente a Oracle:

ROUND(1.39, 1) = 1.4
TRUNC
(número)
Devuelve n1 truncado a n2 decimales:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
TRUNCATE
(número)
Equivalente a Oracle:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 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
= 31-JUL-2019
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
= 2019-07-31 06:46:40.171477+00
SYSTIMESTAMP Devuelve la fecha del sistema, incluidos los segundos fraccionarios y la zona horaria:

SELECT SYSTIMESTAMP FROM DUAL
= 01-JAN-19 07.37.11.622187000 AM +00:00
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
= 2019-01-31 07:37:11.622187+00
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
= 01-JAN-19 10.01.10.123456 PM
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
= 2019-01-31 07:37:11.622187+00
CURRENT_DATE Devuelve la fecha actual en la zona horaria de la sesión:

SELECT CURRENT_DATE FROM DUAL
= 31-JAN-19
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
= 2019-01-31
CURRENT_TIMESTAMP Devuelve la fecha y la hora actuales en la zona horaria de la sesión:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 31-JAN-19 06.54.35.543146 AM +00:00
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
= 2019-01-31 07:37:11.622187+00s
ADD_MONTHS Devuelve la fecha más los meses enteros:

ADD_MONTHS(SYSDATE, 1)
= 31-JAN-19
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'
= 2019-01-31 07:37:11.622187+00s
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')
= 2019
EXTRACT
(parte de la fecha)
Equivalente a Oracle:

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
LAST_DAY Devuelve la fecha del último día del mes que contiene la fecha especificada:

LAST_DAY('01-JAN-2019')
= 31-JAN-19
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'
= 2019-01-31
MONTH_BETWEEN Devuelve el número de meses entre las fechas fecha1 y fecha2:

MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
= 1.96
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)
= 1 mon 29 days

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')
= 01-01-2019 10:01:01
To_CHAR Equivalente a Oracle:

TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
01-01-2019 10:01:01
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 bits
para 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
= 2
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
= 2
CONVERT Convierte una cadena de caracteres de un conjunto de caracteres a otro:

CONVERT ( 'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
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')
= [Binary representation of the string in LATIN1 encoding]
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')
= $22.7
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')
= $22.7
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')
= 01-JAN-2019
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')
= 2019-01-01
TO_NUMBER Convierte la expresión en un valor de tipo de datos NUMBER:

TO_NUMBER('01234')
= 1234
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')
= 1234

Otra opción es usar la función CAST para las conversiones que no requieren cadenas de formato complejas:

CAST('01234' AS NUMERIC)
= 1234
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
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')
= a
COALESCE Equivalente a Oracle:

COALESCE(null, '1', 'a')
= 1
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')
= 1
NULLIF Equivalente a Oracle:

NULLIF('1', '2')
= 1
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')
= a
No COALESCE Como alternativa, puedes usar la función COALESCE:

COALESCE(null, 'a')
= 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')
= 1
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
= 8EFA4A31468B4C6DE05011AC0200009E
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
= 43

No N/A N/A
USER Devuelve el nombre de usuario de la sesión actual:

SELECT USER FROM DUAL
= UserName
USER Equivalente a Oracle:

SELECT USER;
= postgres
USERENV Devuelve información sobre la sesión del usuario actual con la configuración de parámetros actual:

SELECT USERENV('LANGUAGE') FROM DUAL
= ENGLISH_AMERICA.AL32UTF8
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. AVG Equivalente a Oracle
COUNT Devuelve el número de filas devueltas por una consulta. COUNT Equivalente a Oracle
COUNT (DISTINCT) Devuelve el número de valores únicos de la columna o expresión. COUNT
(DISTINCT)
Equivalente a Oracle
MAX Devuelve el valor máximo de la columna o la expresión. MAX Equivalente a Oracle
MIN Devuelve el valor mínimo de la columna o la expresión. MIN Equivalente a Oracle
SUM Devuelve la suma de los valores de la columna o la expresión. 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(
DEPARTMENT_NAME, ', ')
WITHIN GROUP
(ORDER BY DEPARTMENT_NAME) DEPT
FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
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;

-- Single line results
= Accounting, Administration, Benefits, Construction
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
EMPLOYEES
FETCH FIRST 10 ROWS ONLY;
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 devuelve 01-AUG-19 de forma predeterminada.
  • La función CURRENT_DATE de PostgreSQL devuelve 2019-08-01 de forma predeterminada (sin hora del día, incluso con formato). Para obtener la fecha y la hora actuales, usa la función CURRENT_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 EXISTS/ NOT EXISTS SELECT * FROM DEPARTMENTS D
WHERE EXISTS (SELECT 1
FROM EMPLOYEES E
WHERE
E.DEPARTMENT_ID =
D.DEPARTMENT_ID);
IN/NOT IN IN/NOT IN SELECT * FROM DEPARTMENTS D
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID
FROM EMPLOYEES E);

-- OR
SELECT * FROM EMPLOYEES
WHERE (EMPLOYEE_ID, DEPARTMENT_ID)
IN((100, 90));
LIKE/NOT LIKE LIKE/NOT LIKE SELECT * FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_e_n%';
BETWEEN/ NOT BETWEEN BETWEEN/
NOT BETWEEN
SELECT * FROM EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
NOT BETWEEN 2001 and 2004;
AND/OR AND/OR SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(100, 101)
AND (SALARY >= 1000 OR HIRE_DATE <= '2006-02-05');
SubQuery SubQuery Cloud SQL para PostgreSQL admite subconsultas en el SELECTnivel, para las instrucciones JOIN y para filtrar en las cláusulas WHERE/AND:

-- SELECT SubQuery
SELECT D.DEPARTMENT_NAME,
(SELECT AVG(SALARY) AS AVG_SAL
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID =
D.DEPARTMENT_ID) AVG_SAL
FROM DEPARTMENTS D;

-- JOIN SubQuery
SELECT FIRST_NAME, LAST_NAME, SALARY
FROM EMPLOYEES E JOIN
(SELECT *
FROM DEPARTMENTS
WHERE LOCATION_ID = 2700) D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

-- Filtering Subquery
SELECT FIRST_NAME,
LAST_NAME,
SALARY
FROM EMPLOYEES
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEES);
Operadores 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
AVERAGE_RANK
DENSE_RANK
ROW_NUMBER
PERCENT_RANK
CUME_DIST
NTILE
FIRST_VALUE
LAST_VALUE
OVER (PARTITION BY...)
Sí (excepto AVERAGE_RANK)
Jerárquico CONNECT BY
HIER_ANCESTOR
HIER_CHILD_COUNT
HIER_DEPTH
HIER_LEVEL
HIER_ORDER
HIER_PARENT
HIER_TOP
No
Retraso LAG
LAG_VARIANCE LAG_VARIANCE_PERCENT LEAD
LEAD_VARIANCE LEAD_VARIANCE_PERCENT
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
(DEPARTMENT_ID, DEPT_COUNT) AS
(SELECT DEPARTMENT_ID,
COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID)

SELECT E.FIRST_NAME ||' '|| E.LAST_NAME AS EMP_NAME,
D.DEPT_COUNT AS EMP_DEPT_COUNT
FROM EMPLOYEES E JOIN DEPT_COUNT D
USING (DEPARTMENT_ID)
ORDER BY 2 DESC;

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áusula ON 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
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));

Plan hash value: 1833546154

---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 69 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_EMP_ID_PK | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
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 y DELETE)
  • Instrucciones del lenguaje de definición de datos (DDL) (por ejemplo, CREATE, ALTER o DROP)
  • Eventos de la base de datos (por ejemplo, LOGON, STARTUP y SHUTDOWN)

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