SnowConvert AI – Diferenças funcionais do Oracle

SSC-FDM-OR0001

Nota

Esta FDM foi adicionada para uma versão antiga do Oracle SnowConvert AI. Atualmente, ela está obsoleta.

Descrição

Este erro está relacionado ao arquivo de relatório Assessment. Ele aparece quando ocorre um erro ao gravar o arquivo de relatório de detalhes da avaliação.

Práticas recomendadas

SSC-FDM-OR0002

O valor inicial da sequência excede o valor máximo permitido pelo Snowflake.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0068.

Descrição

Este erro ocorre quando o valor da instrução START WITH excede o valor máximo permitido pelo Snowflake. O que o Snowflake diz sobre o valor inicial é: Especifica o primeiro valor retornado pela sequência. Os valores compatíveis são quaisquer valores que podem ser representados por um inteiro de 64 bits em complemento de dois (de -2^63 a 2^63-1). Portanto, de acordo com o mencionado anteriormente, o valor máximo permitido é 9223372036854775807 para números positivos e 9223372036854775808 para números negativos.

Exemplo de código

Código de entrada:
 CREATE SEQUENCE SEQUENCE1
START WITH 9223372036854775808;
Copy
 CREATE SEQUENCE SEQUENCE2
START WITH -9223372036854775809;
Copy
Código gerado:
 CREATE OR REPLACE SEQUENCE SEQUENCE1
--** SSC-FDM-OR0002 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. **
START WITH 9223372036854775808
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy
 CREATE OR REPLACE SEQUENCE SEQUENCE2
--** SSC-FDM-OR0002 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. **
START WITH -9223372036854775809
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy

Práticas recomendadas

  • Pode-se recomendar apenas redefinir a sequência e modificar também o uso dela. NOTE: a coluna de destino deve ter espaço suficiente para armazenar esse valor.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0003

Cláusula de pesquisa removida da instrução com o elemento.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0038.

Descrição

A search_clause é utilizada para definir a ordem em que as linhas são processadas em uma instrução SELECT. Essa funcionalidade permite uma travessia personalizada dos dados, garantindo que os resultados sejam retornados em uma sequência específica com base nos critérios especificados. É importante observar, no entanto, que esse comportamento, caracterizado pela search_clause, não é compatível com o Snowflake.

Em bancos de dados como o Oracle, a search_clause é comumente utilizada em conjunto com consultas recursivas ou expressões de tabela comuns (CTEs) para influenciar a sequência em que os dados hierárquicos são explorados. Ao designar uma coluna específica ou um conjunto de colunas na search_clause, você pode controlar a travessia da hierarquia por profundidade primeiro ou por largura primeiro, afetando a ordem em que as linhas são processadas.

No Snowflake, a mensagem search_clause será gerada e a search_clause será eliminada posteriormente.

Exemplo de código

Código de entrada:
 WITH dup_hiredate(eid, emp_last, mgr_id, reportLevel, hire_date, job_id) AS 
(SELECT aValue from atable) SEARCH DEPTH FIRST BY hire_date SET order1 SELECT aValue from atable;
Copy
Código gerado:
 WITH dup_hiredate(eid, emp_last, mgr_id, reportLevel, hire_date, job_id) AS
(
SELECT aValue from
atable
) /*** SSC-FDM-OR0003 - SEARCH CLAUSE REMOVED FROM THE WITH ELEMENT STATEMENT ***/
SELECT aValue from
atable;
Copy

Recomendação

SSC-FDM-OR0004

A palavra-chave siblings foi removida da cláusula order by porque o Snowflake não é compatível com ela.

Descrição

No Oracle, a cláusula ORDER BY SIBLINGS pode ser utilizada em consultas hierárquicas para preservar a ordem dos dados fornecida pela hierarquia, aplicando uma reordenação dos valores que são irmãos na mesma hierarquia. Isso não é compatível com o Snowflake.

Exemplo de código

Código de entrada:
 SELECT LEVEL,
       LPAD(' ', 2 * (LEVEL - 1)) || NAME AS FORMATTED_NAME,
       JOB_TITLE
FROM EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID
ORDER SIBLINGS BY NAME;
Copy
Código gerado:
 SELECT LEVEL,
       NVL(
       LPAD(' ', 2 * (
                      !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!LEVEL - 1)) :: STRING, '') || NVL(NAME :: STRING, '') AS FORMATTED_NAME,
       JOB_TITLE
FROM
       EMPLOYEES
START WITH MANAGER_ID IS NULL
CONNECT BY
       PRIOR EMPLOYEE_ID = MANAGER_ID
ORDER BY
       NAME /*** SSC-FDM-OR0004 - SIBLINGS KEYWORD REMOVED FROM ORDER BY CLAUSE BECAUSE SNOWFLAKE DOES NOT SUPPORT IT ***/;
Copy
  • Embora a mesma ordenação exata obtida com a cláusula SIBLINGS possa não estar disponível, existem algumas alternativas para conseguir um resultado semelhante.

    • Incorpore a consulta dentro de uma consulta externa que aplique a classificação desejada usando ORDER BY.

    • Crie um CTE com a consulta hierárquica usando CONNECT BY e referencie o CTE em uma consulta subsequente para aplicar ORDER BY para classificação de irmãos (linhas no mesmo nível).

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0005

Sinônimos não são compatíveis com o Snowflake, mas as referências a este sinônimo foram alteradas pelo nome do objeto original.

Descrição

Sinônimos não são compatíveis com o Snowflake. Os sinônimos são substituídos pelo nome original.

Exemplo de código

Código de entrada:
 CREATE TABLE TABLE1
(
    COLUMN1 NUMBER
);

CREATE OR REPLACE SYNONYM B.TABLE1_SYNONYM FOR TABLE1;
SELECT * FROM B.TABLE1_SYNONYM WHERE B.TABLE1_SYNONYM.COLUMN1 = 20;
Copy
Código gerado:
 CREATE OR REPLACE TABLE TABLE1
    (
        COLUMN1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;

--    --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **

--    CREATE OR REPLACE SYNONYM B.TABLE1_SYNONYM FOR TABLE1
                                                         ;
SELECT * FROM
    TABLE1
    WHERE
    TABLE1.COLUMN1 = 20;
Copy

Práticas recomendadas

SSC-FDM-OR0006

Estado de restrição removido da restrição em linha not null.

Descrição

Este aviso ocorre quando a restrição de coluna not null contém um dos seguintes estados de restrição do Oracle como parte da definição em linha da coluna:

 [ RELY | NORELY | RELY DISABLE | RELY ENABLE | VALIDATE | NOVALIDATE ]
Copy

O Snowflake não é compatível com esses estados; portanto, eles serão removidos da restrição inline NOT NULL.

Código de exemplo

Código de entrada:
 CREATE TABLE Table1(
  col1 INT NOT NULL RELY
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE Table1 (
    col1 INT NOT NULL /*** SSC-FDM-OR0006 - CONSTRAINT STATE RELY REMOVED FROM NOT NULL INLINE CONSTRAINT ***/
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
  ;
Copy

Práticas recomendadas

SSC-FDM-OR0007

O Snowflake não é compatível com o controle de versão de objetos. Os desenvolvedores devem considerar abordagens alternativas para o controle de versão do código.

Descrição

O Snowflake não é compatível com o controle de versão de objetos. O modificador EDITINONABLE ou NONEDITIONABLE é removido no código convertido e um aviso é adicionado.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE EDITIONABLE PROCEDURE FUN1 (n number)is
l_result number;
begin
    DELETE FROM employees;
end;
Copy
Código gerado:
 --** SSC-FDM-OR0007 - SNOWFLAKE DOESN'T SUPPORT VERSIONING OF OBJECTS. DEVELOPERS SHOULD CONSIDER ALTERNATE APPROACHES FOR CODE VERSIONING. **
CREATE OR REPLACE PROCEDURE FUN1 (n NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        l_result NUMBER(38, 18);
    BEGIN
        DELETE FROM
            employees;
    END;
$$;
Copy

Práticas recomendadas

  • O usuário deve considerar abordagens alternativas para o controle de versão do código.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0008

Quantificador configurado incompatível

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0071.

Descrição

O quantificador «all» não é compatível com o Snowflake. O modificador é removido do código-fonte e um aviso é adicionado; o código resultante pode se comportar de maneira inesperada.

Exemplo de código

Código de entrada:
 SELECT location_id  FROM locations 
MINUS ALL 
SELECT location_id  FROM departments;
Copy
Código gerado:
 SELECT location_id  FROM
locations
--** SSC-FDM-OR0008 - QUANTIFIER 'ALL' NOT SUPPORTED FOR THIS SET OPERATOR, RESULTS MAY DIFFER **
MINUS
SELECT location_id  FROM
departments;
Copy

No Snowflake, os operadores INTERSECT e MINUS/EXCEPT sempre removerão valores duplicados.

Práticas recomendadas

  • Verifique alternativas no Snowflake para emular a funcionalidade do quantificador «all».

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0009

Os valores do cursor implícito SQL podem ser diferentes.

Descrição

Nota

Gere procedimentos e macros usando JavasScript como linguagem de destino, adicionando o seguinte sinalizador -t JavaScript ou --PLTargetLanguage JavaScript

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Este EWI é exibido quando o valor do cursor implícito SQL é utilizado. Isso ocorre porque o Oracle usa valores diferentes dependendo do tipo de consulta. Por exemplo, para SELECT, o valor utilizado para definir os valores do cursor implícito SQL é o número de linhas retornadas pela consulta. Quando o tipo de consulta é UPDATE/CREATE/DELETE/INSERT, o valor utilizado é o número de linhas afetadas; este é o principal motivo pelo qual este EWI é exibido.

Exemplo de código

Código de entrada:
-- Additional Params: -t JavaScript
--Transformation for implicit cursor
CREATE OR REPLACE PROCEDURE SP_SAMPLE AUTHID DEFINER IS
  stmt_no  POSITIVE;
BEGIN
  IF SQL%ROWCOUNT = 0 THEN
   EXIT ;
  END IF;
  IF SQL%ISOPEN THEN
   EXIT ;
  END IF;
  IF SQL%FOUND THEN
   EXIT ;
  END IF;
  IF SQL%NOTFOUND THEN
   EXIT ;
  END IF;
END;
Código gerado:
 -- Additional Params: -t JavaScript
--Transformation for implicit cursor
CREATE OR REPLACE PROCEDURE SP_SAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "12/16/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
  !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PlInvokerRightsClause' NODE ***/!!!
  //AUTHID DEFINER
  null
  // SnowConvert AI Helpers Code section is omitted.

  let STMT_NO = new POSITIVE();
  if (SQL.ROWCOUNT /*** SSC-FDM-OR0009 - SQL IMPLICIT CURSOR VALUES MAY DIFFER ***/ == 0) {
    break;
  }
  if (SQL.ISOPEN) {
    break;
  }
  if (SQL.FOUND) {
    break;
  }
  if (SQL.NOTFOUND) {
    break;
  }
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0010

A precisão menor do tipo de dados NUMBER foi aumentada para corresponder à escala.

Descrição

O tipo de dados NUMBER armazena números de ponto fixo e de ponto flutuante. Esses dados são portáteis entre diferentes sistemas operacionais que executam o Oracle Database. O tipo de dados NUMBER é recomendado para a maioria dos casos em que você precisa armazenar dados numéricos. A sintaxe é a seguinte: NUMBER (X, Y), em que X é a precisão e Y é a escala.

Por exemplo, NUMBER(5, 3) é um número que tem 2 dígitos antes da vírgula decimal e 3 depois da vírgula decimal, assim como o número a seguir:

12.345

Copy

Outras considerações importantes:

  1. Escala Y especifica o número máximo de dígitos à direita da vírgula decimal.

  2. A escala de precisão Y-X especifica o número mínimo de zeros presentes após a vírgula decimal.

Esta mensagem é exibida quando um NUMBER tem uma precisão menor que sua escala. O Snowflake não é compatível com esse recurso, e esta mensagem é utilizada para indicar que o valor da precisão foi aumentado para manter a equivalência.

Observação

Considere que há casos em que esse problema pode ocorrer em conjunto com outras transformações conhecidas ou nem acontecer. Por exemplo, nos casos em que a escala é substituída por dezenove e a precisão anterior é maior que dezenove, NOT exibirá esta mensagem.

Exemplo de código

Código de entrada:
Consultas
 CREATE TABLE SampleNumberTable(Col1 NUMBER(4, 5));

INSERT INTO SampleNumberTable (Col1)
VALUES (0.00009);

INSERT INTO SampleNumberTable (Col1)
VALUES (0.000021);

INSERT INTO SampleNumberTable (Col1)
VALUES (0.012678912);

SELECT * FROM SampleNumberTable;
Copy
Resultado
Col1   |
-------+
0.00009|
0.00002|
0.01268|

Copy
Código gerado:
Consultas
 CREATE OR REPLACE TABLE SampleNumberTable (Col1 NUMBER(5, 5) /*** SSC-FDM-OR0010 - NUMBER DATATYPE SMALLER PRECISION WAS INCREASED TO MATCH SCALE ***/ /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO SampleNumberTable(Col1)
VALUES (0.00009);

INSERT INTO SampleNumberTable(Col1)
VALUES (0.000021);

INSERT INTO SampleNumberTable(Col1)
VALUES (0.012678912);

SELECT * FROM
SampleNumberTable;
Copy
Resultado
Col1   |
-------+
0.00009|
0.00002|
0.01268|

Copy

Práticas recomendadas

SSC-FDM-OR0011

O argumento booleano foi removido porque a opção «adicionar à pilha» não é compatível.

Descrição

Este aviso é exibido quando o terceiro argumento opcional de RAISE_APLICATION_ERROR foi removido durante a migração. Essa funcionalidade não é compatível com o Snowflake.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE FUNCTION TEST(SAMPLE_A      IN NUMBER DEFAULT NULL,
                               SAMPLE_B       IN NUMBER DEFAULT NULL)
  RETURN NUMBER
 AS
BEGIN
    raise_application_error(-20001, 'First exception message', FALSE);
  RETURN 1;
END TEST;
Copy
Código gerado:
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE TEST (SAMPLE_A NUMBER(38, 18) DEFAULT NULL,
                               SAMPLE_B NUMBER(38, 18) DEFAULT NULL)
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  FIRST_EXCEPTION_MESSAGE_EXCEPTION_CODE_0 EXCEPTION (-20001, 'FIRST EXCEPTION MESSAGE');
 BEGIN
  --** SSC-FDM-OR0011 - ADD TO STACK OF ERRORS IS NOT SUPPORTED, BOOLEAN ARGUMENT FALSE WAS REMOVED. **
  RAISE FIRST_EXCEPTION_MESSAGE_EXCEPTION_CODE_0;
  RETURN 1;
 END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0012

As instruções COMMIT e ROLLBACK exigem configuração adequada para funcionar conforme o esperado.

Descrição

As instruções COMMIT e ROLLBACK exigem configuração adequada para funcionar conforme o esperado no Snowflake. A seguinte instrução precisa ser executada no Snowflake para simular a funcionalidade correta dessas instruções:

 ALTER SESSION SET AUTOCOMMIT = false;
Copy

Exemplo de código

Código de entrada
 COMMIT;
ROLLBACK;
Copy
Código gerado
 --** SSC-FDM-OR0012 - COMMIT REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
COMMIT;

--** SSC-FDM-OR0012 - ROLLBACK REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
ROLLBACK;
Copy

Práticas recomendadas

  • Execute a consulta mencionada na seção de descrição antes de começar a executar seu código.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com.

SSC-FDM-OR0013

A cláusula cycle não é compatível com o Snowflake.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0039.

Descrição

Esta mensagem é exibida quando o SnowConvert AI encontra uma consulta com uma cláusula CYCLE. Essa cláusula não é compatível com o Snowflake; portanto, foi transformada em comentário no código.

Esta cláusula marca quando há uma recursão.

Para obter mais detalhes, consulte a documentação sobre a funcionalidade da cláusula.

Exemplo de código

Conectar por

Código de entrada:
 CREATE OR REPLACE FORCE NONEDITIONABLE VIEW VIEW01 AS
SELECT
      UNIQUE A.*
FROM
      TABLITA A
WHERE
      A.X = A.C CONNECT BY NOCYCLE A.C = 0 START WITH A.B = 1
HAVING
      X = 1
GROUP BY
      A.C;
Copy
Código gerado:
 CREATE OR REPLACE VIEW VIEW01
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT DISTINCT
      A.*
FROM
      TABLITA A
WHERE
      A.X = A.C
GROUP BY
      A.C
HAVING
      X = 1
--** SSC-FDM-OR0013 - CYCLE CLAUSE IS NOT SUPPORTED IN SNOWFLAKE **
CONNECT BY
      A.C = 0 START WITH A.B = 1;
Copy

Práticas recomendadas

SSC-FDM-OR0014

Incompatibilidade de tipo de dados de chave estrangeira.

Descrição

Este erro ocorre quando há uma incompatibilidade no tipo de dados de uma chave estrangeira.

Exemplo de código

Código de entrada:
 CREATE TABLE "MyDb"."MyTable"
(
    "COL1" NUMBER,
    CONSTRAINT "PK" PRIMARY KEY ("COL1")
);

CREATE TABLE "MyDb"."MyTable1"
(   
    "COL1" NUMBER(*,0),
    CONSTRAINT "FK1" FOREIGN KEY ("COL1") REFERENCES "MyDb"."MyTable" ("COL1")
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE "MyDb"."MyTable"
    (
        "COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
        CONSTRAINT "PK" PRIMARY KEY ("COL1")
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;

    CREATE OR REPLACE TABLE "MyDb"."MyTable1"
    (
        "COL1" NUMBER(38) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;

    ALTER TABLE "MyDb"."MyTable1"
    ADD
    --** SSC-FDM-OR0014 - FOREIGN KEY DATA TYPE MISMATCH **
    CONSTRAINT "FK1" FOREIGN KEY ("COL1") REFERENCES "MyDb"."MyTable" ("COL1");
Copy

Nota

Observe que «MyDb».»MyTable1».COL1 e «MyDb».»MyTable».COL1 são de tipos diferentes e o ERROR é exibido.

Práticas recomendadas

SSC-FDM-OR0015

Os resultados da transformação de LENGTHB em OCTET_LENGTH podem variar devido ao gerenciamento de memória do DBMS.

Descrição

Esse problema ocorre quando há uma invocação da função LENGTHB que retorna o tamanho de uma coluna ou um literal em bytes. Essa função é transformada na função OCTET_LENGTH do Snowflake.

Quando o parâmetro da função é uma coluna, o resultado é o tamanho do valor que a coluna tem. Esse tamanho pode variar entre o Oracle e o Snowflake, e o tipo da coluna desempenha um papel importante no resultado retornado pela função.

Exemplo de código

Código de entrada:
Consultas
 CREATE TABLE char_table
(
	char_column1 CHAR(15)
);

INSERT INTO char_table VALUES ('Hello world');

SELECT char_column1, LENGTHB(char_column1), LENGTH('Hello world') FROM char_table;
Copy
Resultado
|CHAR_COLUMN1   |LENGTHB(CHAR_COLUMN1)|LENGTH('HELLOWORLD')|
|---------------|---------------------|--------------------|
|Hello world    |15                   |11                  |


Copy
Código gerado:
Consultas
CREATE OR REPLACE TABLE char_table
(
	char_column1 CHAR(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO char_table
VALUES ('Hello world');

SELECT char_column1,
OCTET_LENGTH(char_column1) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/, LENGTH('Hello world') FROM
char_table;
Resultado
|CHAR_COLUMN1|OCTET_LENGTH(CHAR_COLUMN1)|LENGTH('HELLO WORLD')|
|------------|--------------------------|---------------------|
|Hello world |11                        |11                   |


Copy

Práticas recomendadas

  • Verifique manualmente os tipos de dados utilizados.

  • Verifique a codificação das colunas utilizadas, pois OCTET_LENGTH pode retornar tamanhos maiores quando a cadeia de caracteres contém pontos de código Unicode.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0016

As opções COMMIT e ROLLBACK foram removidas porque o Snowflake não as exige.

Descrição

As opções de instrução COMMIT e ROLLBACK estão sendo removidas porque o Snowflake não as exige.

Exemplo de código

Código de entrada
 COMMIT WORK FORCE '22.57.53';
ROLLBACK WORK FORCE '22.57.53';
Copy
Código gerado
 --** SSC-FDM-OR0016 - COMMIT OPTIONS REMOVED BECAUSE SNOWFLAKE DOES NOT REQUIRE THEM **
--** SSC-FDM-OR0012 - COMMIT REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
COMMIT WORK;

--** SSC-FDM-OR0016 - ROLLBACK OPTIONS REMOVED BECAUSE SNOWFLAKE DOES NOT REQUIRE THEM **
--** SSC-FDM-OR0012 - ROLLBACK REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
ROLLBACK WORK;
Copy

Práticas recomendadas

SSC-FDM-OR0017

DBTimezone foi removido para usar o valor padrão do carimbo de data/hora.

Descrição

A palavra-chave DBTIMEZONE foi removida da expressão AT TIME ZONE.

Exemplo de código

Código de entrada:
 SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE DBTIMEZONE FROM DUAL;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0017 - DBTIMEZONE WAS REMOVED TO USE THE DEFAULT VALUE OF THE TIMESTAMP **
TO_TIMESTAMP_LTZ( TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;
Copy

Práticas recomendadas

  • Pode ser necessário definir o parâmetro de sessão TIMEZONE para conseguir resultados iguais.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0018

A instrução de mesclagem pode não funcionar como esperado

Descrição

Este aviso é usado para indicar que a instrução de mesclagem do Snowflake pode ter algumas diferenças funcionais em comparação com o Oracle.

Exemplo de código

Código de entrada:
 MERGE INTO people_target pt 
USING people_source ps 
ON    (pt.person_id = ps.person_id) 
WHEN MATCHED THEN UPDATE 
  SET pt.first_name = ps.first_name, 
      pt.last_name = ps.last_name, 
      pt.title = ps.title 
  DELETE where pt.title  = 'Mrs.' 
WHEN NOT MATCHED THEN INSERT 
  (pt.person_id, pt.first_name, pt.last_name, pt.title) 
  VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title) 
  WHERE ps.title = 'Mr';
Copy
Código gerado:
 --** SSC-FDM-OR0018 - SNOWFLAKE MERGE STATEMENT MAY HAVE SOME FUNCTIONAL DIFFERENCES COMPARED TO ORACLE **
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "people_target", "people_source" **
MERGE INTO people_target pt
USING people_source ps
ON    (pt.person_id = ps.person_id)
      WHEN MATCHED AND pt.title  = 'Mrs.' THEN
        DELETE
      WHEN MATCHED THEN
        UPDATE SET
          pt.first_name = ps.first_name,
               pt.last_name = ps.last_name,
               pt.title = ps.title
      WHEN NOT MATCHED AND ps.title = 'Mr' THEN
        INSERT
        (pt.person_id, pt.first_name, pt.last_name, pt.title)
        VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title);
Copy

Práticas recomendadas

  • Se você estiver obtendo resultados diferentes em comparação com o Oracle, considere o seguinte:

    • Para priorizar a ordem de execução, acesse o próximo link para obter mais informações.

      • Execute as instruções DML ignoradas fora (antes ou depois, conforme o caso) da instrução de mesclagem.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0019

A saída do quadro de janela pode não ser equivalente.

Descrição

Este aviso é adicionado quando uma unidade de quadro de janela ROWS é encontrada no código-fonte.

ROWS funciona usando números de linha físicos para os cálculos, que podem ser diferentes após a migração para a plataforma de destino. A adição manual de cláusulas ORDER BY extras pode ajudar a mitigar ou eliminar esse problema.

Nota

Observe que, conforme afirma a documentação da Oracle:\ «O valor retornado por uma função analítica com um deslocamento lógico é sempre determinístico. No entanto, o valor retornado por uma função analítica com um deslocamento físico pode produzir resultados não determinísticos, a menos que a expressão de ordenação resulte em uma ordenação exclusiva. Você pode ter que especificar várias colunas na cláusula order_by_clause para obter essa ordenação exclusiva.»

De acordo com isso, recomenda-se verificar se a função retornou resultados determinísticos antecipadamente para evitar problemas.

Código de exemplo

Código de entrada:
 SELECT
SUM(C_BIRTH_DAY)
OVER (
    ORDER BY C_BIRTH_COUNTRY
    ROWS UNBOUNDED PRECEDING) AS MAX1
FROM WINDOW_TABLE;
Copy
Código gerado:
 SELECT
SUM(C_BIRTH_DAY)
OVER (
    ORDER BY C_BIRTH_COUNTRY ROWS UNBOUNDED PRECEDING /*** SSC-FDM-OR0019 - WINDOW FRAME OUTPUT MAY NOT BE EQUIVALENT ***/) AS MAX1
FROM
WINDOW_TABLE;
Copy

Práticas recomendadas

  • Verifique se há ordenação determinística das linhas para garantir saídas determinísticas ao executar no Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0020

PRAGMA EXCEPTION_INIT não é compatível.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0051.

Descrição

Este aviso é adicionado quando a função PRAGMA EXCEPTION_INIT é invocada dentro de um procedimento. O nome da exceção e o código SQL das exceções são definidos na função RAISE. Quando é convertido para o -Snowflake Scripting, o código SQL é adicionado à declaração da exceção; no entanto, alguns valores de código podem ser inválidos no Snowflake Scripting.

Código de exemplo

Código de entrada:
 CREATE OR REPLACE PROCEDURE EXCEPTION_DECLARATION_SAMPLE AUTHID DEFINER IS
  NEW_EXCEPTION EXCEPTION;
  PRAGMA EXCEPTION_INIT(NEW_EXCEPTION, -63);
  NEW_EXCEPTION2 EXCEPTION;
  PRAGMA EXCEPTION_INIT ( NEW_EXCEPTION2, -20100 );
BEGIN

  IF true THEN
    RAISE NEW_EXCEPTION;
  END IF;

EXCEPTION
    WHEN NEW_EXCEPTION THEN
        --Handle Exceptions
        NULL;
END;
/
Copy
Código gerado:
Snowflake Scription
 CREATE OR REPLACE PROCEDURE EXCEPTION_DECLARATION_SAMPLE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0097 - PROCEDURE PROPERTIES ARE NOT SUPPORTED IN SNOWFLAKE PROCEDURES ***/!!!
AS
$$
  DECLARE
    --** SSC-FDM-OR0023 - EXCEPTION CODE NUMBER EXCEEDS SNOWFLAKE SCRIPTING LIMITS **
    NEW_EXCEPTION EXCEPTION;
    --** SSC-FDM-OR0020 - PRAGMA EXCEPTION_INIT IS NOT SUPPORTED **
    PRAGMA EXCEPTION_INIT(NEW_EXCEPTION, -63);
    NEW_EXCEPTION2 EXCEPTION (-20100, '');
    --** SSC-FDM-OR0020 - PRAGMA EXCEPTION_INIT IS NOT SUPPORTED **
  PRAGMA EXCEPTION_INIT ( NEW_EXCEPTION2, -20100 );
  BEGIN
    IF (true) THEN
      RAISE NEW_EXCEPTION;
    END IF;
    EXCEPTION
        WHEN NEW_EXCEPTION THEN
            --Handle Exceptions
            NULL;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0021

For Loop com número de ponto flutuante como limite pode não se comportar corretamente no Snowflake Scripting.

Descrição

O Script Snowflake permite apenas que um INTEGER ou uma expressão que avalia como um INTEGER como um limite para a condição FOR LOOP. Os números flutuantes serão arredondados para cima ou para baixo, alterando o limite original.

O limite inferior será arredondado para o número inteiro mais próximo. Por exemplo:

3.1 -> 3, 6.7 -> 7, 4.5 -> 5

No entanto, o limite superior será truncado para o número inteiro inferior mais próximo. Por exemplo:

3.1 -> 3, 6.7 -> 6, 4.5 -> 4

Script Snowflake

 CREATE OR REPLACE PROCEDURE p1()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
    DECLARE
        var1 VARCHAR DEFAULT '';
        var2 VARCHAR DEFAULT '';
        var3 VARCHAR DEFAULT '';
    BEGIN
        --Loop 1
        FOR i IN 1.2 TO 5.2 DO
            var1 := var1 || ' ' || i::VARCHAR;
        END FOR;
        
        --Loop 2
        FOR i IN 1.7 TO 5.5 DO
            var2 := var2 || ' ' || i::VARCHAR;
        END FOR;
        
        --Loop 3
        FOR i IN 1.5 TO 5.8 DO
            var3 := var3 || ' ' || i::VARCHAR;
        END FOR;
        RETURN  ' Loop1: ' || var1 ||
                ' Loop2: ' || var2 ||
                ' Loop3: ' || var3;
    END;
$$;

CALL p1();
Copy
Resultado
P1                                                |
--------------------------------------------------+
 Loop1:  1 2 3 4 5                                |
 Loop2:  2 3 4 5                                  |
 Loop3:  2 3 4 5                                  |

Copy

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE p1
AS
BEGIN
FOR i NUMBER(5,1) IN 1.2 .. 5.7 LOOP
    NULL;
END LOOP;
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE p1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        --** SSC-FDM-OR0021 - FOR LOOP WITH FLOAT NUMBER AS LOWER OR UPPER BOUND MAY NOT BEHAVE CORRECTLY IN SNOWFLAKE SCRIPTING **
        --** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
        FOR i IN 1.2 TO 5.7
                            --** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
                            LOOP
                                   NULL;
END LOOP;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0022

For Loop com múltiplas condições não é compatível atualmente pelo Snowflake Scripting. Somente a primeira condição é utilizada.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0100.

Descrição

O Oracle permite várias condições em um único FOR LOOP; no entanto, o Snowflake Scripting permite apenas uma condição por FOR LOOP. Apenas a primeira condição é migrada, e as outras são ignoradas durante a transformação.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE P3
AS
BEGIN
FOR i IN REVERSE 1..3,
REVERSE i+5..i+7
LOOP
    NULL;
END LOOP; 
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE P3 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        --** SSC-FDM-OR0022 - FOR LOOP WITH MULTIPLE CONDITIONS IS CURRENTLY NOT SUPPORTED BY SNOWFLAKE SCRIPTING **
        FOR i IN REVERSE 1 TO 3 LOOP
            NULL;
        END LOOP;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0023

O código de exceção ultrapassa o limite do Snowflake Scripting.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0099.

Descrição

Este aviso aparece quando um código de erro de declaração de exceção ultrapassa os limites de número de exceção do Snowflake Scripting. O número deve ser um inteiro entre -20000 e -20999.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE procedure_exception
IS
my_exception EXCEPTION;
PRAGMA EXCEPTION_INIT ( my_exception, -19000 );
BEGIN
    NULL; 
END;
Copy
Código gerado:
CREATE OR REPLACE PROCEDURE procedure_exception ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        --** SSC-FDM-OR0023 - EXCEPTION CODE NUMBER EXCEEDS SNOWFLAKE SCRIPTING LIMITS **
        my_exception EXCEPTION;
        --** SSC-FDM-OR0020 - PRAGMA EXCEPTION_INIT IS NOT SUPPORTED **
        PRAGMA EXCEPTION_INIT ( my_exception, -19000 );
    BEGIN
        NULL;
    END;
$$;

Práticas recomendadas

  • Verifique se o código de exceção está dentro dos limites permitidos pelo Snowflake Scripting. Caso contrário, altere-o para outro número de exceção disponível.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0024

Colunas da expressão não encontradas.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0002.

Descrição

Este erro ocorre quando as colunas de uma expressão de seleção não podem ser resolvidas, geralmente quando se refere a um acesso de tipo cuja referência não foi resolvida ou a uma coluna com um tipo definido pelo usuário cujas colunas não foram definidas; como um tipo sem corpo ou um tipo de objeto sem colunas.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE record_unknown_table_proc
AS
    unknownTable_variable_rowtype unknownTable%ROWTYPE;
BEGIN
    INSERT INTO MyTable values unknownTable_variable_rowtype;
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE record_unknown_table_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        unknownTable_variable_rowtype OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - ROWTYPE DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
    BEGIN
        INSERT INTO MyTable
        SELECT
            null /*** SSC-FDM-OR0024 - COLUMNS FROM EXPRESSION unknownTable%ROWTYPE NOT FOUND ***/;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0025

A restrição Not Null não é compatível em procedimentos do Snowflake.

Descrição

A restrição da declaração de variável Oracle NOT NULL não é compatível em declarações de variáveis dentro de procedimentos no Snowflake.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE PROC04
IS
 var3 FLOAT NOT NULL := 100;
BEGIN
NULL;
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE PROC04 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  var3 FLOAT := 100 /*** SSC-FDM-OR0025 - NOT NULL CONSTRAINT IS NOT SUPPORTED BY SNOWFLAKE ***/;
 BEGIN
  NULL;
 END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0026

Tipo não compatível na operação de conversão.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0045.

Descrição

Este erro ocorre quando um tipo não é compatível em uma operação de conversão.

Exemplo

Código de entrada:
 select cast(' $123.45' as number, 'L999.99') from dual;
Copy
Código gerado:
 select
--** SSC-FDM-OR0026 - CAST TYPE NOT SUPPORTED **
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0011 - THE FORMAT PARAMETER ' $123.45' IS NOT SUPPORTED ***/!!!
 cast(' $123.45' as NUMBER(38, 18) , 'L999.99') from dual;
Copy

EWIs relacionados

  1. SSC-EWI-OR0011: O parâmetro de formato não é compatível.

Práticas recomendadas

  • A conversão é convertida em uma função definida pelo usuário (UDF/Stub), para que você possa modificá-la e emular o comportamento da função de conversão.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0027

DEFAULT ON CONVERSION ERROR não é compatível.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0029.

Descrição

Default on conversion error não compatível no Snowflake.

Exemplo de código

Código de entrada:
 SELECT TO_NUMBER('2,00' DEFAULT 0 ON CONVERSION ERROR) "Value" FROM DUAL;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0027 - DEFAULT ON CONVERSION ERROR NOT SUPPORTED IN SNOWFLAKE IN SNOWFLAKE **
TO_NUMBER('2,00') "Value" FROM DUAL;
Copy

Práticas recomendadas

  • Você pode criar UDF para emular o comportamento do valor DEFAULT ON CONVERSION ERROR.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0028

O parâmetro SYS_CONTEXT não é compatível.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0031.

Descrição

Este erro ocorre quando um parâmetro de função SYS_CONTEXT não é compatível.

Exemplo de código

Código de entrada:
 SELECT SYS_CONTEXT ('USERENV', 'NLS_SORT') FROM DUAL;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0028 - 'NLS_SORT' SYS_CONTEXT PARAMETER NOT SUPPORTED IN SNOWFLAKE **
SYS_CONTEXT ('USERENV', 'NLS_SORT') FROM DUAL;
Copy

Práticas recomendadas

  • A função é convertida em uma função definida pelo usuário (stub), para que você possa modificá-la e emular o comportamento do parâmetro SYS_CONTEXT.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0029

Esta configuração ALTER SESSION não é compatível com o Snowflake.

Descrição

Uma cláusula ou configuração da instrução ALTER SESSION não é compatível atualmente.

Exemplo de código

Código de entrada:
 ALTER SESSION SET SQL_TRACE TRUE;
Copy
Código gerado:
 ----** SSC-FDM-OR0029 - THIS ALTER SESSION CONFIGURATION IS NOT SUPPORTED IN SNOWFLAKE **
--ALTER SESSION SET SQL_TRACE TRUE
                                ;
Copy

Práticas recomendadas

SSC-FDM-OR0030

A pseudocoluna ROWID não é compatível com o Snowflake.

Descrição

Quando ROWID é utilizada como uma pseudocoluna em uma consulta, ela é transformada em nula para evitar erros de tempo de execução e EWI é adicionado. Ainda não existe uma transformação para emular a funcionalidade.

Exemplo de código

Código de entrada Oracle:
 SELECT ROWID FROM T1;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0030 - ROWID PSEUDOCOLUMN IS NOT SUPPORTED IN SNOWFLAKE, IT WAS CONVERTED TO NULL TO AVOID RUNTIME ERRORS **
'' AS ROWID
FROM
T1;
Copy

Práticas recomendadas

SSC-FDM-OR0031

A cláusula de registro de erros nas instruções DML não é compatível com o Snowflake.

Descrição

Este erro é utilizado para avisar que a cláusula error_logging nas instruções DML do Oracle não é compatível com as instruções DML do Snowflake.

Exemplo de código

Código de entrada:
 MERGE INTO people_target pt 
USING people_source ps ON (pt.person_id = ps.person_id) 
WHEN MATCHED THEN UPDATE 
  SET pt.first_name = ps.first_name, 
      pt.last_name = ps.last_name, 
      pt.title = ps.title
LOG ERRORS;
Copy
Código gerado:
 MERGE INTO people_target pt
USING people_source ps ON (pt.person_id = ps.person_id)
  WHEN MATCHED THEN
    UPDATE
    SET pt.first_name = ps.first_name,
        pt.last_name = ps.last_name,
        pt.title = ps.title
--  --** SSC-FDM-OR0031 - THE ERROR LOGGING CLAUSE IN DML STATEMENTS IS NOT SUPPORTED BY SNOWFLAKE **
--LOG ERRORS
          ;
Copy

Práticas recomendadas

SSC-FDM-OR0032

A função StandardHash com parâmetro de entrada que não é cadeia de caracteres gera um resultado diferente no Snowflake.

Descrição

Este aviso é utilizado quando a função STANDARD_HASH no Oracle com parâmetro de entrada que não é cadeia de caracteres gera um resultado diferente no Snowflake.

Exemplo de código

Código de entrada:
Consulta
 SELECT STANDARD_HASH(1+1) FROM DUAL;
Copy
Resultado
 STANDARD_HASH(1+1)                               |
--------------------------------------------------+
 E39323970701D93598FC1D357F4BF04578CE3242         |

Copy
Código gerado:
Consulta
SELECT
--** SSC-FDM-OR0032 - STANDARD HASH FUNCTION WITH INPUT NON-STRING PARAMETER GENERATES A DIFFERENT RESULT IN SNOWFLAKE **
SHA1(1+1)
FROM DUAL;
Resultado
 SHA1(1+1)                                        |
--------------------------------------------------+
 da4b9237bacccdf19c0760cab7aec4a8359010b0         |

Práticas recomendadas

SSC-FDM-OR0033

DBMS_RANDOM.VALUE A precisão do pacote integrado é menor no Snowflake.

Descrição

Esta mensagem é exibida quando o SnowConvert AI uma função de pacote integrada do Oracle DBMS_RANDOM.VALUE n. Este aviso indica que o UDF adicionado para emular a funcionalidade tem precisão menor do que a função originaln.

Exemplo de código

Código de entrada:

 CREATE OR REPLACE PROCEDURE built_in_package_proc
IS
var1 NUMBER;
BEGIN
    SELECT DBMS_RANDOM.VALUE() INTO var1 FROM DUAL;

    SELECT DBMS_RANDOM.VALUE(2,10) INTO var1 FROM DUAL; 
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE built_in_package_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        var1 NUMBER(38, 18);
    BEGIN
        SELECT
            --** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
            DBMS_RANDOM.VALUE_UDF() INTO
            :var1
        FROM DUAL;

        SELECT
            --** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
            DBMS_RANDOM.VALUE_UDF(2,10) INTO
            :var1
        FROM DUAL;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0034

O valor inicial da sequência com «LIMIT VALUE» não é compatível com o Snowflake.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0001.

Descrição

Este erro ocorre quando o valor da instrução START WITH é LIMIT VALUE.

No Oracle, esta cláusula é utilizada apenas em ALTER TABLE

  • START WITH LIMIT VALUE, que é específica para identity_options, e só pode ser utilizada com ALTER TABLE MODIFY. Se você especificar START WITH LIMIT VALUE, o Oracle Database bloqueará a tabela e encontrará o valor máximo da coluna de identidade na tabela (para sequências crescentes) ou o valor mínimo da coluna de identidade (para sequências decrescentes) e atribuirá o valor como a marca d’água alta do gerador de sequência. O próximo valor retornado pelo gerador de sequência será a marca d’água alta + INCREMENT BY integer para sequências crescentes ou a marca d’água alta – INCREMENT BY integer para sequências decrescentes.

ALTER TABLE ORACLE

Exemplo de código

Código de entrada:
 CREATE SEQUENCE SEQUENCE1
  START WITH LIMIT VALUE;
Copy
Código gerado:
 CREATE OR REPLACE SEQUENCE SEQUENCE1
  --** SSC-FDM-OR0034 - SEQUENCE START VALUE WITH 'LIMIT VALUE' IS NOT SUPPORTED BY SNOWFLAKE. **
  START WITH LIMIT VALUE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy

Práticas recomendadas

SSC-FDM-OR0035

Verifique a implementação de UDF DBMS_OUTPUT.PUTLINE.

Descrição

Esta mensagem é exibida quando o SnowConvert AI migra uma função de pacote integrada do Oracle DBMS_OUTPUT.PUT_LINE n. Este aviso informa para verificar o UDF adicionado_._

Este EWI existe para informar ao usuário que revise a implementação de DBMS_OUTPUT.PUT_LINE_UDF, onde as seguintes informações serão encontradas:

Aviso

O desempenho pode ser afetado pelo uso deste UDF. Se você quiser começar a registrar informações, remova o comentário da implementação. Observe que isso está usando uma tabela temporária; se você quiser que os dados persistam após o término de uma sessão, remova TEMPORARY do CREATE TABLE.

Após a execução das chamadas de DBMS_OUTPUT.PUT_LINE_UDF, utilize a seguinte consulta para ler todos os logs: SELECT * FROM DBMS_OUTPUT.DBMS_OUTPUT_LOG.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE builtin_package_call
IS
BEGIN
	DBMS_OUTPUT.PUT_LINE(1);
	DBMS_OUTPUT.PUT_LINE("Test");
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE builtin_package_call ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
	BEGIN
		--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
		CALL DBMS_OUTPUT.PUT_LINE_UDF(1);
		--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
		CALL DBMS_OUTPUT.PUT_LINE_UDF("Test");
	END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0036

Parâmetros de pacotes integrados desnecessários

Descrição

Esta mensagem é exibida quando o SnowConvert AI migra um procedimento ou uma função de um pacote integrado do Oracle e alguns dos argumentos são removidos da chamada.

Alguns dos parâmetros originais podem não ter equivalente no Snowflake ou podem não ser necessários na versão transformada. Esses parâmetros são removidos do código gerado, mas são preservados na mensagem EWI para que o usuário ainda possa rastreá-los.

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE built_in_package_proc
IS
w_file UTL_FILE.FILE_TYPE;
BEGIN
    w_file:= UTL_FILE.FOPEN('MY_DIR','test.txt','W',32760);
    UTL_FILE.PUT_LINE(w_file,'New line');    
END;
Copy
Código gerado:
 CREATE OR REPLACE PROCEDURE built_in_package_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        w_file OBJECT /*** SSC-FDM-0015 - REFERENCED CUSTOM TYPE 'UTL_FILE.FILE_TYPE' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/ := OBJECT_CONSTRUCT();
    BEGIN
        --** SSC-FDM-OR0036 - PARAMETERS: 'LOCATION, MAX_LINESIZE_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
        CALL UTL_FILE.FOPEN_UDF('test.txt', 'W');
        SELECT
            *
        INTO
            w_file
        FROM
            TABLE(RESULT_SCAN(LAST_QUERY_ID()));
        --** SSC-FDM-OR0036 - PARAMETERS: 'AUTOFLUSH_UDF' UNNECESSARY IN THE IMPLEMENTATION. **
        CALL UTL_FILE.PUT_LINE_UDF(:w_file, 'New line');
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0037

A sintaxe utilizada em select não é compatível com o Snowflake.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0004.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Este aviso ocorre quando uma cláusula em um select não é compatível com o Snowflake. As cláusulas não compatíveis são:

  • CONTAINERS

  • SUBQUERY RESTRICTION

  • HIERARCHIES

  • EXTERNAL MODIFY

  • DBLINK

  • SHARDS

  • PARTITION

  • SUBPARTITION

  • HIERARCHICAL

Exemplo de código

Código de entrada:
 SELECT * FROM TABLE1 EXTERNAL MODIFY (LOCATION 'file.csv' REJECT LIMIT UNLIMITED);
Copy
Código gerado:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
SELECT * FROM
TABLE1
--       --** SSC-FDM-OR0037 - THE 'OPTIONAL MODIFIED EXTERNAL' SYNTAX IN SELECT IS NOT SUPPORTED IN SNOWFLAKE **
--       EXTERNAL MODIFY (LOCATION 'file.csv' REJECT LIMIT UNLIMITED)
                                                                   ;
Copy

Práticas recomendadas

SSC-FDM-OR0038

O atributo de cursor booleano não é compatível.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0128.

Descrição

Esta mensagem é utilizada para indicar que um atributo de cursor booleano não é compatível com o SnowScript ou que não há nenhuma transformação que emule essa funcionalidade no SnowScript. A tabela a seguir mostra os atributos de cursor booleano que podem ser emulados:

Atributo Boolean Cursor

Status

%FOUND

Pode ser emulado

%NOTFOUND

Pode ser emulado

%ISOPEN

Não suportado

Exemplo de código

Código de entrada:
 CREATE OR REPLACE PROCEDURE cursor_attributes_proc
IS
    is_open_attr BOOLEAN;
    found_attr BOOLEAN;
    my_record table1%ROWTYPE;
    CURSOR my_cursor IS SELECT * FROM table1;
BEGIN
    OPEN my_cursor;
    LOOP
        FETCH my_cursor INTO my_record;
        EXIT WHEN my_cursor%NOTFOUND;
        is_open_attr := my_cursor%ISOPEN;
        found_attr := my_cursor%FOUND;
    END LOOP;
    CLOSE my_cursor;
END;
Copy
Código gerado:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
CREATE OR REPLACE PROCEDURE cursor_attributes_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        is_open_attr BOOLEAN;
        found_attr BOOLEAN;
        my_record OBJECT !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - ROWTYPE DATA TYPE CONVERTED TO OBJECT ***/!!! := OBJECT_CONSTRUCT();
        my_cursor CURSOR
        FOR
            SELECT
                OBJECT_CONSTRUCT( *) sc_cursor_record FROM
                table1;
    BEGIN
        OPEN my_cursor;
        LOOP
            --** SSC-PRF-0003 - FETCH INSIDE A LOOP IS CONSIDERED A COMPLEX PATTERN, THIS COULD DEGRADE SNOWFLAKE PERFORMANCE. **
            FETCH my_cursor INTO
                :my_record;
            IF (my_record IS NULL) THEN
                EXIT;
            END IF;
            is_open_attr := null /*my_cursor%ISOPEN*/ /*** SSC-FDM-OR0038 - BOOLEAN CURSOR ATTRIBUTE %ISOPEN IS NOT SUPPORTED IN SNOWFLAKE ***/;
            found_attr := my_record IS NOT NULL;
        END LOOP;
        CLOSE my_cursor;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-OR0039

Create Type não compatível no Snowflake

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0007.

Descrição

Esta mensagem é adicionada quando uma instrução Create Type não compatível com o Snowflake é utilizada.

Exemplo de código

Código de entrada (Oracle):
 CREATE TYPE type6 UNDER type5(COL1 INTEGER);
Copy
Código gerado:
 ----** SSC-FDM-OR0039 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE **
--CREATE TYPE type6 UNDER type5(COL1 INTEGER)
                                           ;
Copy

Práticas recomendadas

SSC-FDM-OR0040

Caracteres numéricos não podem ser alterados no Snowflake. O separador decimal no Snowflake é o caractere de ponto.

Descrição

Caracteres numéricos não podem ser alterados no Snowflake. O separador decimal no Snowflake é o caractere de ponto. A instrução de sessão ALTER foi transformada em comentário e um aviso foi adicionado.

Exemplo de código

Oracle:
 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.';
Copy
Snowflake Scripting:
 ----** SSC-FDM-OR0040 - NUMERIC CHARACTERS CANNOT BE ALTERED IN SNOWFLAKE. THE DECIMAL SEPARATOR IN SNOWFLAKE IS THE DOT CHARACTER. **
--ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.'
                                               ;
Copy

Práticas recomendadas

SSC-FDM-OR0041

Pacote integrado não compatível.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0076.

Descrição

A tradução para pacotes integrados não é compatível atualmente.

Exemplo de código

Código de entrada (Oracle):
 SELECT
UTL_RAW.CAST_TO_RAW('some magic here'),
DBMS_UTILITY.GET_TIME
FROM DUAL;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0041 - TRANSLATION FOR BUILT-IN PACKAGE 'UTL_RAW.CAST_TO_RAW' IS NOT CURRENTLY SUPPORTED. **
'' AS CAST_TO_RAW,
--** SSC-FDM-OR0041 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_UTILITY.GET_TIME' IS NOT CURRENTLY SUPPORTED. **
'' AS GET_TIME
FROM DUAL;
Copy

Práticas recomendadas

SSC-FDM-OR0042

O tipo Date transformado em Timestamp tem um comportamento diferente.

Descrição

O tipo Date está sendo transformado em tipo Date ou Timestamp dependendo do sinalizador[–disableDateAsTimestamp](../../../user-guide/snowconvert/command-line-interface/oracle.md#–disabledateascarimbo de data/hora), porque o tipo Date no Snowflake tem um comportamento diferente do Oracle.

Principais diferenças

Oráculo DATE

Snowflake DATE

Funcionalidade

Armazena informações de data e hora

Armazena apenas informações de data (ano, mês, dia)

Armazenamento interno

Número binário que representa os segundos desde a época

Formato compacto otimizado para datas

Casos de uso

Armazenamento de data e hora para fins gerais

Cenários em que apenas informações de data são necessárias

Vantagens

Suporta data e hora

Armazenamento mais eficiente para datas

Limitações

Não é possível armazenar componentes de data e hora separadamente.

Não armazena informações de tempo

Exemplo de código

Código de entrada (Oracle):
 CREATE TABLE "PUBLIC"."TABLE1"
(
    "CREATED_DATE" DATE,
    "UPDATED_DATE" DATE
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE "PUBLIC"."TABLE1"
    (
        "CREATED_DATE" TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
        "UPDATED_DATE" TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;
Copy
 -- Additional Params: --disableDateAsTimestamp
CREATE OR REPLACE TABLE "PUBLIC"."TABLE1"
    (
        "CREATED_DATE" DATE /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
        "UPDATED_DATE" DATE /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;
Copy

Práticas recomendadas

SSC-FDM-OR0043

Os parâmetros BFILE/BLOB são considerados binários. Um formato pode ser necessário.

Descrição

Este erro ocorre quando uma função TO_CLOB é convertida em uma função TO_VARCHAR. Um formato pode ser necessário para os parâmetros BFILE/BLOB.

Exemplo de código

Código de entrada:
 SELECT TO_CLOB('Lorem ipsum dolor sit amet') FROM DUAL;
Copy
Código gerado:
 SELECT
--** SSC-FDM-OR0043 - BFILE/BLOB PARAMETERS ARE CONSIDERED BINARY, FORMAT MAY BE NEEDED. **
TO_VARCHAR('Lorem ipsum dolor sit amet')
FROM DUAL;
Copy

Práticas recomendadas

  • Verifique se as saídas no código de entrada e no código convertido são equivalentes e adicione um parâmetro de formato, se necessário.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0044

O parâmetro de correspondência REGEXP_LIKE_UDF pode não se comportar corretamente.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Este aviso aparece quando a condição REGEXP_LIKE do Oracle vem com o terceiro parâmetro (parâmetro de correspondência). O motivo para adicionar o aviso é que o REGEXP_LIKE_UDF utilizado para substituir o REGEXP_LIKE não reconhece todos os caracteres utilizados pelo parâmetro de correspondência; portanto, o resultado da consulta no Snowflake pode não ser equivalente ao do Oracle.

Exemplo de código

Código de entrada Oracle:
 SELECT last_name
FROM hr.employees
WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i')
ORDER BY last_name;
Copy
Código gerado:
 SELECT last_name
FROM
hr.employees
WHERE
--** SSC-FDM-OR0044 - REGEXP_LIKE_UDF MATCH PARAMETER MAY HAVE SOME FUNCTIONAL DIFFERENCES COMPARED TO ORACLE **
PUBLIC.REGEXP_LIKE_UDF(last_name, '([aeiou])\\1', 'i')
ORDER BY last_name;
Copy
  • Quando a condição REGEXP_LIKE vem com um dos caracteres que não são compatíveis com a função definida pelo usuário, uma possível solução é alterar a expressão regular para simular o comportamento do caractere ausente no parâmetro de correspondência. Para saber mais sobre os caracteres não compatíveis, consulte a documentação do REGEXP_LIKE_UDF.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0045

As cláusulas de partições são tratadas pelo Snowflake.

Nota

Esta FDM está obsoleta. Consulte a documentação SSC-EWI-OR0010.

Descrição

Este aviso aparece quando as cláusulas PARTITION e SUBPARTITION aparecem em uma consulta. O Snowflake lida com partições automaticamente.

Exemplo de código

Código de entrada:
 SELECT * FROM TABLITA PARTITION(col1);
Copy
Código gerado:
 SELECT * FROM
TABLITA
--        --** SSC-FDM-OR0045 - PARTITIONS CLAUSES ARE HANDLED BY SNOWFLAKE **
--        PARTITION(col1)
                       ;
Copy

Práticas recomendadas

SSC-FDM-OR0046

A restrição de subconsulta não é possível no Snowflake.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Este aviso ocorre quando uma restrição de subconsulta aparece em uma instrução SELECT.

Exemplo de código

Código de entrada:
 SELECT * FROM LATERAL(SELECT * FROM TABLITA WITH READ ONLY CONSTRAINT T);
Copy
Código gerado:
 SELECT * FROM LATERAL(SELECT * FROM
TABLITA
--        --** SSC-FDM-OR0046 - THE SUBQUERY RESTRICTION IS NOT POSSIBLE IN SNOWFLAKE **
--        WITH READ ONLY CONSTRAINT T
                                   );
Copy

Práticas recomendadas

SSC-FDM-OR0047

Pode ser necessário definir um formato TimeStampOutput.

Descrição

O parâmetro de sessão TIMESTAMP_OUTPUT_FORMAT pode precisar ser definido como «DD-MON-YY HH24.MI.SS.FF AM TZH:TZM» para equivalência de saída de carimbo de data/hora.

Exemplo de código

Código de entrada:
 SELECT SYSTIMESTAMP FROM DUAL;
Copy
Exemplo de saída TIMESTAMP padrão no Oracle

Saída

13-JAN-21 04.18.37.288656 PM +00:00

Código gerado:
 SELECT
CURRENT_TIMESTAMP() /*** SSC-FDM-OR0047 - YOU MAY NEED TO SET TIMESTAMP OUTPUT FORMAT ('DD-MON-YY HH24.MI.SS.FF AM TZH:TZM') ***/
FROM DUAL;
Copy
Exemplo de saída TIMESTAMP padrão no Snowflake

Saída

2021-01-13 08:18:19.720 -080

Práticas recomendadas

  • Para alterar o formato de saída do carimbo de data/hora no Snowflake, use a seguinte consulta:

    ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'DD-MON-YY HH24.MI.SS.FF AM TZH:TZM';
    
  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0049

A função LAG poderá falhar se o tipo do valor padrão for diferente do tipo da expressão.

Descrição

No Oracle, a função LAG converte automaticamente o tipo de dados do valor padrão para corresponder ao tipo da expressão. O Snowflake, no entanto, não realiza essa conversão implícita. Portanto, um aviso é emitido para indicar que a função LAG poderá falhar se os tipos de dados forem incompatíveis.

Exemplo de código

Código de entrada:
 SELECT 
    LAG(salary, 2, '0') OVER (ORDER BY salary) AS salary_two_steps_back
FROM 
    employees;
Copy
Código gerado:
 SELECT
    --** SSC-FDM-OR0049 - LAG FUNCTION MIGHT FAIL IF DEFAULT VALUE TYPE DIFFERS FROM THE EXPRESSION TYPE. **
    LAG(salary, 2, '0')
    OVER (ORDER BY salary) AS salary_two_steps_back
FROM
    employees;
Copy

Práticas recomendadas

  • Verifique se o tipo de dados do valor padrão corresponde ao tipo de dados da expressão na função LAG. Se forem diferentes, converta explicitamente o valor padrão para o tipo de dados da expressão.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-OR0050

Exceções com parâmetros NOCOPY podem levar à inconsistência de dados.

Descrição

No Oracle PL/SQL, a palavra-chave NOCOPY é uma dica de otimização para parâmetros de procedimento OUT e IN OUT. Por padrão, o Oracle passa esses parâmetros por valor, criando uma cópia cara dos dados durante a chamada e copiando-a de volta após a conclusão. Isso pode causar sobrecarga significativa de desempenho para grandes estruturas de dados.

NOCOPY instrui o Oracle a passar por referência, permitindo que o procedimento modifique diretamente os dados originais. Isso elimina a sobrecarga de cópia e melhora o desempenho. No entanto, as alterações são imediatas e não serão revertidas implicitamente se ocorrer uma exceção não tratada dentro do procedimento.

Portanto, vamos remover a opção de parâmetros NOCOPY e adicionar FDM. Isso ocorre porque a execução do procedimento termina ao atingir uma exceção, impedindo que a instrução RETURN seja alcançada. Como resultado, a variável no bloco de declaração do autor da chamada retém seus valores iniciais, pois o procedimento não consegue retornar um novo valor para atribuição.

Exemplo de código

Código de entrada:
CREATE OR REPLACE PROCEDURE calculate_division_with_nocopy (
    p_numerator IN NUMBER,
    p_denominator IN NUMBER,
    p_result OUT NOCOPY NUMBER
)
IS
    PROCEDURE calculate_division(result OUT NOCOPY NUMBER)
    AS
    BEGIN
    result := 20;
    result := p_numerator / p_denominator;
    END calculate_division;
BEGIN
    calculate_division(p_result);
        EXCEPTION
        WHEN OTHERS THEN
            p_result := p_result;
END calculate_division_with_nocopy;
Copy
Código gerado:
CREATE OR REPLACE PROCEDURE calculate_division_with_nocopy (p_numerator NUMBER(38, 18), p_denominator NUMBER(38, 18), p_result OUT NUMBER(38, 18)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/23/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        calculate_division PROCEDURE(result
        --** SSC-FDM-OR0050 - EXCEPTIONS WITH NOCOPY PARAMETERS MAY LEAD TO DATA INCONSISTENCY. **
        NUMBER(38, 18))
        RETURNS NUMBER
        AS
            BEGIN
                result := 20;
                result := :p_numerator / :p_denominator;
                RETURN result;
            END;
        call_results NUMBER;
    BEGIN
        call_results := (
            CALL
            calculate_division(:p_result)
        );
        p_result := :call_results;
        EXCEPTION
        WHEN OTHER THEN
            p_result := :p_result;
        END;
$$;
Copy

Práticas recomendadas