Como migrar usuários do Oracle para o Cloud SQL para PostgreSQL: consultas, procedimentos armazenados, funções e gatilhos

Este documento faz parte de uma série que fornece informações importantes e orientações relacionadas ao planejamento e à realização de migrações de banco de dados Oracle® 11g/12c para o Cloud SQL para PostgreSQL versão 12. Além da parte de configuração introdutória, a série inclui as seguintes partes:

Consultas

O Oracle e o Cloud SQL para PostgreSQL são compatíveis com o padrão ANSI SQL. Portanto, geralmente é simples migrar as instruções SQL usando apenas elementos de sintaxe básica (por exemplo, não especificando funções escalares ou qualquer outro recurso estendido do Oracle). Na seção a seguir, discutimos elementos comuns de consulta do Oracle e os equivalentes correspondentes do Cloud SQL para PostgreSQL.

Sintaxe básica de SELECT e FROM

Nome do recurso do Oracle ou nome da sintaxe Visão geral ou implementação do Oracle Suporte do Cloud SQL para PostgreSQL Solução alternativa ou correspondente do Cloud SQL para PostgreSQL
Sintaxe básica do SQL para recuperação de dados SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Sim SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
para impressão de saída
SELECT 1 FROM DUAL Sim SELECT 1
Aliases de coluna SELECT COL1 AS C1 Sim SELECT COL1 AS C1
OR
SELECT COL1 C1
Diferenciação entre maiúsculas e minúsculas no nome da tabela Nenhuma diferenciação de maiúsculas e minúsculas
(por exemplo, o nome da tabela pode ser orders e/ou ORDERS).
Sim Os nomes são indiferentes a maiúsculas, a menos que entre aspas (por exemplo, orders e ORDERS são tratados da mesma forma, mas "orders" e "ORDERS" são tratados de maneira diferente)

Para mais detalhes sobre a sintaxe SELECT do Cloud SQL para PostgreSQL, consulte a documentação.

Visualizações in-line

  • As visualizações in-line, também conhecidas como tabelas derivadas, são instruções SELECT, localizadas na cláusula FROM e usadas como subconsultas.
  • As visualizações in-line podem ajudar a simplificar consultas complexas, removendo cálculos compostos ou eliminando operações de junção, ao mesmo tempo em que compilam várias consultas separadas em uma única consulta simplificada.
  • Observação sobre conversão: visualizações in-line do Oracle não exigem o uso de aliases, enquanto o Cloud SQL para PostgreSQL exige aliases específicos para cada visualização in-line.

A tabela a seguir apresenta um exemplo de conversão do Oracle para o Cloud SQL para PostgreSQL, como uma visualização in-line.

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);


O resultado será assim:

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

Sem alias para a visualização in-line:

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.

Como adicionar um alias à visualização in-line:

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

O resultado será assim:

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

Instruções JOIN

As instruções Oracle JOIN são compatíveis com as instruções JOIN do Cloud SQL para PostgreSQL. No entanto, o uso do operador de mesclagem Oracle (+) não é compatível com o Cloud SQL para PostgreSQL. Para conseguir o mesmo resultado, você precisa converter para a sintaxe SQL padrão para mesclagens externas.

Na tabela a seguir, veja um exemplo de conversão JOIN.

Tipo JOIN do Oracle Compatível com o Cloud SQL para PostgreSQL Sintaxe JOIN do Cloud SQL para PostgreSQL
INNER JOIN Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
CROSS JOIN Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D;
FULL JOIN [ OUTER ] Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E FULL JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
LEFT JOIN [ OUTER ] Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
RIGHT JOIN [ OUTER ] Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
SUBQUERY Sim 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 e MINUS

O Cloud SQL para PostgreSQL é compatível com os operadores Oracle UNION, UNION ALL e INTERSECT. O operador MINUS não é compatível. No entanto, o Cloud SQL para PostgreSQL implementa o operador EXCEPT, que é equivalente ao operador MINUS no Oracle. Além disso, o Cloud SQL para PostgreSQL é compatível com os operadores INTERSECT ALL e EXCEPT ALL, que não são compatíveis com a Oracle.

  • UNION: anexa os conjuntos de resultados de duas ou mais instruções SELECT e elimina registros duplicados.
  • UNION ALL: anexa os conjuntos de resultados de duas ou mais instruções SELECT sem eliminar registros duplicados.
  • INTERSECT: retorna a interseção de duas ou mais instruções SELECT somente se houver um registro nos dois conjuntos de dados. Registros duplicados não são eliminados.
  • INTERSECT ALL (somente Cloud SQL para PostgreSQL): retorna a intersecção de duas ou mais instruções SELECT somente se houver um registro nos dois conjuntos de dados.
  • MINUS (EXCEPT no Cloud SQL para PostgreSQL): compara duas ou mais instruções SELECT, retornando apenas linhas distintas da primeira consulta que não são retornadas pelas outras instruções.
  • EXCEPT ALL (somente Cloud SQL para PostgreSQL): compara duas ou mais instruções SELECT, retornando apenas linhas da primeira consulta que não são retornadas pelas outras instruções sem eliminar registros duplicados.

Notas de conversão

Ao converter dos operadores MINUS Oracle para Cloud SQL para PostgreSQL, use os operadores EXCEPT.

Exemplos

Função Oracle Implementação do Oracle Suporte do Cloud SQL para PostgreSQL Solução alternativa ou correspondente do Cloud SQL para PostgreSQL
UNION SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
Sim SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
UNION ALL SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
Sim SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
INTERSECT SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
Sim SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
MINUS SELECT COL1 FROM TBL1
MINUS
SELECT COL1 FROM TBL2
Sim (de Convert MINUS a EXCEPT no PostgreSQL) SELECT COL1 FROM TBL1
EXCEPT
SELECT COL1 FROM TBL2

Funções escalares (de linha única) e de grupo

O Cloud SQL para PostgreSQL fornece uma extensa lista de funções escalares (de linha única) e de agregação. Algumas das funções do Cloud SQL para PostgreSQL são semelhantes às vias do Oracle (por nome e funcionalidade, ou com um nome diferente, mas com funcionalidade semelhante). Embora as funções do Cloud SQL para PostgreSQL possam ter nomes idênticos às contrapartes da Oracle, às vezes apresentam funcionalidades diferentes.

As tabelas a seguir descrevem onde o Oracle e o Cloud SQL para PostgreSQL são equivalentes por nome e funcionalidade (especificados por "Sim") e em que uma conversão é recomendada (todos os casos além de "Sim").

Funções de caracteres
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
CONCAT Retorna str1 concatenado com str2:

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

CONCAT('A', 1) = A1
LOWER/UPPER Retorna char, com todas as letras maiúsculas ou minúsculas:

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

LOWER('SQL') = sql
LPAD/RPAD Retorna expr1, à esquerda ou à direita preenchidos com caracteres n com a sequência de caracteres em expr2:

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

LPAD('A',3,'*') = **A
SUBSTR Retorna uma parte de char, começando na posição do caractere, com comprimento de substring de
caracteres:

SUBSTR('PostgreSQL', 8, 3)
= SQL
Parcialmente SUBSTR Equivalente ao Oracle quando a posição inicial é um número positivo.

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

Quando um número negativo é fornecido como posição inicial no Oracle, ele executa uma operação de substring do fim da string, que é diferente do Cloud SQL para PostgreSQL. Use a função RIGHT como substituto se o comportamento do Oracle for desejado.
INSTR Retorna a posição (índice) de uma string específica de uma determinada string:

INSTR('PostgreSQL', 'e')
= 7
Não N/A O Cloud SQL para PostgreSQL não tem uma função instr integrada. Uma função instr compatível com Oracle pode ser implementada usando PL/pgSQL.
REPLACE Retorna char com cada ocorrência de uma string de pesquisa substituída por uma
string de substituição:

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
Parcialmente REPLACE O parâmetro de string de substituição é opcional no Oracle enquanto é obrigatório no Cloud SQL para PostgreSQL. Quando o parâmetro é omitido, o Oracle remove todas as ocorrências das strings de pesquisa. O mesmo comportamento pode ser alcançado no Cloud SQL para PostgreSQL ao fornecer uma string vazia como uma string de substituição.

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
TRIM Corte caracteres iniciais ou finais (ou ambos) de uma string:

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

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
LTRIM/RTRIM Remove da extremidade esquerda ou direita da string todos os caracteres que
aparecem na pesquisa:

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

LTRIM(' PostgreSQL', ' ') = PostgreSQL
ASCII Retorna a representação decimal no conjunto de caracteres do banco de dados do primeiro caractere de char:

ASCII('A') = 65
Sim ASCII Equivalente do Oracle:

ASCII('A') = 65
CHR Retorna o valor do código ASCII, que é um valor numérico entre 0 e 225, para um caractere:

CHR(65) = A
Sim CHAR Equivalente do Oracle:

CHR(65) = A
LENGTH Retorna o comprimento de uma determinada string:

LENGTH ('PostgreSQL') = 10
Sim LENGTH Equivalente do Oracle:

LENGTH ('PostgreSQL') = 10
REGEXP_REPLACE Procura um padrão de expressão regular em uma string:

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

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
REGEXP_SUBSTR Estende a funcionalidade da função SUBSTR pesquisando um
padrão de expressão regular em uma string:

REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?')
= https://console.cloud.google.com/
Não N/A Use o REGEXP_MATCH do PostgreSQL para conseguir funcionalidades semelhantes.
REGEXP_COUNT Retorna o número de vezes que um padrão ocorre em uma string de origem. Não N/A Use o REGEXP_MATCH do PostgreSQL para conseguir funcionalidades semelhantes.
REGEXP_INSTR Pesquise uma posição de string (índice) para um padrão de
expressão regular.
Não N/A Converte essa funcionalidade na camada do aplicativo.
REVERSE Retorna uma string invertida.

REVERSE('PostgreSQL') = LQSergtsoP
Sim REVERSE Equivalente do Oracle:

REVERSE('PostgreSQL') = LQSergtsoP
Funções numéricas
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
ABS Valor absoluto de n:

ABS(-4.6) = 4.6
Sim ABS Equivalente do Oracle:

ABS(-4.6) = 4.6
CEIL Retorna o menor número inteiro maior ou igual a n:

CEIL(21.4) = 22
Sim CEIL Equivalente do Oracle:

CEIL(21.4) = 22
FLOOR Retorna o maior inteiro igual ou menor que n:

FLOOR(-23.7) = -24
Sim FLOOR Equivalente do Oracle:

FLOOR(-23.7) = -24
MOD Retorna o restante de m dividido por n:

MOD(10, 3) = 1
Sim MOD Equivalente do Oracle:

MOD(10, 3) = 1
ROUND Retorna n arredondado para casas inteiras à direita do ponto decimal:

ROUND(1.39, 1) = 1.4
Sim ROUND Equivalente do Oracle:

ROUND(1.39, 1) = 1.4
TRUNC
(número)
Retorna n1 truncado para n2 casas decimais:

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

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
Funções DateTime
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
SYSDATE Retorna a data e a hora atuais definidas para o sistema operacional em que o servidor de banco de dados reside:

SELECT SYSDATE FROM DUAL
= 31-JUL-2019
Parcialmente com um nome e formatação de função diferente CURRENT_TIMESTAMP O CURRENT_TIMESTAMP retornará um formato de data e hora diferente da função Oracle SYSDATE:

SELECT CURRENT_TIMESTAMP
= 2019-07-31 06:46:40.171477+00
SYSTIMESTAMP Retorna a data do sistema, incluindo segundos fracionários e fuso horário:

SELECT SYSTIMESTAMP FROM DUAL
= 01-JAN-19 07.37.11.622187000 AM +00:00
Parcialmente com nome de função diferente CURRENT_TIMESTAMP O Cloud SQL para PostgreSQL retorna um formato de data/hora diferente do Oracle. A formatação da data precisa corresponder aos formatos de data e hora original:

SELECT CURRENT_TIMESTAMP
= 2019-01-31 07:37:11.622187+00
LOCAL TIMESTAMP Retorna a data e a hora atuais no fuso horário da sessão em um valor do tipo de dados TIMESTAMP:

SELECT LOCALTIMESTAMP FROM DUAL
= 01-JAN-19 10.01.10.123456 PM
Parcialmente com formatação de data/hora diferente LOCAL TIMESTAMP O Cloud SQL para PostgreSQL retorna um formato de data/hora diferente do Oracle. A formatação da data precisa corresponder ao formato de data e hora original:

SELECT LOCALTIMESTAMP
= 2019-01-31 07:37:11.622187+00
CURRENT_DATE Retorna a data atual no fuso horário da sessão:

SELECT CURRENT_DATE FROM DUAL
= 31-JAN-19
Parcialmente com formatação de data/hora diferente CURRENT_ DATE O Cloud SQL para PostgreSQL retorna um formato de data/hora diferente da Oracle. A formatação da data precisa corresponder ao formato de data e hora original:

SELECT CURRENT_DATE
= 2019-01-31
CURRENT_TIMESTAMP Retorna a data e a hora atuais no fuso horário da sessão:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 31-JAN-19 06.54.35.543146 AM +00:00
Parcialmente com formatação de data/hora diferente CURRENT_TIMESTAMP O Cloud SQL para PostgreSQL retorna um formato de data e hora diferente do Oracle. A formatação da data precisa corresponder ao formato de data e hora original:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 2019-01-31 07:37:11.622187+00s
ADD_MONTHS Retorna a data mais os meses inteiros:

ADD_MONTHS(SYSDATE, 1)
= 31-JAN-19
Não N/A Para conseguir a mesma funcionalidade no Cloud SQL para PostgreSQL, use os operadores + / - e especifique o intervalo de tempo:

SELECT CURRENT_TIMESTAMP + INTERVAL '1 MONTH'
= 2019-01-31 07:37:11.622187+00s
EXTRACT
(parte da data)
Retorna o valor de um campo de data/hora especificado de uma expressão de data/hora ou intervalo:

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
Sim EXTRACT
(parte da data)
Equivalente do Oracle:

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
LAST_DAY Retorna a data do último dia do mês que contém a data especificada:

LAST_DAY('01-JAN-2019')
= 31-JAN-19
Não N/A Como solução alternativa, use DATE_TRUNC e um operador + para calcular o último dia do mês. Uma formatação de data precisa corresponder à formatação de data e hora original:

SELECT DATE_TRUNC('MONTH', DATE '01-JAN-2019') + INTERVAL '1 MONTH -1 DAY'
= 2019-01-31
MONTH_BETWEEN Retorna o número de meses entre as datas date1 e date2:

MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
= 1.96
Parcialmente
com
função em diferentes formatos de data e hora
AGE A função AGE do Cloud SQL para PostgreSQL retorna o intervalo entre dois carimbos de data/hora:

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

Para alcançar os mesmos valores da função MONTH_BETWEEN do Oracle, será necessária uma conversão mais específica.
TO_CHAR (data/hora) Converte um carimbo de data/hora ou de data em um tipo de dados para um valor do tipo de dados VARCHAR2
no formato especificado pelo formato de data:

TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS')
= 01-01-2019 10:01:01
Sim To_CHAR Equivalente do Oracle:

TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
01-01-2019 10:01:01
Funções de codificação e decodificação
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
DECODE Compara a expressão a cada valor de pesquisa, um a um, usando uma instrução IF-THEN-ELSE. Não CASE Use a instrução CASE do Cloud SQL para PostgreSQL para conseguir uma funcionalidade semelhante.
DUMP Retorna um valor VARCHAR2 contendo o código do tipo de dados, o comprimento em bytes e a representação interna da expressão. Não N/A Incompatível.
ORA_HASH Calcula um valor de hash para uma determinada expressão. Não MD5 / SHA224 / SHA256 / SHA385 / SHA512 Use a função MD5 do Cloud SQL para PostgreSQL para a soma de verificação de 128 bits ou a função SHA para a soma de verificação de 160 bits
para gerar valores de hash.
Funções de conversão
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
CAST Converte um tipo de dados integrado ou um valor tipado por coleção em outro tipo de dados integrado ou valor tipado por coleção:

CAST('1' as int) + 1
= 2
Parcialmente CAST A função CAST do Cloud SQL for PostgreSQL function é semelhante à funcionalidade CAST do Oracle, mas em determinados casos ela pode precisar ser ajustada, por causa de diferenças no tipo de dados entre os dois bancos de dados:

CAST('1' as int) + 1
= 2
CONVERT Converte uma string de caracteres de um conjunto de caracteres em outro:

CONVERT ( 'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
Parcialmente CONVERT A função CONVERT do Cloud SQL para PostgreSQL retorna um valor bytea, que é uma string binária em vez de VARCHAR ou TEXT. Os conjuntos de caracteres compatíveis com o PostgreSQL também são diferentes do Oracle.

CONVERT('Ä Ê Í Õ Ø A B C D E', 'UTF8', 'LATIN1')
= [Binary representation of the string in LATIN1 encoding]
TO_CHAR
(string/numérico)
A função converte um número ou uma data em uma string:

TO_CHAR(22.73,'$99.9')
= $22.7
Parcialmente TO_CHAR A função TO_CHAR do Cloud SQL para PostgreSQL é uma funcionalidade semelhante à da Oracle. O Cloud SQL para PostgreSQL é compatível com uma lista de strings de formatação um pouco diferente. Por padrão, o Cloud SQL para PostgreSQL reserva uma coluna para o sinal. Portanto, haverá um espaço antes dos números positivos. Isso pode ser suprimido usando o prefixo FM:

TO_CHAR(22.73,'FM$99.9')
= $22.7
TO_DATE A função TO_DATE do Oracle converte uma string em uma data pelo formato de data/hora específico da origem:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 01-JAN-2019
Parcialmente TO_DATE A função TO_DATE do Cloud SQL para PostgreSQL é uma funcionalidade semelhante à da Oracle. O Cloud SQL para PostgreSQL é compatível com uma lista de strings de formatação um pouco diferente:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 2019-01-01
TO_NUMBER Converte a expressão em um valor de um tipo de dados NUMBER:

TO_NUMBER('01234')
= 1234
Parcialmente TO_NUMBER A função TO_NUMBER do Cloud SQL para PostgreSQL requer uma string de formatação como entrada, mas é opcional no Oracle:

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

Uma alternativa é usar a função CAST para conversões que não exigem strings de formatação complexas:

CAST('01234' AS NUMERIC)
= 1234
Funções SELECT condicionais
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
CASE A instrução CASE escolhe uma sequência de condições e executa
uma instrução correspondente com a seguinte sintaxe:

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Sim CASE Equivalente do Oracle:

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Funções nulas
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
COALESCE Retorna a primeira expressão não nula na lista de expressões:

COALESCE(null, '1', 'a')
= a
Sim COALESCE Equivalente do Oracle:

COALESCE(null, '1', 'a')
= 1
NULLIF Compare expr1 e expr2. Se forem iguais, a função retornará nulo. Se não forem iguais, a função retornará expr1:

NULLIF('1', '2')
= 1
Sim NULLIF Equivalente do Oracle:

NULLIF('1', '2')
= 1
NVL Substitua nulo (retornado em branco) por uma string nos resultados de uma consulta:

NVL(null, 'a')
= a
Não COALESCE Como alternativa, use a função COALESCE:

COALESCE(null, 'a')
= a
NVL2 Determine o valor retornado por uma consulta com base no fato de uma expressão especificada ser nula ou não.
Não COALESCE Como alternativa, use a função COALESCE:

COALESCE(null, 1, 'a')
= 1
Ambiente e funções de identificador
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
SYS_GUID Gera e retorna um identificador globalmente exclusivo (valor RAW) composto
por 16 bytes:

SELECT SYS_GUID() FROM DUAL
= 8EFA4A31468B4C6DE05011AC0200009E
Parcialmente com um nome e formato de função diferente UUID_GENERATE_V4 O CloudSQL para Cloud SQL para PostgreSQL é compatível comuuid-ossp que fornece uma lista de funções de geração de UUID, comoUUID_GENERATE_V4:

SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2
UID Retorna um número inteiro que identifica exclusivamente o usuário da sessão (o usuário
que fez login):

SELECT UID FROM DUAL
= 43
Não N/A N/A
USER Retorna o nome do usuário atual da sessão:

SELECT USER FROM DUAL
= UserName
Sim USER Equivalente do Oracle:

SELECT USER;
= postgres
USERENV Retorna informações sobre a sessão de usuário atual com a configuração de parâmetro atual:

SELECT USERENV('LANGUAGE') FROM DUAL
= ENGLISH_AMERICA.AL32UTF8
Não N/A Embora não exista uma função USERENV equivalente no Cloud SQL para PostgreSQL, parâmetros individuais, como USERENV('SID'), podem ser recuperados usando funções de informação do sistema, como PG_BACKGROUND_PID().
ROWID O servidor Oracle atribui a cada linha em cada tabela um ROWID exclusivo para identificar a linha na tabela. O ROWID é o endereço da linha que contém o número do objeto de dados, o bloco de dados da linha, a posição da linha e o arquivo de dados. Parcialmente com nome de função diferente ctid ctid no Cloud SQL para PostgreSQL identifica o local físico da versão da linha na tabela dele, que é semelhante à ROWID do Oracle.
ROWNUM Retorna um número que representa a ordem em que uma linha é selecionada pelo Oracle em uma tabela ou em tabelas mescladas. Não LIMIT or ROW_NUMBER() Em vez de limitar o número de resultados retornados por consultas usando ROWNUM, o Cloud SQL para PostgreSQL é compatível com LIMIT e OFFSET para fins semelhantes.

A função window ROW_NUMBER() pode ser uma substituição alternativa para a ROWNUM do Oracle para outros cenários. No entanto, a ordem dos resultados e os deltas de desempenho precisam ser considerados antes de serem usados como substituição.
Funções de agregação (grupo)
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
AVG Retorna o valor médio de uma coluna ou expressão Sim AVG Equivalente do Oracle
COUNT Retorna o número de linhas retornadas por uma consulta. Sim COUNT Equivalente do Oracle
COUNT (DISTINCT) Retorna o número de valores exclusivos na coluna ou expressão. Sim COUNT
(DISTINCT)
Equivalente do Oracle
MAX Retorna o valor máximo de uma coluna ou expressão. Sim MAX Equivalente do Oracle
MIN Retorna o valor mínimo de uma coluna ou expressão. Sim MIN Equivalente do Oracle
SUM Retorna a soma dos valores da coluna ou expressão. Sim SUM Equivalente do Oracle
LISTAGG Exibe os dados em cada grupo por uma única linha especificada na cláusula ORDER BY, concatenando os valores da coluna de medida:

SELECT LISTAGG(
DEPARTMENT_NAME, ', ')
WITHIN GROUP
(ORDER BY DEPARTMENT_NAME) DEPT
FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
Não STRING_AGG Use a função STRING_AGG do Cloud SQL para PostgreSQL para retornar resultados semelhantes como Oracle, e as diferenças de sintaxe com certos casos são:

SELECT STRING_AGG(DEPARTMENT_NAME, ', ' order by DEPARTMENT_NAME) FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
Busca do Oracle 12c
Função Oracle Especificação ou implementação da função do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da função do Cloud SQL para PostgreSQL
FETCH Recupera linhas de dados do conjunto de resultados de uma consulta de várias linhas:

SELECT * FROM
EMPLOYEES
FETCH FIRST 10 ROWS ONLY;
Não LIMIT Use a cláusula LIMIT do Cloud SQL para PostgreSQL para recuperar apenas um conjunto específico de registros:

SELECT * FROM EMPLOYEES LIMIT 10;

Filtragem básica, operadores e subconsultas

Durante a conversão, a filtragem básica, as funções do operador e as subconsultas são relativamente simples, exigindo pouco ou nenhum esforço.

Notas de conversão

Examine e resolva os formatos de data, porque os formatos do Oracle e do Cloud SQL para PostgreSQL retornam resultados padrão diferentes:

  • A função SYSDATE do Oracle por padrão retorna 01-AUG-19.
  • Por padrão, a função CURRENT_DATE do PostgreSQL retorna 2019-08-01, sem hora do dia, mesmo com formatação. Para recuperar a data e hora atuais, use a função CURRENT_TIMESTAMP que, por padrão, retorna 2019-08-01 00:00:00.000000+00.
  • Os formatos de data e hora podem ser definidos usando as funções TO_CHAR do Cloud SQL para PostgreSQL.
Função ou subconsulta do Oracle Equivalente do Cloud SQL para PostgreSQL Função correspondente ou subconsulta do Cloud SQL para PostgreSQL Especificação ou implementação de função do Cloud SQL para PostgreSQL
EXISTS/ NOT EXISTS Sim EXISTS/ NOT EXISTS SELECT * FROM DEPARTMENTS D
WHERE EXISTS (SELECT 1
FROM EMPLOYEES E
WHERE
E.DEPARTMENT_ID =
D.DEPARTMENT_ID);
IN/NOT IN Sim 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 Sim LIKE/NOT LIKE SELECT * FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_e_n%';
BETWEEN/ NOT BETWEEN Sim BETWEEN/
NOT BETWEEN
SELECT * FROM EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
NOT BETWEEN 2001 and 2004;
AND/OR Sim AND/OR SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(100, 101)
AND (SALARY >= 1000 OR HIRE_DATE <= '2006-02-05');
SubQuery Sim SubQuery O Cloud SQL para PostgreSQL aceita subconsultas no nível SELECT, para instruções JOIN e para filtragem nas 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 Sim Operadores O Cloud SQL para PostgreSQL aceita todos os operadores básicos:

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

Funções analíticas (ou funções de janela e classificação)

As funções analíticas do Oracle ampliam a funcionalidade das operações SQL padrão ao fornecer recursos para calcular valores agregados em um grupo de linhas (por exemplo, RANK(), ROW_NUMBER(), FIRST_VALUE()). Essas funções são aplicadas a registros particionados logicamente dentro do escopo de uma única expressão de consulta. Elas são usadas com frequência em armazenamento de dados, em conjunto com relatórios de inteligência de negócios e análises.

Observações sobre a conversão

O Cloud SQL para PostgreSQL é compatível com muitas funções analíticas que são conhecidas no Postgres como funções de agregação e funções de janela. Se o aplicativo estiver usando uma função menos comum não compatível com o Postgres, será preciso procurar uma extensão compatível ou mover a lógica para a camada do aplicativo.

A tabela a seguir lista as funções analíticas mais comuns do Oracle.

Família de funções Funções relacionadas Compatível com o Cloud SQL para PostgreSQL
Análise e classificação RANK
AVERAGE_RANK
DENSE_RANK
ROW_NUMBER
PERCENT_RANK
CUME_DIST
NTILE
FIRST_VALUE
LAST_VALUE
OVER (PARTITION BY...)
Sim (exceto AVERAGE_RANK)
Hierárquica CONNECT BY
HIER_ANCESTOR
HIER_CHILD_COUNT
HIER_DEPTH
HIER_LEVEL
HIER_ORDER
HIER_PARENT
HIER_TOP
Não
Atraso LAG
LAG_VARIANCE LAG_VARIANCE_PERCENT LEAD
LEAD_VARIANCE LEAD_VARIANCE_PERCENT
Sim (somente LAG e LEAD)

Expressão de tabela comum (CTE)

Os CTEs fornecem uma maneira de implementar a lógica do código sequencial para reutilizar o código SQL que pode ser muito complexo ou não eficiente para uso múltiplo. Os CTEs podem ser nomeados e usados várias vezes em diferentes partes de uma instrução SQL usando a cláusula WITH. Os CTEs são compatíveis com o Oracle e o Cloud SQL para PostgreSQL.

Exemplos
Oracle e 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;

Instrução MERGE

A instrução MERGE (ou UPSERT) fornece um meio para especificar instruções SQL que executam condicionalmente operações DML em uma operação MERGE, em vez de uma única operação DML, executada separadamente. Ele seleciona registros da tabela de origem e, em seguida, especificando uma estrutura lógica, executa automaticamente várias operações DML na tabela de destino. Esse recurso ajuda a evitar o uso de várias inserções, atualizações ou exclusões. Observe que MERGE é uma instrução determinística, ou seja, depois que uma linha é processada pela instrução MERGE, ela não pode ser processada novamente usando a mesma instrução MERGE.

Observações sobre a conversão

O Cloud SQL para PostgreSQL não é compatível com a funcionalidade MERGE, ao contrário do Oracle. Para simular parcialmente a funcionalidade MERGE, o Cloud SQL para PostgreSQL fornece as instruções INSERT ... ON CONFLICT DO UPDATE:

  • INSERT… ON CONFLICT DO UPDATE: se uma linha inserida causar um erro de violação de restrição de exclusão ou violação única, a ação alternativa especificada na cláusula ON CONFLICT DO UPDATE será tomada. Por exemplo:
INSERT INTO tbl (a,b,c) VALUES (1,2,3)
  ON CONFLICT (a) DO UPDATE SET b = 2, c = 3;

Outra solução seria converter a funcionalidade MERGE em um procedimento armazenado para gerenciar operações DML, usando os comandos INSERT, UPDATE e DELETE com processamento de exceções e duplicações.

Dicas de instrução SQL

O Oracle oferece uma grande coleção de dicas de consulta SQL que permite aos usuários influenciar o comportamento do otimizador para produzir planos de execução de consulta mais eficientes. O Cloud SQL para PostgreSQL não oferece um mecanismo de dica instrução e instruções de SQL comparável. para influenciar o otimizador.

Para influenciar os planos de consulta escolhidos pelo planejador de consultas, o Cloud SQL para PostgreSQL fornece um conjunto de parâmetros de configuração que podem ser aplicados no nível da sessão. Os efeitos destes parâmetros de configuração variam desde a ativação/desativação de um determinado método de acesso até o ajuste das constantes de custo do planejador. Por exemplo, a instrução a seguir desativa o uso de planos de verificação sequenciais do Planejador de consultas, como verificações completas de tabelas:

SET ENABLE_SEQSCAN=FALSE;

Para ajustar a estimativa de custo do planejador de uma busca de página de disco aleatória (o padrão é 4.0), use a seguinte instrução:

SET RANDOM_PAGE_COST=2.0;

Reduzir esse valor faz com que o Cloud SQL para PostgreSQL prefira verificações de índice. Aumentá-lo faz o oposto.

Observações sobre a conversão

Como há diferenças fundamentais entre os otimizadores Oracle e Cloud SQL para PostgreSQL, e o fato de o Cloud SQL for PostgreSQL não ser compatível com dicas de consulta SQL no estilo Oracle, recomendamos remover todas as dicas de consulta durante a migração para o Cloud SQL para PostgreSQL. Em seguida, realize testes de desempenho rigorosos por meio das ferramentas do Cloud SQL para PostgreSQL, examine as consultas usando planos de execução e ajuste os parâmetros da instância ou da sessão de acordo com o caso de uso.

Planos de execução

O principal objetivo dos planos de execução é fornecer uma visão interna das escolhas feitas pelo otimizador de consultas para acessar dados do banco de dados. O otimizador de consultas gera planos de execução para instruções SELECT, INSERT, UPDATE e DELETE para usuários de banco de dados, permitindo que os administradores tenham uma visão melhor de consultas específicas e operações DML. Eles são especialmente úteis quando você precisa ajustar o desempenho das consultas, por exemplo, para determinar o desempenho do índice ou para determinar se há índices que precisam ser criados.

Os planos de execução podem ser afetados por volumes de dados, estatísticas de dados e parâmetros de instância (parâmetros globais ou de sessão).

Considerações sobre conversão

Os planos de execução não são objetos de banco de dados que precisam ser migrados. Em vez disso, eles são uma ferramenta para analisar as diferenças de desempenho entre o Oracle e o Cloud SQL para PostgreSQL, executando a mesma instrução em conjuntos de dados idênticos.

O Cloud SQL para PostgreSQL não é compatível com a mesma sintaxe, funcionalidade ou saída do plano de execução do Oracle.

Veja um exemplo de plano de execução:

Plano de execução do Oracle Plano de execução do 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)

Procedimentos, funções e gatilhos armazenados

PL/SQL é a linguagem de procedimentos estendida da Oracle para criar, armazenar e aplicar soluções baseadas em código dentro do banco de dados. Em geral, as funções e os procedimentos armazenados no banco de dados consistem em linguagem procedural estendida ANSI SQL e SQL. Por exemplo, PL/SQL para Oracle e linguagem procedural do MySQL para MySQL. PL/pgSQL é para a própria linguagem procedural estendida do PostgreSQL.

O objetivo desses procedimentos e funções armazenados é fornecer soluções para requisitos mais adequados para execução no banco de dados e não no aplicativo (por exemplo, desempenho, compatibilidade e segurança). Ainda que os procedimentos e as funções armazenados usem PL/SQL, os procedimentos armazenados são usados principalmente para executar operações DDL/DML, e as funções são usadas principalmente para executar cálculos e retornar resultados específicos.

PL/SQL para PL/pgSQL

Da perspectiva de migração do Oracle PL/SQL para Cloud SQL para PostgreSQL, PL/pgSQL é semelhante ao Oracle PL/SQL em termos de estrutura e sintaxe. No entanto, existem algumas diferenças significativas que precisam de uma migração de código. Por exemplo, os tipos de dados são diferentes entre o Oracle e o Cloud SQL para PostgreSQL, e uma tradução costuma ser necessária para garantir que o código migrado use os nomes de tipo de dados correspondentes compatíveis com o Cloud SQL para PostgreSQL. Para ver uma discussão detalhada sobre as diferenças entre as duas linguagens, consulte Portabilidade do Oracle PL/SQL.

Privilégios e segurança do objeto de código

No Oracle, para criar um procedimento ou função armazenada, o usuário precisa ter o privilégio de sistema CREATE PROCEDURE (para criar procedimentos ou funções em outros usuários diferentes, os usuários do banco de dados precisam ter o privilégio CREATE ANY PROCEDURE). Para executar um procedimento armazenado ou uma função, os usuários do banco de dados precisam ter o privilégio EXECUTE.

No PostgreSQL, para criar um procedimento de código ou uma função, o usuário precisa ter o privilégio USAGE. Para executar um procedimento ou uma função, o usuário precisa ter o privilégio EXECUTE no procedimento ou função.

Por padrão, um procedimento ou uma função PL/pgSQL é definido como SECURITY INVOKER, o que significa que o procedimento ou a função deve ser executada com os privilégios do usuário que a chama. Como alternativa, SECURITY DEFINER pode ser especificado para que a função seja executada com os privilégios do usuário a que ela pertence.

Sintaxe da função e do procedimento armazenado do Cloud SQL para PostgreSQL

O exemplo a seguir mostra a sintaxe do procedimento e da função armazenados no 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'
  } ...

Gatilhos

Um gatilho é um procedimento armazenado que é acionado quando um evento específico ocorre. No Oracle, o evento de acionamento está associado a uma tabela, visualização, esquema ou banco de dados. Os tipos de evento de acionamento incluem:

  • Declarações de linguagem de manipulação de dados (DML, na sigla em inglês), por exemplo, INSERT, UPDATE, DELETE)
  • Instruções da linguagem de definição de dados (DDL, na sigla em inglês), por exemplo, CREATE, ALTER, DROP
  • Eventos de banco de dados (por exemplo, LOGON, STARTUP, SHUTDOWN)

Os gatilhos do Oracle podem ser dos seguintes tipos:

  • Gatilho simples: acionado exatamente uma vez, antes ou depois do evento de acionamento especificado
  • Gatilho composto: disparado em vários eventos
  • Gatilho INSTEAD OF: um tipo especial de gatilho DML para fornecer um mecanismo de atualização transparente para visualizações complexas e não editáveis
  • Gatilho do sistema: disparado em eventos específicos do banco de dados

No Cloud SQL para PostgreSQL, um gatilho é acionado antes ou após uma operação DML em uma tabela, visualização ou tabela externa específica. O gatilho INSTEAD OF é compatível com um mecanismo de atualização para visualizações. Um gatilho nas operações de DDL é chamado de gatilho de evento. O Cloud SQL para PostgreSQL não é compatível com os gatilhos de sistema da Oracle com base em eventos de banco de dados.

Ao contrário dos gatilhos da Oracle, os gatilhos do Cloud SQL para PostgreSQL não são compatíveis com o uso de um bloco PL/pgSQL anônimo como corpo do gatilho. Uma função nomeada que usa zero ou mais argumentos e retorna um gatilho de tipo precisa ser fornecida na declaração do gatilho. Essa função é executada quando o gatilho é disparado.

Sintaxe do acionador do evento e do Cloud SQL para PostgreSQL

O exemplo a seguir mostra a sintaxe do gatilho e do gatilho de eventos do 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 pode ser um dos seguintes: 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 pode ser um dos seguintes: ddl_command_start, ddl_command_end, table_rewrite, sql_drop

filter_value só pode ser: TAG

filter_value pode ser uma das tags de comando compatíveis.

A seguir