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:
- Como migrar usuários do Oracle para o Cloud SQL para MySQL: terminologia e funcionalidade
- Como migrar usuários do Oracle para o Cloud SQL para PostgreSQL: tipos de dados, usuários e tabelas
- Como migrar usuários do Oracle para o Cloud SQL para PostgreSQL: consultas, procedimentos armazenados, funções e gatilhos (este documento)
- Como migrar usuários da Oracle para o Cloud SQL para MySQL: segurança, operações, monitoramento e geração de registros
- Como migrar usuários e esquemas do banco de dados da Oracle para o Cloud SQL para PostgreSQL
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
|
Sim | SELECT
|
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
|
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áusulaFROM
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,
O resultado será assim:
FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
|
Sem alias para a visualização in-line: postgres=> SELECT FIRST_NAME,
Como adicionar um alias à visualização in-line: postgres=> SELECT FIRST_NAME,
O resultado será assim:
first_name | department_id | salary | date_col
|
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
|
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 é 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çõesSELECT
e elimina registros duplicados.UNION ALL
: anexa os conjuntos de resultados de duas ou mais instruçõesSELECT
sem eliminar registros duplicados.INTERSECT
: retorna a interseção de duas ou mais instruçõesSELECT
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çõesSELECT
somente se houver um registro nos dois conjuntos de dados.MINUS (EXCEPT
no Cloud SQL para PostgreSQL): compara duas ou mais instruçõesSELECT
, 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çõesSELECT
, 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
|
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 (de Convert MINUS a EXCEPT no PostgreSQL) |
SELECT COL1 FROM TBL1
|
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)
|
Parcialmente | SUBSTR
|
Equivalente ao Oracle quando a posição inicial é um número positivo.SUBSTR('PostgreSQL', 8, 3)
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')
|
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')
|
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')
|
TRIM
|
Corte caracteres iniciais ou finais (ou ambos) de uma string:TRIM(both '-' FROM '-PostgreSQL-')
|
Sim | TRIM
|
Equivalente do Oracle:TRIM(both '-' FROM '-PostgreSQL-')
|
LTRIM/RTRIM
|
Remove da extremidade esquerda ou direita da string todos os caracteres que aparecem na pesquisa: LTRIM(' 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}/?')
|
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
|
Sim | TRUNCATE
(número) |
Equivalente do Oracle:TRUNC(99.999) = 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
|
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
|
SYSTIMESTAMP
|
Retorna a data do sistema, incluindo segundos fracionários e fuso horário:SELECT SYSTIMESTAMP FROM DUAL
|
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
|
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
|
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
|
CURRENT_DATE
|
Retorna 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 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
|
CURRENT_TIMESTAMP
|
Retorna a data e a hora atuais no fuso horário da sessão:SELECT CURRENT_TIMESTAMP FROM DUAL
|
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
|
ADD_MONTHS
|
Retorna a data mais os meses inteiros:ADD_MONTHS(SYSDATE, 1)
|
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'
|
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')
|
Sim | EXTRACT (parte da data) |
Equivalente do Oracle:EXTRACT(YEAR FROM DATE '2019-01-31') |
LAST_DAY
|
Retorna 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. 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'
|
MONTH_BETWEEN
|
Retorna o número de meses entre as datas date1 e date2:MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
|
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)
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')
|
Sim | To_CHAR
|
Equivalente do Oracle:TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
|
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 bitspara 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
|
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
|
CONVERT
|
Converte uma string de caracteres de um conjunto de caracteres em outro: CONVERT (
'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
|
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')
|
TO_CHAR (string/numérico) |
A função converte um número ou uma data em uma string: TO_CHAR(22.73,'$99.9')
|
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')
|
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')
|
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')
|
TO_NUMBER
|
Converte a expressão em um 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, mas é opcional no Oracle:TO_NUMBER('01234','99999')
Uma alternativa é usar a função CAST para conversões que não exigem strings de formatação complexas:CAST('01234' AS NUMERIC)
|
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')
|
Sim | COALESCE
|
Equivalente do Oracle:COALESCE(null, '1', 'a')
|
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')
|
Sim | NULLIF
|
Equivalente do Oracle:NULLIF('1', '2')
|
NVL
|
Substitua nulo (retornado em branco) por uma string nos resultados de uma consulta:
NVL(null, 'a')
|
Não | COALESCE
|
Como alternativa, use a função COALESCE :COALESCE(null, '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')
|
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
|
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
|
Não | N/A | N/A |
USER
|
Retorna o nome do usuário atual da sessão:SELECT USER FROM DUAL
|
Sim | USER
|
Equivalente do Oracle:SELECT USER;
|
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
|
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
|
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(
|
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;
|
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
|
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 retorna01-AUG-19
. - Por padrão, a função
CURRENT_DATE
do PostgreSQL retorna2019-08-01
, sem hora do dia, mesmo com formatação. Para recuperar a data e hora atuais, use a funçãoCURRENT_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
|
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 aceita subconsultas no nível SELECT , para instruções JOIN e para filtragem nas
cláusulas WHERE/AND :-- SELECT SubQuery
|
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.
Notas de 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
|
Sim (exceto AVERAGE_RANK ) |
Hierárquica | CONNECT BY
|
Não |
Atraso | LAG
|
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
|
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áusulaON 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
|
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
- Explore mais sobre as contas de usuário do Cloud SQL para MySQL.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.