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:
- Migrar utilizadores do Oracle para o Cloud SQL para PostgreSQL: terminologia e funcionalidade
- Migrar utilizadores do Oracle para o Cloud SQL para PostgreSQL: tipos de dados, utilizadores e tabelas
- Migrar utilizadores da Oracle para o Cloud SQL para PostgreSQL: consultas, procedimentos armazenados, funções e acionadores (este documento)
- Migrar utilizadores do Oracle para o Cloud SQL para PostgreSQL: segurança, operações, monitorização e registo
- Migrar utilizadores e esquemas da base de dados Oracle para o Cloud SQL para PostgreSQL
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
|
Sim | SELECT
|
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
|
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 SELECT
Cloud 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áusulaFROM
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,
O resultado é semelhante ao seguinte:
FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
|
Sem alias para a vista inline: postgres=> SELECT FIRST_NAME,
Adicionar um alias à vista inline: postgres=> SELECT FIRST_NAME,
O resultado é semelhante ao seguinte:
first_name | department_id | salary | date_col
|
Declarações JOIN
As declarações JOIN
Oracle 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
|
CROSS JOIN
|
Sim | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
FULL JOIN
[ OUTER ]
|
Sim | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
LEFT JOIN [ OUTER ]
|
Sim | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
RIGHT JOIN
[ OUTER ]
|
Sim | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
SUBQUERY
|
Sim | SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
|
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çõesSELECT
e elimina os registos duplicados.UNION ALL
: anexa os conjuntos de resultados de duas ou mais declaraçõesSELECT
sem eliminar registos duplicados.INTERSECT
: devolve a interseção de duas ou mais declaraçõesSELECT
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çõesSELECT
apenas se existir um registo em ambos os conjuntos de dados.MINUS (EXCEPT
no Cloud SQL para PostgreSQL): compara duas ou mais declaraçõesSELECT
, 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çõesSELECT
, 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
|
Sim | SELECT COL1 FROM TBL1
|
UNION ALL
|
SELECT COL1 FROM TBL1
|
Sim | SELECT COL1 FROM TBL1
|
INTERSECT
|
SELECT COL1 FROM TBL1
|
Sim | SELECT COL1 FROM TBL1
|
MINUS
|
SELECT COL1 FROM TBL1
|
Sim (Convert MINUS a EXCEPT no PostgreSQL) |
SELECT COL1 FROM TBL1
|
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)
|
Parcialmente | SUBSTR
|
Equivalente ao Oracle quando a posição inicial é um número positivo.SUBSTR('PostgreSQL', 8, 3)
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')
|
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')
|
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')
|
TRIM
|
Remova carateres à esquerda ou à direita (ou ambos) de uma string:TRIM(both '-' FROM '-PostgreSQL-')
|
Sim | TRIM
|
Equivalente a Oracle:TRIM(both '-' FROM '-PostgreSQL-')
|
LTRIM/RTRIM
|
Remove do início ou do fim da string todos os carateres que aparecem na pesquisa: LTRIM(' 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}/?') |
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
|
Sim | TRUNCATE
(number) |
Equivalente a Oracle:TRUNC(99.999) = 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
|
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
|
SYSTIMESTAMP
|
Devolve a data do sistema, incluindo frações de segundos e o fuso horário:SELECT SYSTIMESTAMP FROM DUAL
|
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
|
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
|
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
|
CURRENT_DATE
|
Devolve a data atual no fuso horário da sessão: SELECT CURRENT_DATE FROM DUAL
|
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
|
CURRENT_TIMESTAMP
|
Devolve a data e hora atuais no fuso horário da sessão: SELECT CURRENT_TIMESTAMP FROM DUAL
|
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
|
ADD_MONTHS
|
Devolve a data mais o número inteiro de meses:ADD_MONTHS(SYSDATE, 1)
|
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'
|
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')
|
Sim | EXTRACT (parte da data) |
Equivalente a Oracle:EXTRACT(YEAR FROM DATE '2019-01-31')
|
LAST_DAY
|
Devolve a data do último dia do mês que contém a data especificada:LAST_DAY('01-JAN-2019')
|
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'
|
MONTH_BETWEEN
|
Devolve o número de meses entre as datas date1 e date2:MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
|
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)
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')
|
Sim | To_CHAR
|
Equivalente a Oracle:TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
|
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 bitspara 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
|
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
|
CONVERT
|
Converte uma string de carateres de um conjunto de carateres para outro: CONVERT (
'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
|
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')
|
TO_CHAR (string/numérico) |
A função converte um número ou uma data numa string: TO_CHAR(22.73,'$99.9')
|
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')
|
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')
|
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')
|
TO_NUMBER
|
Converte a expressão num valor de um tipo de dados NUMBER :
TO_NUMBER('01234')
|
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')
Uma alternativa é usar a função CAST para conversões que não requerem strings de formatação complexas:CAST('01234' AS NUMERIC)
|
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')
|
Sim | COALESCE
|
Equivalente a Oracle:COALESCE(null, '1', 'a')
|
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')
|
Sim | NULLIF
|
Equivalente a Oracle:NULLIF('1', '2')
|
NVL
|
Substitua o valor nulo (devolvido como um espaço em branco) por uma string nos resultados de uma consulta:
NVL(null, 'a')
|
Não | COALESCE
|
Em alternativa, use a função COALESCE :COALESCE(null, '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')
|
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
|
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
|
Não | N/A | N/A |
USER
|
Devolve o nome de utilizador da sessão atual:SELECT USER FROM DUAL
|
Sim | USER
|
Equivalente a Oracle:SELECT USER;
|
USERENV
|
Devolve informações sobre a sessão do utilizador atual com a configuração de parâmetros atual:SELECT USERENV('LANGUAGE') FROM DUAL
|
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
|
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(
|
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;
|
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
|
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
SYSDATE
Oracle01-AUG-19
devolve01-AUG-19
. - Por predefinição, a função
CURRENT_DATE
do PostgreSQL devolve2019-08-01
(sem hora do dia, mesmo com formatação). Para obter a data e a hora atuais, use a funçãoCURRENT_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
|
IN/NOT IN
|
Sim | IN/NOT IN
|
SELECT * FROM DEPARTMENTS D
|
LIKE/NOT LIKE
|
Sim | LIKE/NOT LIKE
|
SELECT * FROM EMPLOYEES
|
BETWEEN/
NOT BETWEEN
|
Sim | BETWEEN/
|
SELECT * FROM EMPLOYEES
|
AND/OR
|
Sim | AND/OR
|
SELECT * FROM EMPLOYEES
|
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
|
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
|
Sim (exceto AVERAGE_RANK ) |
Hierárquica | CONNECT BY
|
Não |
Atraso | LAG
|
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
|
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áusulaON 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
|
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?
- Explore mais acerca das contas de utilizador do Cloud SQL para PostgreSQL.
- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.