SnowConvert AI - Oracle - CREATE PROCEDURE¶
Oracle cria procedimento para Snowflake Snow Scripting
Descrição¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Um procedimento é um grupo de instruções PL/SQL que você pode chamar pelo nome. Uma especificação de chamada declara um método Java ou uma rotina de linguagem de terceira geração (3GL) para que possa ser chamada a partir de SQL e PL/SQL. A especificação de chamada informa ao Oracle Database qual método Java deve ser invocado quando uma chamada é feita. Ele também informa ao banco de dados quais conversões de tipo devem ser feitas para os argumentos e o valor de retorno. Procedimento Create da referência de linguagem Oracle SQL.
Para obter mais informações sobre o procedimento Oracle Create, veja aqui.
Sintaxe de criação de procedimento Oracle¶
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]
PROCEDURE
[ schema. ] procedure_name
[ ( parameter_declaration [, parameter_declaration ]... ) ] [ sharing_clause ]
[ ( default_collation_option | invoker_rights_clause | accessible_by_clause)... ]
{ IS | AS } { [ declare_section ]
BEGIN statement ...
[ EXCEPTION exception_handler [ exception_handler ]... ]
END [ name ] ;
|
{ java_declaration | c_declaration } } ;
Para obter mais informações sobre o procedimento Snowflake Create, veja aqui.
Criação da sintaxe do procedimento no Snowflake¶
CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
RETURNS <result_data_type> [ NOT NULL ]
LANGUAGE SQL
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ]
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS '<procedure_definition>'
Amostra de padrões da origem¶
1. Basic Procedure¶
Oracle¶
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
null;
END;
Script Snow¶
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
null;
END;
$$;
2. Procedure with Different Parameters¶
Oracle¶
CREATE OR REPLACE PROCEDURE proc2
(
p1 OUT INTEGER,
p2 OUT INTEGER,
p3 INTEGER := 1,
p4 INTEGER DEFAULT 1
)
AS
BEGIN
p1 := 17;
p2 := 93;
END;
Script Snow¶
CREATE OR REPLACE PROCEDURE proc2
(p1 OUT INTEGER, p2 OUT INTEGER,
p3 INTEGER DEFAULT 1,
p4 INTEGER DEFAULT 1
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
p1 := 17;
p2 := 93;
END;
$$;
Parâmetros de saída¶
O Snowflake não permite parâmetros de saída em procedimentos; uma maneira de simular esse comportamento poderia ser declarar uma variável e retornar seu valor no final do procedimento.
Parâmetros com valores padrão¶
O Snowflake não permite definir valores padrão para parâmetros em procedimentos; uma maneira de simular esse comportamento poderia ser declarar uma variável com o valor padrão ou sobrecarregar o procedimento.
3. Procedure with Additional Settings¶
Oracle¶
CREATE OR REPLACE PROCEDURE proc3
DEFAULT COLLATION USING_NLS_COMP
AUTHID CURRENT_USER
AS
BEGIN
NULL;
END;
Script Snow¶
CREATE OR REPLACE PROCEDURE proc3 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "11/14/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
NULL;
END;
$$;
4. Procedure with Basic Statements¶
Oracle¶
CREATE OR REPLACE PROCEDURE proc4
(
param1 NUMBER
)
IS
localVar1 NUMBER;
countRows NUMBER;
tempSql VARCHAR(100);
tempResult NUMBER;
CURSOR MyCursor IS SELECT COL1 FROM Table1;
BEGIN
localVar1 := param1;
countRows := 0;
tempSql := 'SELECT COUNT(*) FROM Table1 WHERE COL1 =' || localVar1;
FOR myCursorItem IN MyCursor
LOOP
localVar1 := myCursorItem.Col1;
countRows := countRows + 1;
END LOOP;
INSERT INTO Table2 VALUES(countRows, 'ForCursor: Total Row count is: ' || countRows);
countRows := 0;
OPEN MyCursor;
LOOP
FETCH MyCursor INTO tempResult;
EXIT WHEN MyCursor%NOTFOUND;
countRows := countRows + 1;
END LOOP;
CLOSE MyCursor;
INSERT INTO Table2 VALUES(countRows, 'LOOP: Total Row count is: ' || countRows);
EXECUTE IMMEDIATE tempSql INTO tempResult;
IF tempResult > 0 THEN
INSERT INTO Table2 (COL1, COL2) VALUES(tempResult, 'Hi, found value:' || localVar1 || ' in Table1 -- There are ' || tempResult || ' rows');
COMMIT;
END IF;
END proc3;
Script Snow¶
CREATE OR REPLACE PROCEDURE proc4
(param1 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
localVar1 NUMBER(38, 18);
countRows NUMBER(38, 18);
tempSql VARCHAR(100);
tempResult NUMBER(38, 18);
--** SSC-PRF-0009 - PERFORMANCE REVIEW - CURSOR USAGE **
MyCursor CURSOR
FOR
SELECT COL1 FROM
Table1;
BEGIN
localVar1 := :param1;
countRows := 0;
tempSql := 'SELECT COUNT(*) FROM
Table1
WHERE COL1 =' || NVL(:localVar1 :: STRING, '');
OPEN MyCursor;
--** SSC-PRF-0004 - THIS STATEMENT HAS USAGES OF CURSOR FOR LOOP **
FOR myCursorItem IN MyCursor DO
localVar1 := myCursorItem.Col1;
countRows := :countRows + 1;
END FOR;
CLOSE MyCursor;
INSERT INTO Table2
VALUES(:countRows, 'ForCursor: Total Row count is: ' || NVL(:countRows :: STRING, ''));
countRows := 0;
OPEN MyCursor;
--** SSC-PRF-0008 - PERFORMANCE REVIEW - LOOP USAGE **
LOOP
--** SSC-PRF-0003 - FETCH INSIDE A LOOP IS CONSIDERED A COMPLEX PATTERN, THIS COULD DEGRADE SNOWFLAKE PERFORMANCE. **
FETCH MyCursor INTO
:tempResult;
IF (tempResult IS NULL) THEN
EXIT;
END IF;
countRows := :countRows + 1;
END LOOP;
CLOSE MyCursor;
INSERT INTO Table2
SELECT
:countRows,
'LOOP: Total Row count is: ' || NVL(:countRows :: STRING, '');
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE :tempSql
!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
INTO tempResult;
IF (:tempResult > 0) THEN
INSERT INTO Table2(COL1, COL2)
SELECT
:tempResult,
'Hi, found value:' || NVL(:localVar1 :: STRING, '') || ' in Table1 -- There are ' || NVL(:tempResult :: STRING, '') || ' rows';
--** SSC-FDM-OR0012 - COMMIT REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED **
COMMIT;
END IF;
END;
$$;
5. Procedure with empty RETURN statements¶
Nos procedimentos Oracle, você pode ter instruções RETURN vazias para concluir a execução de um procedimento. No Snowflake Scripting, os procedimentos podem ter instruções RETURN, mas devem ter um valor. Por padrão, todas as instruções vazias de RETURN são convertidas com um valor de NULL.
Oracle¶
-- Procedure with empty return
CREATE OR REPLACE PROCEDURE MY_PROC
IS
BEGIN
NULL;
RETURN;
END;
Script Snowflake¶
-- Procedure with empty return
CREATE OR REPLACE PROCEDURE MY_PROC ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
NULL;
RETURN NULL;
END;
$$;
RETURN em procedimentos com parâmetros de saída¶
Nos procedimentos com parâmetros de saída, em vez de um valor NULL, um OBJECT_CONSTRUCT será usado nas instruções vazias RETURN para simular os parâmetros de saída no Snowflake Scripting.
Oracle¶
CREATE OR REPLACE PROCEDURE PROC_WITH_OUTPUT_PARAMETERS (
param1 OUT NUMBER,
param2 OUT NUMBER,
param3 NUMBER
)
IS
BEGIN
IF param3 > 0 THEN
param1 := 2;
param2 := 1000;
RETURN;
END IF;
param1 := 5;
param2 := 3000;
END;
Script Snowflake¶
CREATE OR REPLACE PROCEDURE PROC_WITH_OUTPUT_PARAMETERS (param1 OUT NUMBER(38, 18), param2 OUT NUMBER(38, 18), param3 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/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
IF (:param3 > 0) THEN
param1 := 2;
param2 := 1000;
RETURN NULL;
END IF;
param1 := 5;
param2 := 3000;
END;
$$;
6. Procedure with DEFAULT parameters¶
DEFAULT permitem que os parâmetros nomeados sejam inicializados com valores padrão se nenhum valor for passado.
Oracle¶
CREATE OR REPLACE PROCEDURE TEST(
X IN VARCHAR DEFAULT 'P',
Y IN VARCHAR DEFAULT 'Q'
)
AS
varX VARCHAR(32767) := NVL(X, 'P');
varY NUMBER := NVL(Y, 1);
BEGIN
NULL;
END TEST;
BEGIN
TEST(Y => 'Y');
END;
Script Snowflake¶
CREATE OR REPLACE PROCEDURE TEST (
X VARCHAR DEFAULT 'P',
Y VARCHAR DEFAULT 'Q'
)
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
$$
DECLARE
varX VARCHAR(32767) := NVL(:X, 'P');
varY NUMBER(38, 18) := NVL(:Y, 1);
BEGIN
NULL;
END;
$$;
DECLARE
call_results VARIANT;
BEGIN
CALL
TEST(Y => 'Y');
RETURN call_results;
END;
Problemas conhecidos¶
1. Unsupported OUT parameters¶
Os procedimentos do Snowflake não têm uma opção nativa para parâmetros de saída.
2. Unsupported Oracle additional settings¶
As seguintes configurações e cláusulas do Oracle não são compatíveis com os procedimentos do Snowflake:
sharing_clausedefault_collation_optioninvoker_rights_clauseaccessible_by_clausejava_declarationc_declaration