SnowConvert AI - Teradata - SQL을 JavaScript로 변환(프로시저)

GET DIAGNOSTICS EXCEPTION

Teradata GET DIAGNOSTICS EXCEPTION 문을 Snowflake Scripting으로 변환하기 위한 변환 참조

설명

GET DIAGNOSTICS 는 진단 영역에서 성공, 예외 또는 완료 조건에 대한 정보를 검색합니다.

Teradata GET DIAGNOSTICS 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

 GET DIAGNOSTICS
{
  [ EXCEPTION < condition_number >
    [ < parameter_name | variable_name > = < information_item > ]...
  ] 
  |
  [ < parameter_name | variable_name > = < information_item > ]...
}
Copy

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

샘플 소스 패턴

Teradata

쿼리
 -- Additional Params: -t JavaScript
CREATE PROCEDURE getDiagnosticsSample ()
BEGIN
    DECLARE V_MESSAGE, V_CODE VARCHAR(200);
    DECLARE V_Result INTEGER;
    SELECT c1 INTO V_Result FROM tab1;
    GET DIAGNOSTICS EXCEPTION 1 V_MESSAGE = MESSAGE_TEXT;
END;
Copy
Snowflake
Javascript
 CREATE OR REPLACE PROCEDURE getDiagnosticsSample ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var V_MESSAGE;
    var V_CODE;
    var V_RESULT;
    EXEC(`SELECT c1 FROM tab1`,[]);
    [V_RESULT] = INTO();
    V_MESSAGE = MESSAGE_TEXT;
$$;
Copy

문제 파악

  1. 지원되지 않는 조건 특성 문

    1. CLASS_ORIGIN

    2. CONDITION_IDENTIFIER

    3. CONDITION_NUMBER

    4. MESSAGE_LENGTH

    5. RETURNED_SQLSTATE

    6. SUBCLASS_ORIGIN

If

IF 문 의 변환은 다음과 같습니다.

Teradata

 IF value = 2 THEN
Copy

Snowflake

 if(value == 2){
}
Copy

Case

Case 문 의 변환은 다음과 같습니다.

Teradata

 case value
when 0 then
  select * from table1
else
  update table1 set name = "SpecificValue" where id = value;
end case
Copy

Snowflake

 switch(value) {
    case 0:EXEC(`SELECT * FROM PUBLIC.table1`,[]);
        break;
    default:EXEC(`UPDATE PUBLIC.table1 set name = "SpecificValue" where id = value`,[]);
        break;
}
Copy

Cursor Declare, OPEN, FETCH 및 CLOSE

cursor 문 의 변환은 다음과 같습니다.

Teradata

Cursor

 -- Additional Params: -t JavaScript
CREATE PROCEDURE procedure1()               
DYNAMIC RESULT SETS 2
BEGIN

    -------- Local variables --------
    DECLARE sql_cmd VARCHAR(20000) DEFAULT ' '; 
    DECLARE num_cols INTEGER;
    
    ------- Declare cursor with return only-------
    DECLARE resultset CURSOR WITH RETURN ONLY FOR firststatement;

    ------- Declare cursor -------
    DECLARE cur2 CURSOR FOR SELECT COUNT(columnname) FROM table1;
    
    -------- Set --------
    SET sql_cmd='sel * from table1';
    
    -------- Prepare cursor --------
    PREPARE firststatement FROM sql_cmd; 
    
    -------- Open cursors --------
    OPEN resultset;		
    OPEN cur1;

    -------- Fetch -------------
    FETCH cur1 INTO val1, val2;
    
    -------- Close cursor --------
    CLOSE cur1;
END;
Copy

Snowflake

JavaScript Cursor

 CREATE OR REPLACE PROCEDURE procedure1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    //------ Local variables --------
    var SQL_CMD = ` `;
    var NUM_COLS;
    var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
    //----- Declare cursor -------
    var CUR2 = new CURSOR(`SELECT COUNT(columnname) FROM table1`,[],false);
    //------ Set --------
    SQL_CMD = `SELECT * from table1`;
    //------ Prepare cursor --------
    var FIRSTSTATEMENT = SQL_CMD;
    //------ Open cursors --------
    RESULTSET.OPEN();
    CUR1.OPEN();
    //------ Fetch -------------
    CUR1.FETCH() && ([val1,val2] = CUR1.INTO());
    //------ Close cursor --------
    CUR1.CLOSE();
    return PROCRESULTS();
$$;
Copy

While

while 문 의 변환은 다음과 같습니다.

Teradata

동안

 while (counter < 10) do
    set counter = counter + 1;
Copy

Snowflake

동안

 while ( counter < 10) {
    counter = counter + 1;
}
Copy

Security

security 문 의 변환은 다음과 같습니다.

Teradata

Snowflake

SQL SECURITY CREATOR

EXECUTE AS OWNER

SQL SECURITY INVOKER

EXECUTE AS CALLER

SQL SECURITY DEFINER

EXECUTE AS OWNER

FOR-CURSOR-FOR loop

FOR-CURSOR-FOR 루프 의 변환은 다음과 같습니다.

Teradata

For-Cursor-For-Loop

-- Additional Params: -t JavaScript
REPLACE PROCEDURE Database1.Proc1()
BEGIN
    DECLARE lNumber INTEGER DEFAULT 1;
    FOR class1 AS class2 CURSOR FOR 
      SELECT COL0,
      TRIM(COL1) AS COL1ALIAS,
      TRIM(COL2),
      COL3
      FROM someDb.prefixCol
    DO
      INSERT INTO TempDB.Table1 (:lgNumber, :lNumber, (',' || :class1.ClassCD || '_Ind CHAR(1) NOT NULL'));
      SET lNumber = lNumber + 1;
    END FOR;
END;
Copy

Snowflake

JavaScript For-Cursor-For-Loop

 CREATE OR REPLACE PROCEDURE Database1.Proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var LNUMBER = 1;
    /*** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT ***/
    for(var CLASS2 = new CURSOR(`SELECT
   COL0,
   TRIM(COL1) AS COL1ALIAS,
   TRIM(COL2),
   COL3
FROM
   someDb.prefixCol`,[],false).OPEN();CLASS2.NEXT();) {
        let CLASS1 = CLASS2.CURRENT;
        EXEC(`INSERT INTO TempDB.Table1
VALUES (:lgNumber, :1, (',' || :
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE  VARIABLE class1.ClassCD MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
:2 || '_Ind CHAR(1) NOT NULL'))`,[LNUMBER,CLASS1.CLASSCD]);
        LNUMBER = LNUMBER + 1;
    }
    CLASS2.CLOSE();
$$;
Copy

참고: Teradata 프로시저에 있는 FOR 루프는 Javascript에서 해당 기능을 에뮬레이션하는 FOR 블록으로 변환됩니다.

문 내에서 참조되는 프로시저 매개 변수 및 변수

프로시저의 문에서 참조되는 프로시저 매개 변수 및 변수에 대한 변환은 다음과 같습니다.

Teradata

매개 변수 및 변수

 -- Additional Params: -t JavaScript
REPLACE PROCEDURE PROC1 (param1 INTEGER, param2 VARCHAR(30))
BEGIN
    DECLARE var1          VARCHAR(1024); 
    DECLARE var2          SMALLINT;
    DECLARE weekstart date;                                 
    set weekstart= '2019-03-03';
    set var1 = 'something';
    set var2 = 123;

    SELECT * FROM TABLE1 WHERE SOMETHING = :param1;
    SELECT * FROM TABLE1 WHERE var1 = var1 AND date1 = weekstart AND param2 = :param2;
    INSERT INTO TABLE2 (col1, col2, col3, col4, col5) VALUES (:param1, :param2, var1, var2, weekstart);
END;
Copy

Snowflake

JavaScript 매개 변수 및 변수

 CREATE OR REPLACE PROCEDURE PROC1 (PARAM1 FLOAT, PARAM2 STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var VAR1;
    var VAR2;
    var WEEKSTART;
    WEEKSTART = `2019-03-03`;
    VAR1 = `something`;
    VAR2 = 123;
    // ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
    EXEC(`SELECT * FROM TABLE1 WHERE SOMETHING = :1`,[PARAM1]);
    // ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
    EXEC(`SELECT * FROM TABLE1 WHERE :1 = :1 AND date1 = :2 AND param2 = :3`,[VAR1,WEEKSTART,PARAM2]);
    // ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
    EXEC(`INSERT INTO TABLE2 (col1, col2, col3, col4, col5) VALUES (:1, :2, :3, :4, :5)`,[PARAM1,PARAM2,VAR1,VAR2,WEEKSTART]);
$$;
Copy

_참고: 프로시저 매개 변수 또는 프로시저 내부에서 선언된 변수가 변환되어야 하는 Teradata 문 내에서 참조될 때마다 _ 이 참조는 원래 참조의 기능을 유지하기 위해 결과 텍스트에서 이스케이프됩니다.

Leave

Javascript에서는 break 를 추가 매개 변수와 함께 사용하여 Teradata LEAVE 점프의 동작을 에뮬레이션할 수 있습니다.

레이블은 Javascript 레이블 문을 사용하여 에뮬레이션할 수도 있습니다.

LEAVE 문 의 변환은 다음과 같습니다.

Teradata

Leave

-- Additional Params: -t JavaScript
REPLACE PROCEDURE  PROC1 ()
BEGIN
  DECLARE v_propval            VARCHAR(1024);
 
 DECLARE Cur1 cursor for 
   Select 
      propID
   from viewName.viewCol
   where propval is not null;

LABEL_WHILE:
  WHILE (SQLCODE = 0)
  DO
      IF (SQLSTATE = '02000' ) 
       THEN LEAVE LABEL_WHILE;
      END IF;
      LABEL_INNER_WHILE:
      WHILE (SQLCODE = 0)
      DO
        IF (SQLSTATE = '02000' ) 
          THEN LEAVE LABEL_INNER_WHILE;
        END IF;
      END WHILE LABEL_INNER_WHILE;
      SELECT * FROM TABLE1;
  END WHILE L1;
END;
Copy

Snowflake

JavaScript Leave

 CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
 // SnowConvert AI Helpers Code section is omitted.

 var V_PROPVAL;
 var CUR1 = new CURSOR(`SELECT propID from viewName.viewCol
  where
  propval is not null`,[],false);
  LABEL_WHILE: {
  while ( SQLCODE == 0 ) {
   if (SQLSTATE == `02000`) {
    break LABEL_WHILE;
   }
   LABEL_INNER_WHILE: {
    while ( SQLCODE == 0 ) {
     if (SQLSTATE == `02000`) {
      break LABEL_INNER_WHILE;
     }
    }
   }
   EXEC(`SELECT * FROM TABLE1`,[]);
  }
 }
$$;
Copy

프로시저에서 결과 가져오기

변환에 대한 설명

Teradata에서는 프로시저에서 데이터를 반환하는 두 가지 방법이 있습니다. 첫 번째는 출력 매개 변수를 통해, 두 번째는 Dynamic Result Sets 및 _Cursors_를 통해 수행되며, 다음 예시에서는 두 가지를 모두 보여줍니다. 각 중요 사항은 아래에 설명되어 있습니다.

저장 프로시저에서 데이터를 반환하는 예제

Teradata

출력 매개 변수

-- Additional Params: -t JavaScript
REPLACE PROCEDURE Procedure1(OUT P1 INTEGER)               
    DYNAMIC RESULT SETS 2
    BEGIN
        DECLARE SQL_CMD,SQL_CMD_1  VARCHAR(20000) DEFAULT ' ';
        DECLARE RESULTSET CURSOR WITH RETURN ONLY FOR FIRSTSTATEMENT;
        SET SQL_CMD = 'SEL * FROM EMPLOYEE';
        PREPARE FIRSTSTATEMENT FROM SQL_CMD; 
        OPEN RESULTSET;
        SET P1 = (SEL CAST(AVG(AGE) AS INTEGER) FROM EMPLOYEE);
    END;
Copy

Snowflake

JavaScript 출력 매개 변수
 CREATE OR REPLACE PROCEDURE Procedure1 (P1 FLOAT)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var SQL_CMD = ` `;
    var SQL_CMD_1 = ` `;
    var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
    SQL_CMD = `SELECT * FROM EMPLOYEE`;
    var FIRSTSTATEMENT = SQL_CMD;
    RESULTSET.OPEN();
    EXEC(`(
   SELECT
      CAST(AVG(AGE) AS INTEGER)
   FROM
      EMPLOYEE
)`,[]);
    var subQueryVariable0;
    [subQueryVariable0] = INTO();
    P1 = subQueryVariable0;
    return PROCRESULTS(P1);
$$;
Copy

이 변환된 SQL 에서는 몇 가지 변환이 수행됩니다.

  • DYNAMIC RESULT SETS 2 정의는 DYNAMIC_RESULTS 변수로 변환됩니다.

     var DYNAMIC_RESULTS = 2;
    
Copy
  • WITH RETURN 특성이 있는 커서가 열리면(따라서 쿼리가 실행되면) 해당 쿼리 ID 는 나중에 반환될 수 있도록_ OUTQUERIES 컬렉션에 저장됩니다. 쿼리 ID는 Snowflake 저장 프로시저의 JavaScript API 에서 제공되는 getQueryId() 함수로 가져올 수 있습니다.

  • 첫 번째 k-query-IDs 만 컬렉션에 저장되며, 여기서 k는 DYNAMIC_RESULTS 변수의 값입니다. 이는 저장 프로시저에서 더 많은 커서가 열려 있어도 첫 번째 k-열린 커서만 반환하는 Teradata의 동작을 에뮬레이션하기 위해 수행됩니다.

  • DECLARE CURSOR WITH RETURNPREPARE 의 조합은 다음과 같이 변환됩니다.

     var RESULTSET = new CURSOR(() => FIRSTSTATEMENT,[],true);
    
Copy
  • 출력 매개 변수는 프로시저의 반환 문을 통해 지원됩니다. 각 출력 매개 변수의 값과 _OUTQUERIES 컬렉션이 포함된 배열이 생성됩니다. PROCRESULTS 함수는 이 배열의 생성 및 채우기를 처리합니다. 자세한 내용은 PROCRESULTS() 헬퍼를 참조하십시오.

     return PROCRESULTS(P1);
    
Copy

저장 프로시저에서 데이터 가져오기 예제

프로시저에서 출력 매개 변수와 IDs 쿼리가 반환되는 경우 아래 그림과 같이 두 번째 프로시저가 첫 번째 프로시저를 호출하여 이러한 값을 가져올 수 있습니다.

Teradata

프로시저 호출

 -- Additional Params: -t JavaScript
CREATE PROCEDURE Procedure2()
BEGIN
    DECLARE x INTEGER;
    CALL Procedure1(x);
END;
Copy

Snowflake

JavaScript 프로시저 호출
 CREATE OR REPLACE PROCEDURE Procedure2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var X;
    EXEC(`CALL Procedure1(:1)`,[X]);
$$;
Copy
  • Procedure1P1 인자 값이 반환되어 X 변수에 저장됩니다.

  • Procedure1 에서 반환된_ OUTQUERIESresultset 변수에 저장됩니다.

참고

이 동작은 INOUT 매개 변수에도 적용됩니다.

Known Issues

문제가 발견되지 않았습니다.

관련 EWIs

  1. SSC-EWI-0022: 이 문에 있는 하나 이상의 식별자는 기본적으로 매개 변수로 간주됩니다.

  2. SSC-EWI-0023: 성능 검토 - 루프에는 삽입, 삭제 또는 업데이트 문이 포함되어 있습니다.

  3. SSC-EWI-0026: 변수에 날짜, 시간 또는 타임스탬프에 대한 형변환이 필요할 수 있습니다.

  4. SSC-FDM-TD0001: 이 메시지는 SnowConvert AI가 BLOB 데이터 타입을 발견한 경우에 표시됩니다.