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

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:

Consultas

Oracle y Cloud SQL para PostgreSQL admiten el estándar ANSI SQL. En general, es sencillo migrar instrucciones de SQL mediante el uso de 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 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 Cloud SQL para PostgreSQL correspondiente o una solución alternativa
Sintaxis básica de SQL para la recuperación de datos SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
para 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 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).
Los nombres no distinguen entre mayúsculas y 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áusula FROM y 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 for PostgreSQL 12
SQL> SELECT FIRST_NAME,
DEPARTMENT_ID,
SALARY,
DATE_COL
FROM EMPLOYEES,
(SELECT SYSDATE AS DATE_COL FROM DUAL);


El resultado es similar a este:

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 en línea:

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.

Agregar un alias a la vista en línea:

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

El resultado es similar a este:

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

Las declaraciones JOIN de Oracle son compatibles con las declaraciones 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 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 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 declaraciones SELECT y elimina los registros duplicados.
  • UNION ALL: Adjunta los conjuntos de resultados de dos o más declaraciones SELECT sin eliminar los registros duplicados.
  • INTERSECT: Muestra la intersección de dos o más declaraciones SELECT solo 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 declaraciones SELECT solo si existe un registro en ambos conjuntos de datos.
  • MINUS (EXCEPT (en Cloud SQL para PostgreSQL): Compara dos o más declaraciones SELECT y muestra solo filas distintas de la primera consulta que no muestran las otras declaraciones.
  • EXCEPT ALL (solo Cloud SQL para PostgreSQL): compara dos o más declaraciones SELECT y muestra solo filas de la primera consulta que no muestran las otras declaraciones 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 Cloud SQL para PostgreSQL correspondiente o una solución alternativa
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 proporciona una lista extensa de funciones escalares (de una sola fila) y de agregación. Algunas de las funciones de Cloud SQL para MySQL 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 por nombre y funcionalidad (especificado por "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 Muestra str1 concatenado con str2:

CONCAT('A', 1) = A1
CONCAT Equivalente a Oracle:

CONCAT('A', 1) = A1
LOWER/UPPER Muestra char, con todas las letras en minúscula o mayúscula:

LOWER('SQL') = sql
LOWER/UPPER Equivalente a Oracle:

LOWER('SQL') = sql
LPAD/RPAD Muestra expr1, con relleno izquierdo o derecho con n caracteres, con la secuencia de caracteres en expr2:

LPAD('A',3,'*') = **A
LPAD/RPAD Equivalente a Oracle:

LPAD('A',3,'*') = **A
SUBSTR Muestra una parte de char, que comienza en la posición de caracteres, con una longitud de la substring
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 una posición inicial en Oracle, se realiza una operación de substring desde el final de la string, que es diferente de Cloud SQL para PostgreSQL. Usa la función RIGHT como reemplazo si deseas el comportamiento de Oracle.
INSTR Muestra la posición (índice) de una string especifica a partir de una string determinada:

INSTR('PostgreSQL', 'e')
= 7
No N/A Cloud SQL para PostgreSQL no tiene una función instr incorporada. Una función instr compatible con Oracle podría implementarse mediante PL/pgSQL.
REPLACE Muestra char con cada ocurrencia de una string de búsqueda reemplazada por una
string de reemplazo:

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
Parcialmente REPLACE El parámetro de string de reemplazo es opcional en Oracle mientras es obligatorio en Cloud SQL para PostgreSQL. Cuando se omite el parámetro, Oracle quita todos los casos de las strings de búsqueda. El mismo comportamiento se puede lograr en Cloud SQL para PostgreSQL si se proporciona una string vacía como la string de reemplazo.

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
TRIM Recorta los caracteres iniciales o finales (o ambos) de una string:

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

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

LTRIM(' PostgreSQL', ' ')
= PostgreSQL
LTRIM/RTRIM Equivalente a Oracle:

LTRIM(' PostgreSQL', ' ') = PostgreSQL
ASCII Muestra la representación decimal en el grupo de caracteres de la base de datos del primer carácter de char:

ASCII('A') = 65
ASCII Equivalente a Oracle:

ASCII('A') = 65
CHR Muestra el valor del código ASCII, que es un valor numérico entre 0 y 225, para un carácter:

CHR(65) = A
CHAR Equivalente a Oracle:

CHR(65) = A
LENGTH Muestra la longitud de una string determinada:

LENGTH ('PostgreSQL') = 10
LENGTH Equivalente a Oracle:

LENGTH ('PostgreSQL') = 10
REGEXP_REPLACE Busca un patrón de expresión regular en una string:

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
REGEXP_REPLACE Equivalente a Oracle:

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
REGEXP_SUBSTR Extiende la funcionalidad de la función SUBSTR mediante la
búsqueda de un patrón de expresión regular en una string:

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 lograr funciones similares.
REGEXP_COUNT Muestra la cantidad de veces que se produce un patrón en una string de origen. No N/A Usa REGEXP_MATCH de PostgreSQL para lograr funciones similares.
REGEXP_INSTR Busca una posición de string (índice) para un patrón
de expresión regular.
No N/A Convierte la funcionalidad en la capa de la aplicación.
REVERSE Muestra una string invertida.

REVERSE('PostgreSQL') = LQSergtsoP
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
ABS Equivalente a Oracle:

ABS(-4.6) = 4.6
CEIL Muestra el número entero más pequeño mayor o igual que n:

CEIL(21.4) = 22
CEIL Equivalente a Oracle:

CEIL(21.4) = 22
FLOOR Muestra el número entero más grande menor o igual que n:

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

FLOOR(-23.7) = -24
MOD Muestra el resto de m dividido por n:

MOD(10, 3) = 1
MOD Equivalente a Oracle:

MOD(10, 3) = 1
ROUND Muestra n redondeado a números enteros a la derecha del punto decimal:

ROUND(1.39, 1) = 1.4
ROUND Equivalente a Oracle:

ROUND(1.39, 1) = 1.4
TRUNC
(cantidad)
Muestra n1 truncado en n2 decimales:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
TRUNCATE
(cantidad)
Equivalente a Oracle:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 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 Muestra 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
= 31-JUL-2019
De forma parcial con diferente nombre y formato de función CURRENT_TIMESTAMP CURRENT_TIMESTAMP mostrará 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 Muestra la fecha del sistema, incluidos los segundos y la zona horaria:

SELECT SYSTIMESTAMP FROM DUAL
= 01-JAN-19 07.37.11.622187000 AM +00:00
De forma parcial con un nombre de función diferente CURRENT_TIMESTAMP Cloud SQL para PostgreSQL muestra un formato de fecha y hora diferente del de Oracle. El formato de fecha es obligatorio para coincidir con los formatos de fecha y hora originales:

SELECT CURRENT_TIMESTAMP
= 2019-01-31 07:37:11.622187+00
LOCAL TIMESTAMP Muestra 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
= 01-JAN-19 10.01.10.123456 PM
De forma parcial con un formato de fecha y hora diferente LOCAL TIMESTAMP Cloud SQL para PostgreSQL muestra un formato de fecha y hora diferente del de Oracle. El formato de fecha es obligatorio para coincidir con el formato de fecha y hora original:

SELECT LOCALTIMESTAMP
= 2019-01-31 07:37:11.622187+00
CURRENT_DATE Muestra la fecha actual en la zona horaria de la sesión:

SELECT CURRENT_DATE FROM DUAL
= 31-JAN-19
De forma parcial con un formato de fecha y hora diferente CURRENT_ DATE Cloud SQL para PostgreSQL muestra un formato de fecha y hora diferente del de Oracle. El formato de fecha es obligatorio para coincidir con el formato de fecha y hora original:

SELECT CURRENT_DATE
= 2019-01-31
CURRENT_TIMESTAMP Muestra la fecha y 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
De forma parcial con un formato de fecha y hora diferente CURRENT_TIMESTAMP Cloud SQL para PostgreSQL muestra un formato de fecha y hora diferente del de Oracle. El formato de fecha será obligatorio para coincidir con el formato de fecha y hora original:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 2019-01-31 07:37:11.622187+00s
ADD_MONTHS Muestra la fecha y los meses en números enteros:

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

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
LAST_DAY Muestra 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 un operador + para calcular el último día del mes. Se requiere 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 Muestra el número de meses entre las fechas date1 y date2:

MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
= 1.96
Parcial
con
Formato diferente de fecha y hora
AGE La función AGE de Cloud SQL para PostgreSQL muestra el intervalo entre dos marcas de tiempo:

AGE(DATE '01-JAN-2019', DATE '01-JAN-2019' - 60)
= 1 mon 29 days

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 un tipo de datos de VARCHAR2
data 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 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 medio de una instrucción IF-THEN-ELSE. No CASE Usa la instrucción CASE de Cloud SQL para PostgreSQL a fin de lograr una funcionalidad similar.
DUMP Muestra 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 No disponible No compatible.
ORA_HASH Calcula un valor de hash para una expresión determinada. No MD5 / SHA224 / SHA256 / SHA385 / SHA512 Usa el rol MD5 de Cloud SQL para PostgreSQL para la suma de verificación de 128 bits o la función SHA para la suma de verificación de 160 bits
para 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 de colección en otro tipo de datos integrado o un valor de tipo de colección:

CAST('1' as int) + 1
= 2
Parcialmente CAST El rol 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
= 2
CONVERT Convierte una string de caracteres de un conjunto de caracteres en otro:

CONVERT ( 'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
Parcialmente CONVERT La función CONVERT de Cloud SQL para PostgreSQL muestra un valor bytea, que es una string 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')
= [Binary representation of the string in LATIN1 encoding]
TO_CHAR
(string/numérico)
La función convierte un número o una fecha en una string:

TO_CHAR(22.73,'$99.9')
= $22.7
Parcialmente TO_CHAR La función TO_CHAR de Cloud SQL para PostgreSQL es una funcionalidad similar a Oracle. Cloud SQL para PostgreSQL es compatible con una lista de strings 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. Esto se puede suprimir mediante el prefijo FM:

TO_CHAR(22.73,'FM$99.9')
= $22.7
TO_DATE La función TO_DATE de Oracle convierte una string 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 una funcionalidad similar a Oracle. Cloud SQL para PostgreSQL admite una lista de strings de formato ligeramente diferente:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 2019-01-01
TO_NUMBER Convierte la expresión en un valor de un tipo de datos NUMBER:

TO_NUMBER('01234')
= 1234
Parcialmente TO_NUMBER La función TO_NUMBER de Cloud SQL para PostgreSQL requiere una string de formato como entrada, mientras que es opcional en Oracle:

TO_NUMBER('01234','99999')
= 1234

Una alternativa es usar la función CAST para las conversiones que no necesitan strings de formato complejas:

CAST('01234' AS NUMERIC)
= 1234
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 declaración CASE elige entre una secuencia de condiciones y ejecuta una
declaració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 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 Muestra la primera expresión que no es nula en 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 muestra un valor nulo. Si no son iguales, la función muestra expr1:

NULLIF('1', '2')
= 1
NULLIF Equivalente a Oracle:

NULLIF('1', '2')
= 1
NVL Reemplaza nulo (se muestra como un espacio en blanco) por una string en los resultados de una consulta:

NVL(null, 'a')
= a
No COALESCE Como alternativa, usa la función COALESCE:

COALESCE(null, 'a')
= a
NVL2 Determina el valor que muestra 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')
= 1
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 muestra un identificador único global (valor RAW) compuesto
por 16 bytes:

SELECT SYS_GUID() FROM DUAL
= 8EFA4A31468B4C6DE05011AC0200009E
De forma parcial con un nombre y un formato de función 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 Muestra un número entero que identifica de forma inequívoca al usuario de la sesión (el usuario
que accedió):

SELECT UID FROM DUAL
= 43
No N/A N/A
USER Muestra el nombre de usuario de la sesión actual:

SELECT USER FROM DUAL
= UserName
USER Equivalente a Oracle:

SELECT USER;
= postgres
USERENV Muestra información sobre la sesión de 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, los parámetros individuales como USERENV('SID') se pueden recuperar mediante las funciones de información del sistema, como PG_BACKGROUND_PID().
ROWID El servidor de Oracle asigna a cada fila 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 muestran las consultas con ROWNUM, Cloud SQL para PostgreSQL admite LIMIT y OFFSET con fines similares.

ROW_NUMBER() función analítica podría ser un reemplazo 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 usarlos 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 Muestra el valor promedio de la columna o expresión. AVG Equivalente a Oracle
COUNT Muestra la cantidad de filas que muestra una consulta. COUNT Equivalente a Oracle
COUNT (DISTINCT) Muestra el número de valores únicos en la columna o expresión. COUNT
(DISTINCT)
Equivalente a Oracle
MAX Muestra el valor máximo de una columna o expresión. MAX Equivalente a Oracle
MIN Muestra el valor mínimo de una columna o expresión. MIN Equivalente a Oracle
SUM Muestra la suma de los valores de la columna o expresión. SUM Equivalente a Oracle
LISTAGG Muestra los datos dentro de cada grupo mediante 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(
DEPARTMENT_NAME, ', ')
WITHIN GROUP
(ORDER BY DEPARTMENT_NAME) DEPT
FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
No STRING_AGG Usa el rol STRING_AGG de Cloud SQL para PostgreSQL para mostrar 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;

-- Single line results
= Accounting, Administration, Benefits, Construction
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
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 del 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 muestran diferentes resultados predeterminados:

  • La función SYSDATE de Oracle muestra 01-AUG-19 de forma predeterminada.
  • La función CURRENT_DATE de PostgreSQL muestra 2019-08-01 de forma predeterminada (sin hora del día, incluso con formato). Para recuperar la fecha y hora actuales, usa la función CURRENT_TIMESTAMP, que muestra 2019-08-01 00:00:00.000000+00 de forma predeterminada.
  • Los formatos de fecha y hora se pueden configurar mediante las funciones TO_CHAR de 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 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 nivel SELECT, para declaraciones 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 es compatible con todos los operadores básicos:

> | >= | < | <= | = | <> | !=

Funciones analíticas (o funciones analíticas 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 alcance de una sola expresión de consulta. Por lo general, se usan en el almacenamiento de datos, junto con los informes de inteligencia empresarial y las estadísticas.

Notas de la conversión

Cloud SQL para PostgreSQL admite muchas funciones analíticas que se conocen en Postgres como funciones agregadas 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 mover la lógica a la capa de la 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
AVERAGE_RANK
DENSE_RANK
ROW_NUMBER
PERCENT_RANK
CUME_DIST
NTILE
FIRST_VALUE
LAST_VALUE
OVER (PARTITION BY...)
Sí (excepto AVERAGE_RANK)
Jerárquicas CONNECT BY
HIER_ANCESTOR
HIER_CHILD_COUNT
HIER_DEPTH
HIER_LEVEL
HIER_ORDER
HIER_PARENT
HIER_TOP
No
Lag 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 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 en varias partes de una instrucción de SQL mediante la cláusula WITH. Oracle y CTE son compatibles con Oracle y Cloud SQL para PostgreSQL.

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;

Declaración 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 declaración determinista, lo que significa que una vez que la declaración MERGE procesa una fila, no se puede volver a procesar mediante la misma declaración MERGE.

Notas de la conversión

A diferencia de Oracle, Cloud SQL para PostgreSQL no admite la funcionalidad MERGE. A fin de simular de forma parcial la funcionalidad MERGE, Cloud SQL para PostgreSQL proporciona las declaraciones 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á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 funcionalidad de MERGE en un procedimiento almacenado para administrar las operaciones de DML, mediante comandos INSERT, UPDATE y DELETE con excepciones y manejo de duplicaciones.

Sugerencias de instrucciones de SQL

Oracle proporciona una gran colección de sugerencias de consultas de 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 consulta comparable, a nivel de instrucción SQL, para influir en el optimizador.

Para influir en los planes de consulta que elige 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 declaración 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 declaración:

SET RANDOM_PAGE_COST=2.0;

Reducir este valor hace que Cloud SQL para PostgreSQL prefiera los análisis de índices. Aumentarlo hace lo opuesto.

Notas de la conversión

Debido a que existen diferencias fundamentales entre los optimizadores de Oracle y Cloud SQL para PostgreSQL, y el hecho de que Cloud SQL para PostgreSQL no admite sugerencias de consultas de SQL de estilo Oracle, recomendamos que quites las sugerencias de consulta durante tu migración a Cloud SQL para PostgreSQL. Luego, realiza pruebas rigurosas de rendimiento mediante las herramientas de Cloud SQL para PostgreSQL, examina las consultas mediante planes de ejecución y ajusta la configuración de la instancia o los parámetros de 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 declaraciones SELECT, INSERT, UPDATE y DELETE para los usuarios de la base de datos, lo que también permite que los administradores tengan una mejor visión de las consultas y operaciones de DML específicas. Son útiles en especial cuando necesitas ajustar el rendimiento de las consultas, por ejemplo, para determinar el rendimiento del índice o determinar 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 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 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 declaración 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
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 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 para el propio lenguaje de procedimiento extendido de PostgreSQL.

El propósito de estos procedimientos almacenados y funciones es proporcionar 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 los procedimientos almacenados y las funciones usan PL/SQL, los procedimientos almacenados se usan en especial para realizar operaciones DDL/DML, y las funciones se usan en especial a fin de realizar cálculos con el objetivo de mostrar 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 a fin de asegurarse de 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 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 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 procedimiento y función 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. El tipo de eventos de activación incluye lo siguiente:

  • Declaraciones de lenguaje de manipulación de datos (DML) (por ejemplo, INSERT, UPDATE, DELETE)
  • Declaraciones 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: 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, se activa un activador 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 compatible con el fin de 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 de sistema de Oracle según los eventos de la base 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 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 muestre un activador de tipo. Esta función se ejecuta cuando se activa 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?