Procedures

Snowflake CREATE PROCEDURE is defined in SQL Syntax whereas its inner statements are defined in JavaScript.

Example 1: Basic Procedure Conversion

Oracle

CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
null;
END;

Snowflake

SnowConvert helpers Code removed from the example. You can find them here.

CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
    null;
$$

Example 2: Procedure Conversion with basic statements: Declaration, Assignment, Cursor Declaration, FOR Cursor, Open, LOOP, CLOSE, IF,

Oracle

CREATE OR REPLACE PROCEDURE PROC1
(
  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 PROC1;

Snowflake

SnowConvert helpers Code removed from the example. You can find them here.

CREATE OR REPLACE PROCEDURE PUBLIC.PROC1
(
  param1 FLOAT
)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
   // REGION SnowConvert Helpers Code
   let LOCALVAR1;
   let COUNTROWS;
   let TEMPSQL;
   let TEMPRESULT;
   let MYCURSOR = new CURSOR(`       SELECT COL1 FROM PUBLIC.Table1`,() => []);
   LOCALVAR1 = PARAM1;
   COUNTROWS = 0;
   // ** MSC-WARNING - MSCEWI1038 - THIS STATEMENT MAY BE A DYNAMIC SQL THAT COULD NOT BE RECOGNIZED AND CONVERTED **
   TEMPSQL = `SELECT COUNT(*) FROM PUBLIC.Table1 WHERE COL1 =${LOCALVAR1}`;
   MYCURSOR.OPEN();
   while ( MYCURSOR.NEXT() ) {
      let MYCURSORITEM = MYCURSOR.CURRENT;
      LOCALVAR1 = MYCURSORITEM.COL1;
      COUNTROWS = COUNTROWS + 1;
   }
   MYCURSOR.CLOSE();
   EXEC(`INSERT INTO PUBLIC.Table2 VALUES(countRows, 'ForCursor: Total Row count is: ' || NVL( countRows, ''))`);
   COUNTROWS = 0;
   MYCURSOR.OPEN();
   while ( true ) {
      MYCURSOR.FETCH(TEMPRESULT) && ([TEMPRESULT] = MYCURSOR.INTO());
      if (MYCURSOR.NOTFOUND()) {
         break;
      }
      COUNTROWS = COUNTROWS + 1;
   }
   MYCURSOR.CLOSE();
   EXEC(`INSERT INTO PUBLIC.Table2 VALUES(countRows, 'LOOP: Total Row count is: ' || NVL( countRows, ''))`);
   [TEMPRESULT] = EXEC(TEMPSQL);
   if (TEMPRESULT > 0) {
      EXEC(`INSERT INTO PUBLIC.Table2 (COL1, COL2) VALUES(tempResult, 'Hi, found value:' || NVL( localVar1, '') || ' in Table1 -- There are ' || NVL( tempResult, '') || ' rows')`);
      EXEC(`COMMIT;`);
   }
$$;

Call of procedures inside other procedure

Oracle

CREATE OR REPLACE PROCEDURE PROCEDURE01(param1 NUMBER, param2 VARCHAR)
IS
BEGIN
INSERT INTO TABLE1 VALUES(param1, param2);
END;

CREATE OR REPLACE PROCEDURE PROCEDURE02(param1 NUMBER, param2 VARCHAR)
IS
BEGIN
PROCEDURE01(param1, param2);
END;

Snowflake

SnowConvert helpers Code removed from the example. You can find them here.

CREATE OR REPLACE PROCEDURE PROCEDURE01(param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
   // REGION SnowConvert Helpers Code
   EXEC(`INSERT INTO PUBLIC.TABLE1 VALUES(?, ?)`,[PARAM1,PARAM2]);
$$;

CREATE OR REPLACE PROCEDURE PROCEDURE02(param1 FLOAT, param2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
   // REGION SnowConvert Helpers Code
   EXEC(`CALL PUBLIC.PROCEDURE01(?, ?)`,[PARAM1,PARAM2]);
$$;

Last updated