Migrar utilizadores do Oracle® para o Cloud SQL para PostgreSQL: consultas, procedimentos armazenados, funções e acionadores

Este documento faz parte de uma série que fornece informações e orientações importantes relacionadas com o planeamento e a execução de migrações de bases 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 suportam a norma ANSI SQL. Por isso, geralmente, é simples migrar declarações SQL usando apenas elementos de sintaxe básicos (por exemplo, não especificar funções escalares nem qualquer outra funcionalidade expandida do Oracle). A secção seguinte aborda os elementos de consulta Oracle comuns e os respetivos equivalentes no Cloud SQL para PostgreSQL.

Sintaxe básica SELECT e FROM

Nome da funcionalidade ou nome da sintaxe da Oracle Vista geral ou implementação da Oracle Suporte do Cloud SQL para PostgreSQL Solução correspondente ou alternativa do Cloud SQL para PostgreSQL
Sintaxe básica de SQL para obtençã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
Alias de colunas SELECT COL1 AS C1 Sim SELECT COL1 AS C1
OR
SELECT COL1 C1
Sensibilidade a maiúsculas e minúsculas do nome da tabela Sem sensibilidade a maiúsculas e minúsculas
(por exemplo, o nome da tabela pode ser orders e/ou ORDERS).
Sim Os nomes não são sensíveis a maiúsculas e minúsculas, a menos que estejam entre aspas (por exemplo, orders e ORDERS são tratados como iguais, enquanto "orders" e "ORDERS" são tratados de forma diferente)

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

Visualizações inline

  • As vistas em linha (também conhecidas como tabelas derivadas) são declarações SELECT localizadas na cláusula FROM e usadas como subconsultas.
  • As vistas inline podem ajudar a simplificar consultas complexas removendo cálculos compostos ou eliminando operações de junção, ao mesmo tempo que condensam várias consultas separadas numa única consulta simplificada.
  • Nota de conversão: as vistas incorporadas do Oracle não requerem a utilização de alias, enquanto o Cloud SQL para PostgreSQL requer alias específicos para cada vista incorporada.

A tabela seguinte apresenta um exemplo de conversão do Oracle para o Cloud SQL para PostgreSQL, como uma vista inline.

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 é semelhante ao seguinte:

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 vista inline:

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.

Adicionar um alias à vista inline:

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

O resultado é semelhante ao seguinte:

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

Declarações JOIN

As declarações JOINOracle são suportadas pelas declarações JOIN do Cloud SQL para PostgreSQL. No entanto, a utilização do operador de junção Oracle (+) não é suportada pelo Cloud SQL para PostgreSQL. Para alcançar o mesmo resultado, tem de fazer a conversão para a sintaxe SQL padrão para junções externas.

A tabela seguinte apresenta um exemplo de conversão de JOIN.

Tipo de JOIN da Oracle Suportado pelo 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 suporta os operadores Oracle UNION, UNION ALL e INTERSECT. O operador MINUS não é suportado. 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 suporta os operadores INTERSECT ALL e EXCEPT ALL, que não são suportados pelo Oracle.

  • UNION: anexa os conjuntos de resultados de duas ou mais declarações SELECT e elimina os registos duplicados.
  • UNION ALL: anexa os conjuntos de resultados de duas ou mais declarações SELECT sem eliminar registos duplicados.
  • INTERSECT: devolve a interseção de duas ou mais declarações SELECT apenas se existir um registo em ambos os conjuntos de dados. Os registos duplicados não são eliminados.
  • INTERSECT ALL (Apenas para o Cloud SQL para PostgreSQL): devolve a interseção de duas ou mais declarações SELECT apenas se existir um registo em ambos os conjuntos de dados.
  • MINUS (EXCEPT no Cloud SQL para PostgreSQL): compara duas ou mais declarações SELECT, devolvendo apenas linhas distintas da primeira consulta que não são devolvidas pelas outras declarações.
  • EXCEPT ALL (apenas para o Cloud SQL para PostgreSQL): compara duas ou mais declarações SELECT, devolvendo apenas linhas da primeira consulta que não são devolvidas pelas outras declarações sem eliminar registos duplicados.

Notas de conversão

Quando converter operadores Oracle MINUS em operadores do Cloud SQL for PostgreSQL, use operadores EXCEPT.

Exemplos

Função Oracle Implementação da Oracle Suporte do Cloud SQL para PostgreSQL Solução correspondente ou alternativa 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 (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 oferece uma extensa lista de funções escalares (de linha única) e de agregação. Algumas funções do Cloud SQL para PostgreSQL são semelhantes às respetivas equivalentes da Oracle (por nome e funcionalidade, ou com um nome diferente, mas com uma funcionalidade semelhante). Embora as funções do Cloud SQL para PostgreSQL possam ter nomes idênticos aos das suas contrapartes do Oracle, por vezes, apresentam uma funcionalidade diferente.

As tabelas seguintes descrevem onde o Oracle e o Cloud SQL para PostgreSQL são equivalentes por nome e funcionalidade (especificado por "Sim") e onde se recomenda uma conversão (todos os casos que não sejam "Sim").

Funções de carateres
Função Oracle Especificação ou implementação da função 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 Devolve str1 concatenado com str2:

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

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

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

LOWER('SQL') = sql
LPAD/RPAD Devolve expr1, com preenchimento à esquerda ou à direita até ao comprimento de n carateres com a sequência de carateres em expr2:

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

LPAD('A',3,'*') = **A
SUBSTR Devolve uma parte de char, começando na posição do caráter, com um comprimento de substring-
carateres:

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 é fornecido um número negativo como posição inicial no Oracle, é realizada uma operação de substring a partir do final da string, o que é diferente do Cloud SQL para PostgreSQL. Use a função RIGHT como substituição se quiser o comportamento da Oracle.
INSTR Devolve a posição (índice) de uma string específica a partir de uma string determinada:

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 o Oracle pode ser implementada usando PL/pgSQL.
REPLACE Devolve char com todas as ocorrências de uma string de pesquisa substituídas 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, a Oracle remove todas as ocorrências das strings de pesquisa. O mesmo comportamento pode ser alcançado no Cloud SQL para PostgreSQL fornecendo uma string vazia como a string de substituição.

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
TRIM Remova carateres à esquerda ou à direita (ou ambos) de uma string:

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

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
LTRIM/RTRIM Remove do início ou do fim da string todos os carateres que
aparecem na pesquisa:

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

LTRIM(' PostgreSQL', ' ') = PostgreSQL
ASCII Devolve a representação decimal no conjunto de carateres da base de dados do primeiro caráter de char:

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

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

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

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

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

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

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

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
REGEXP_SUBSTR Expande a funcionalidade da função SUBSTR pesquisando um padrão de expressão regular numa 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 alcançar funcionalidades semelhantes.
REGEXP_COUNT Devolve o número de vezes que um padrão ocorre numa string de origem. Não N/A Use o REGEXP_MATCH do PostgreSQL para alcançar funcionalidades semelhantes.
REGEXP_INSTR Pesquisa uma posição (índice) de string para um padrão de expressão
regular.
Não N/A Converter a funcionalidade para a camada de aplicação.
REVERSE Devolve uma string invertida.

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

REVERSE('PostgreSQL') = LQSergtsoP
Funções numéricas
Função Oracle Especificação ou implementação da função 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 a Oracle:

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

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

CEIL(21.4) = 22
FLOOR Devolve o maior número inteiro igual ou inferior a n:

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

FLOOR(-23.7) = -24
MOD Devolve o resto da divisão de m por n:

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

MOD(10, 3) = 1
ROUND Devolve n arredondado para casas inteiras à direita da vírgula decimal:

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

ROUND(1.39, 1) = 1.4
TRUNC
(number)
Devolve n1 truncado para n2 casas decimais:

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

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
Funções DateTime
Função Oracle Especificação ou implementação da função 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 Devolve a data e a hora atuais definidas para o sistema operativo no qual o servidor de base de dados reside:

SELECT SYSDATE FROM DUAL
= 31-JUL-2019
Parcialmente com um nome de função e uma formatação diferentes CURRENT_TIMESTAMP A função CURRENT_TIMESTAMP vai devolver um formato de data/hora diferente da função SYSDATE do Oracle:

SELECT CURRENT_TIMESTAMP
= 2019-07-31 06:46:40.171477+00
SYSTIMESTAMP Devolve a data do sistema, incluindo frações de segundos e o fuso horário:

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

SELECT CURRENT_TIMESTAMP
= 2019-01-31 07:37:11.622187+00
LOCAL TIMESTAMP Devolve a data e hora atuais no fuso horário da sessão num 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 devolve um formato de data/hora diferente do Oracle. A formatação de datas tem de corresponder ao formato de data/hora original:

SELECT LOCALTIMESTAMP
= 2019-01-31 07:37:11.622187+00
CURRENT_DATE Devolve 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 devolve um formato de data/hora diferente do Oracle. A formatação da data tem de corresponder ao formato de data/hora original:

SELECT CURRENT_DATE
= 2019-01-31
CURRENT_TIMESTAMP Devolve a data e 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 uma formatação de data/hora diferente CURRENT_TIMESTAMP O Cloud SQL para PostgreSQL devolve um formato de data/hora diferente do Oracle. A formatação de datas tem de corresponder ao formato de data/hora original:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 2019-01-31 07:37:11.622187+00s
ADD_MONTHS Devolve a data mais o número inteiro de meses:

ADD_MONTHS(SYSDATE, 1)
= 31-JAN-19
Não N/A Para alcançar 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)
Devolve o valor de um campo de data/hora especificado de uma expressão de data/hora ou de intervalo:

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

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
LAST_DAY Devolve 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. É necessária uma formatação de data para corresponder à formatação de data/hora original:

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

MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
= 1.96
Parcialmente
com
Função de formatação de data/hora diferente
AGE A função AGE do Cloud SQL para PostgreSQL devolve o intervalo entre duas datas/horas:

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

Para alcançar os mesmos valores que a função MONTH_BETWEEN do Oracle, é necessária uma conversão mais específica.
TO_CHAR (data/hora) Converte um valor de data/hora ou indicação de tempo no 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 a Oracle:

TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
01-01-2019 10:01:01
Funções de codificação e descodificação
Função Oracle Especificação ou implementação da função 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 com cada valor de pesquisa um a um através de uma declaração IF-THEN-ELSE. Não CASE Use a declaração CASE do Cloud SQL para PostgreSQL para alcançar uma funcionalidade semelhante.
DUMP Devolve um valor VARCHAR2 que contém o código do tipo de dados, o comprimento em bytes e a representação interna da expressão. Não N/A Não suportado.
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 uma soma de verificação de 128 bits ou a função SHA para uma soma de verificação de 160 bits
para gerar valores hash.
Funções de conversão
Função Oracle Especificação ou implementação da função 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 incorporado ou um valor de tipo de coleção noutro tipo de dados incorporado ou valor de tipo de coleção:

CAST('1' as int) + 1
= 2
Parcialmente CAST A função CAST do Cloud SQL para PostgreSQL é semelhante à funcionalidade CAST da Oracle, mas, em determinados casos, tem de ser ajustada devido às diferenças de tipo de dados entre as duas bases de dados:

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

CONVERT ( 'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
Parcialmente CONVERT A função CONVERT do Cloud SQL para PostgreSQL devolve um valor bytea, que é uma string binária em vez de VARCHAR ou TEXT. Os conjuntos de carateres suportados pelo PostgreSQL também são diferentes dos 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 numa 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 à do Oracle. O Cloud SQL para PostgreSQL suporta uma lista ligeiramente diferente de strings de formatação. Por predefinição, o Cloud SQL para PostgreSQL reserva uma coluna para o sinal, pelo que existe um espaço antes dos números positivos. Pode suprimir esta mensagem 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 numa data através do 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 à do Oracle. O Cloud SQL para PostgreSQL suporta uma lista ligeiramente diferente de strings de formatação:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 2019-01-01
TO_NUMBER Converte a expressão num 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, enquanto que é opcional no Oracle:

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

Uma alternativa é usar a função CAST para conversões que não requerem 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 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 declaração CASE escolhe a partir de uma sequência de condições e executa uma declaração correspondente com a seguinte sintaxe:

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

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Funções nulas
Função Oracle Especificação ou implementação da função 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 Devolve a primeira expressão não nula na lista de expressões:

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

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

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

NULLIF('1', '2')
= 1
NVL Substitua o valor nulo (devolvido como um espaço em branco) por uma string nos resultados de uma consulta:

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

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

COALESCE(null, 1, 'a')
= 1
Funções de ambiente e identificadores
Função Oracle Especificação ou implementação da função 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 devolve um identificador único global (valor RAW) composto
por 16 bytes:

SELECT SYS_GUID() FROM DUAL
= 8EFA4A31468B4C6DE05011AC0200009E
Parcialmente com um nome e um formato de função diferentes UUID_GENERATE_V4 O Cloud SQL para PostgreSQL suporta a extensão uuid-ossp, que fornece uma lista de funções de geração de UUID, como UUID_GENERATE_V4:

SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2
UID Devolve um número inteiro que identifica exclusivamente o utilizador da sessão (o utilizador que iniciou sessão):


SELECT UID FROM DUAL
= 43
Não N/A N/A
USER Devolve o nome de utilizador da sessão atual:

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

SELECT USER;
= postgres
USERENV Devolve informações sobre a sessão do utilizador atual com a configuração de parâmetros 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, os parâmetros individuais, como USERENV('SID'), podem ser obtidos através de funções de informações do sistema, como PG_BACKGROUND_PID().
ROWID O servidor Oracle atribui a cada linha de cada tabela um número único ROWID para identificar a linha na tabela. O ROWID é a morada 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 ficheiro de dados. Parcialmente com um nome de função diferente ctid ctid no Cloud SQL para PostgreSQL identifica a localização física da versão da linha na respetiva tabela, que é semelhante a ROWID do Oracle.
ROWNUM Devolve um número que representa a ordem pela qual uma linha é selecionada pelo Oracle a partir de uma tabela ou de tabelas unidas. Não LIMIT or ROW_NUMBER() Em vez de limitar o número de resultados devolvidos por consultas com ROWNUM, o Cloud SQL for PostgreSQL suporta LIMIT e OFFSET para fins semelhantes.A
função window pode ser uma solução alternativa para a função ROWNUM da Oracle noutros cenários.
ROW_NUMBER() No entanto, a ordenação dos resultados e as diferenças de desempenho têm de ser consideradas antes de a usar como substituição.
Funções de agregação (grupo)
Função Oracle Especificação ou implementação da função 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 Devolve o valor médio da coluna ou da expressão. Sim AVG Equivalente a Oracle
COUNT Devolve o número de linhas devolvidas por uma consulta. Sim COUNT Equivalente a Oracle
COUNT (DISTINCT) Devolve o número de valores únicos na coluna ou expressão. Sim COUNT
(DISTINCT)
Equivalente a Oracle
MAX Devolve o valor máximo da coluna ou da expressão. Sim MAX Equivalente a Oracle
MIN Devolve o valor mínimo da coluna ou da expressão. Sim MIN Equivalente a Oracle
SUM Devolve a soma dos valores da coluna ou da expressão. Sim SUM Equivalente a Oracle
LISTAGG Apresenta os dados em cada grupo por uma única linha especificada na cláusula ORDER BY, concatenando os valores da coluna de métricas:

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 devolver resultados semelhantes aos do Oracle, exceto nas diferenças de sintaxe em determinados casos:

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

-- Single line results
= Accounting, Administration, Benefits, Construction
Oracle 12c Fetch
Função Oracle Especificação ou implementação da função 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 Obtém 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 obter apenas um conjunto específico de registos:

SELECT * FROM EMPLOYEES LIMIT 10;

Filtragem básica, operadores e subconsultas

Durante a conversão, a filtragem básica, as funções de operador e as subconsultas são relativamente simples e requerem um esforço mínimo ou nenhum esforço adicional.

Notas de conversão

Examine e resolva os formatos de data, porque os formatos do Oracle e do Cloud SQL for PostgreSQL devolvem resultados predefinidos diferentes:

  • Por predefinição, a função SYSDATEOracle01-AUG-19 devolve 01-AUG-19.
  • Por predefinição, a função CURRENT_DATE do PostgreSQL devolve 2019-08-01 (sem hora do dia, mesmo com formatação). Para obter a data e a hora atuais, use a função CURRENT_TIMESTAMP, que, por predefinição, devolve 2019-08-01 00:00:00.000000+00.
  • Os formatos de data e hora podem ser definidos através das funções do Cloud SQL para PostgreSQL TO_CHAR.
Função ou subconsulta Oracle Equivalente do Cloud SQL para PostgreSQL Função ou subconsulta correspondente do Cloud SQL para PostgreSQL Especificação ou implementação da 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 suporta subconsultas no nível SELECT, para declaraçõ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 suporta todos os operadores básicos:

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

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

As funções analíticas da Oracle expandem a funcionalidade das operações SQL padrão fornecendo capacidades para calcular valores agregados num grupo de linhas (por exemplo, RANK(), ROW_NUMBER(), FIRST_VALUE()). Estas funções são aplicadas a registos logicamente divididos no âmbito de uma única expressão de consulta. São usados frequentemente no armazenamento de dados, juntamente com relatórios de inteligência empresarial e estatísticas.

Notas de conversão

O Cloud SQL para PostgreSQL suporta muitas funções analíticas. Estas são conhecidas no Postgres como funções de agregação e funções de janela. Se a sua aplicação estiver a usar uma função menos comum não suportada no Postgres, tem de procurar uma extensão suportada ou mover a lógica para a camada de aplicação.

A tabela seguinte apresenta as funções analíticas mais comuns da Oracle.

Família de funções Funções relacionadas Suportado pelo 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 (apenas LAG e LEAD)

Expressão de tabela comum (CTE)

As CTEs oferecem uma forma de implementar a lógica de código sequencial para reutilizar código SQL que pode ser demasiado complexo ou não eficiente para utilização múltipla. As CTEs podem ser nomeadas e, em seguida, usadas várias vezes em diferentes partes de uma declaração SQL através da cláusula WITH. As CTEs são suportadas pelo Oracle e pelo 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 declaração MERGE (ou UPSERT) oferece um meio de especificar declarações SQL únicas que realizam condicionalmente operações DML numa operação MERGE, em oposição a uma única operação DML, executada separadamente. Seleciona registos da tabela de origem e, em seguida, especificando uma estrutura lógica, executa automaticamente várias operações DML na tabela de destino. Esta funcionalidade ajuda a evitar a utilização de várias inserções, atualizações ou eliminações. Tenha em atenção que MERGE é uma declaração determinística, o que significa que, depois de uma linha ser processada pela declaração MERGE, não pode ser processada novamente com a mesma declaração MERGE.

Notas de conversão

O Cloud SQL para PostgreSQL não suporta a funcionalidade MERGE, ao contrário do Oracle. Para simular parcialmente a funcionalidade MERGE, o Cloud SQL para PostgreSQL fornece as declaraçõ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 de violação único, é realizada a ação alternativa especificada na cláusula ON CONFLICT DO UPDATE, 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 num procedimento armazenado para gerir operações DML, usando comandos INSERT, UPDATE e DELETE com processamento de exceções e duplicações.

Instruções de declarações SQL

A Oracle oferece uma grande coleção de sugestões de consultas SQL que permitem aos utilizadores influenciar o comportamento do otimizador, com o objetivo de produzir planos de execução de consultas mais eficientes. O Cloud SQL para PostgreSQL não oferece um mecanismo de sugestões comparável ao nível da declaração SQL para influenciar o otimizador.

Para influenciar os planos de consulta escolhidos pelo planeador de consultas, o Cloud SQL para PostgreSQL fornece um conjunto de parâmetros de configuração que podem ser aplicados ao 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é ao ajuste das constantes de custos do planeador. Por exemplo, a seguinte declaração desativa a utilização de tipos de planos de análise sequencial, como análises completas de tabelas, pelo planeador de consultas:

SET ENABLE_SEQSCAN=FALSE;

Para ajustar a estimativa de custo do planeador de uma obtenção de página de disco aleatória (a predefinição é 4,0), use a seguinte declaração:

SET RANDOM_PAGE_COST=2.0;

A redução deste valor faz com que o Cloud SQL para PostgreSQL prefira as análises de índice. Aumentá-lo faz o oposto.

Notas de conversão

Como existem diferenças fundamentais entre os otimizadores do Oracle e do Cloud SQL para PostgreSQL, e o facto de o Cloud SQL para PostgreSQL não suportar sugestões de consultas SQL ao estilo do Oracle, recomendamos que remova todas as sugestões de consultas durante a migração para o Cloud SQL para PostgreSQL. Em seguida, faça testes de desempenho rigorosos através das ferramentas do Cloud SQL para PostgreSQL, examine as consultas com planos de execução e ajuste os parâmetros da instância ou da sessão de acordo com o exemplo de utilização.

Planos de execução

O objetivo principal dos planos de execução é fornecer uma análise detalhada das escolhas feitas pelo otimizador de consultas para aceder aos dados da base de dados. O otimizador de consultas gera planos de execução para declarações SELECT, INSERT, UPDATE e DELETE para utilizadores da base de dados, o que também permite aos administradores ter uma melhor vista das consultas específicas e das operações DML. São especialmente úteis quando precisa de ajustar o desempenho das consultas, por exemplo, para determinar o desempenho do índice ou para determinar se existem índices em falta que precisam de ser criados.

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

Considerações sobre as conversões

Os planos de execução não são objetos de base de dados que precisam de ser migrados. Em alternativa, são uma ferramenta para analisar as diferenças de desempenho entre o Oracle e o Cloud SQL para PostgreSQL que executam a mesma declaração em conjuntos de dados idênticos.

O Cloud SQL para PostgreSQL não suporta a mesma sintaxe, funcionalidade nem resultado do plano de execução que o Oracle.

Segue-se um exemplo de um plano de execução:

Plano de execução da 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 armazenados, funções e acionadores

O PL/SQL é a linguagem processual estendida da Oracle para criar, armazenar e aplicar soluções baseadas em código na base de dados. Em geral, os procedimentos e as funções armazenados na base de dados são elementos de código que consistem em ANSI SQL e linguagem processual SQL expandida, por exemplo, PL/SQL para Oracle e linguagem processual MySQL para MySQL. O PL/pgSQL destina-se à linguagem procedimental alargada do PostgreSQL.

O objetivo destes procedimentos e funções armazenados é fornecer soluções para requisitos mais adequados para execução a partir da base de dados e não da aplicação (por exemplo, desempenho, compatibilidade e segurança). Embora os procedimentos e as funções armazenados usem PL/SQL, os procedimentos armazenados são usados principalmente para realizar operações DDL/DML e as funções são usadas principalmente para realizar cálculos para devolver resultados específicos.

PL/SQL para PL/pgSQL

Do ponto de vista da migração do Oracle PL/SQL para o Cloud SQL para PostgreSQL, o PL/pgSQL é semelhante ao Oracle PL/SQL em termos de estrutura e sintaxe. No entanto, existem algumas diferenças principais que exigem 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 é frequentemente necessária uma tradução para garantir que o código migrado usa os nomes dos tipos de dados correspondentes suportados pelo Cloud SQL para PostgreSQL. Para uma discussão detalhada das diferenças entre os dois idiomas, consulte o artigo Transferir do Oracle PL/SQL.

Privilégios e segurança de objetos de código

No Oracle, para criar um procedimento ou uma função armazenada, o utilizador tem de ter o privilégio do sistema CREATE PROCEDURE (para criar procedimentos ou funções sob outros utilizadores diferentes, os utilizadores da base de dados têm de ter o privilégio CREATE ANY PROCEDURE). Para executar um procedimento armazenado ou uma função, os utilizadores da base de dados têm de ter o privilégio EXECUTE.

No PostgreSQL, para criar um procedimento de código ou uma função, o utilizador tem de ter o privilégio USAGE. Para executar um procedimento ou uma função, o utilizador tem de ter o privilégio EXECUTE no procedimento ou na função.

Por predefiniçã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 executado com os privilégios do utilizador que o chama. Em alternativa, pode especificar SECURITY DEFINER para que a função seja executada com os privilégios do utilizador que a detém.

Sintaxe de funções e procedimentos armazenados do Cloud SQL para PostgreSQL

O exemplo seguinte mostra a sintaxe do procedimento armazenado do Cloud SQL para PostgreSQL e da função:

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'
  } ...

Acionadores

Um acionador é um procedimento armazenado que é acionado quando ocorre um evento específico. No Oracle, o evento de acionamento está associado a uma tabela, uma vista, um esquema ou a base de dados. O tipo de eventos de acionamento inclui:

  • Declarações da linguagem de manipulação de dados (DML) (por exemplo, INSERT, UPDATE, DELETE)
  • Declarações de linguagem de definição de dados (LDD) (por exemplo, CREATE, ALTER, DROP)
  • Eventos de base de dados (por exemplo, LOGON, STARTUP, SHUTDOWN)

Os acionadores da Oracle podem ser dos seguintes tipos:

  • Acionador simples: acionado exatamente uma vez, antes ou depois do evento de acionamento especificado
  • Acionador composto: acionado em vários eventos
  • INSTEAD OF acionador: um tipo especial de acionador de DML para fornecer um mecanismo de atualização transparente para vistas complexas não editáveis
  • Acionador do sistema: acionado em eventos específicos da base de dados

No Cloud SQL para PostgreSQL, um acionador é acionado antes ou depois de uma operação DML numa tabela, vista ou tabela externa específica. O acionador INSTEAD OF é suportado para fornecer um mecanismo de atualização às visualizações. Um acionador em operações DDL é denominado acionador de eventos. O Cloud SQL para PostgreSQL não suporta acionadores do sistema da Oracle baseados em eventos da base de dados.

Ao contrário dos acionadores do Oracle, os acionadores do Cloud SQL para PostgreSQL não suportam a utilização de um bloco PL/pgSQL anónimo como o corpo do acionador. Tem de ser fornecida uma função com nome que receba zero ou mais argumentos e devolva um acionador de tipo na declaração do acionador. Esta função é executada quando o acionador é acionado.

Sintaxe de acionadores e acionadores de eventos do Cloud SQL para PostgreSQL

O exemplo seguinte mostra a sintaxe do trigger do Cloud SQL para PostgreSQL e do event trigger:

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 ou 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 etiquetas de comando suportadas.

O que se segue?