SnowConvert: PostgreSQL 기능 차이

SSC-FDM-PG0001

심각도

낮음

설명

PostgreSQL 의 FOUND 속성은 가장 최근 쿼리에서 결과가 반환되었는지 여부를 나타냅니다. 이 속성은 INSERT, UPDATE, DELETE, MERGE, SELECT INTO, PERFORM, FETCHFOR 루프를 포함한 여러 SQL 명령으로 수정할 수 있습니다. 자세한 내용은 PostgreSQL 설명서 를 참조하십시오.

Snowflake에서는 어떤 시나리오에서도 이 속성에 대한 직접적인 상응하는 속성이 없습니다.

  • INSERT

  • UPDATE

  • DELETE

  • MERGE

코드는 Snowflake SQLFOUND 속성으로 변환됩니다(설명서), 이 속성은 PostgreSQL 의 FOUND 속성과 유사한 기능을 함).

  • SELECT INTO - 쿼리에서 데이터를 검색하여 변수에 저장합니다

  • PERFORM - 쿼리를 실행하고 결과를 삭제합니다

  • FETCH - 커서에서 행을 변수로 검색합니다

이 코드는 PostgreSQL 에서 FOUND 속성의 기능을 복제하는 IS_FOUND_UDF 라는 사용자 정의 함수(UDF)를 생성합니다.

SQLFOUND 변수는 쿼리가 데이터베이스에서 행을 1개 이상 수정할 때만 값을 업데이트합니다. 가장 최근 쿼리가 행을 수정하지 않으면 SQLFOUND 값은 변경되지 않습니다.

IS_FOUND_UDF 함수는 문이 1개 이상의 행을 반환하는 경우에만 TRUE 를 반환합니다. 문이 행을 반환하지 않으면 함수는 FALSE 를 반환합니다.

SQLFOUND의 예
 INSERT INTO SampleTable (SampleColumn1)
VALUES ('SampleValue0.1');
Copy

이 쿼리는 테이블을 수정하므로 SQLFOUND 는 PostgreSQL 의 동작과 가장 유사한 기능을 제공합니다.

IS_FOUND_UDF 예제
 SELECT SampleColumn FROM SampleTable;
Copy

IS_FOUND_UDF() 함수는 데이터를 변경하지 않고 행을 반환하므로 PostgreSQL 의 동작과 가장 유사합니다.

IS_FOUND_UDF 소스 코드
 CREATE OR REPLACE FUNCTION FOUND_UDF() 
RETURNS BOOLEAN
LANGUAGE SQL
IMMUTABLE
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "udf",  "convertedOn": "09/09/2024" }}'
AS
$$
SELECT (count(*) != 0) FROM TABLE(result_scan(last_query_id()))
$$;
Copy

코드 예제

문 삽입:
 -- Found property used with INSERT statement.
CREATE OR REPLACE FUNCTION FoundUsingInsertFunction()
RETURNS BOOLEAN
AS
$$
  BEGIN
    INSERT INTO SampleTable (SampleColumn1)
    VALUES ('SampleValue0.1');
    RETURN FOUND;
  END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with INSERT statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingInsertFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
  BEGIN
    INSERT INTO SampleTable (SampleColumn1)
    VALUES ('SampleValue0.1');
    RETURN SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
  END;
$$;
Copy
Update 문
 -- Found property used with UPDATE statement.
CREATE OR REPLACE FUNCTION FoundUsingUpdateFunction()
RETURNS BOOLEAN
AS
$$
    BEGIN
        UPDATE SampleTable 
        SET SampleColumn1 = 'SampleValue0.1' 
        WHERE SampleColumn1 = 'SampleValue0.1';
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with UPDATE statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingUpdateFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
    BEGIN
        UPDATE SampleTable
        SET SampleColumn1 = 'SampleValue0.1'
        WHERE SampleColumn1 = 'SampleValue0.1';
        RETURN SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Delete 문
 -- Found property used with DELETE statement.
CREATE OR REPLACE FUNCTION FoundUsingDeleteFunction()
RETURNS BOOLEAN
AS
$$
    BEGIN
        DELETE FROM SampleTable 
        WHERE SampleColumn1 = 'SampleValue0.1';
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with DELETE statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingDeleteFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
    BEGIN
        DELETE FROM
            SampleTable
        WHERE SampleColumn1 = 'SampleValue0.1';
        RETURN SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
문 병합
 -- Found property used with MERGE statement.
CREATE OR REPLACE FUNCTION FoundUsingMergeFunction()
RETURNS BOOLEAN
AS
$$
    BEGIN
        MERGE INTO SampleTableB B
        USING (SELECT * FROM SampleTableA) A
        ON B.SampleColumn1 = A.SampleColumn2
        WHEN MATCHED THEN DELETE;
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with MERGE statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingMergeFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
    BEGIN
        MERGE INTO SampleTableB B
        USING (SELECT * FROM SampleTableA) A
        ON B.SampleColumn1 = A.SampleColumn2
        WHEN MATCHED THEN DELETE !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'MergeStatement' NODE ***/!!!;
        RETURN SQLFOUND /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
Select Into 문
 -- Found property used with SELECT INTO statement.
CREATE OR REPLACE FUNCTION FoundUsingSelectIntoFunction()
RETURNS BOOLEAN
AS
$$
    DECLARE 
        SampleNumber INTEGER;
    BEGIN
        SELECT 1 INTO SampleNumber;
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with SELECT INTO statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingSelectIntoFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
    DECLARE
        SampleNumber INTEGER;
    BEGIN
        SELECT 1 INTO
            : SampleNumber;
        RETURN FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
문 실행:
 -- Found property used with PERFORM statement.
CREATE OR REPLACE FUNCTION FoundUsingPerformFunction()
RETURNS BOOLEAN
AS
$$
    BEGIN
        PERFORM 1;
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with PERFORM statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingPerformFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
    BEGIN
        SELECT
            1;
        RETURN FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
    END;
$$;
Copy
문 가져오기:
 -- Found property used with FETCH statement.
CREATE OR REPLACE FUNCTION FoundUsingFetchFunction ()
RETURNS BOOLEAN
AS
$$
    DECLARE
        SampleRow VARCHAR;
        SampleCursor CURSOR FOR SELECT EmptyColumn FROM EmptyTable;
    BEGIN
        OPEN SampleCursor;
        FETCH SampleCursor;
        CLOSE SampleCursor;
        RETURN FOUND;
    END;
$$
LANGUAGE plpgsql;
Copy
 -- Found property used with FETCH statement.
!!!RESOLVE EWI!!! /*** SSC-EWI-GP0003 - RETURNING FUNCTION TRANSLATED TO STORED PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FoundUsingFetchFunction ()
RETURNS BOOLEAN
LANGUAGE SQL
AS
$$
   DECLARE
       SampleRow VARCHAR;
       SampleCursor CURSOR FOR SELECT EmptyColumn FROM
           EmptyTable;
   BEGIN
       OPEN SampleCursor;
       !!!RESOLVE EWI!!! /*** SSC-EWI-PG0015 - FETCH CURSOR WITHOUT TARGET VARIABLES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
       FETCH SampleCursor;
       CLOSE SampleCursor;
       RETURN FOUND_UDF() /*** SSC-FDM-PG0001 - FOUND COULD HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE IN SOME SCENARIOS. ***/;
   END;
$$;
Copy

모범 사례

SSC-FDM-PG0002

설명

이 경고는 Snowflake에서 bpchar(빈칸으로 채워진 문자) 데이터 타입이 varchar와 다르게 작동할 수 있기 때문에 제공됩니다. 두 데이터 타입 모두 최대 “n”개의 문자를 저장할 수 있고 실제 데이터 길이에 따라 저장 공간을 사용할 수 있지만, 후행 공백은 다르게 처리합니다. bpchar에서는 후행 공백이 저장되지 않지만, Snowflake의 varchar는 후행 공백을 보존합니다.

불필요한 공백을 저장하지 않으려면 RTRIM 함수를 사용하면 됩니다. 그러나 경우에 따라 원본 코드와 정확히 동일한 기능을 제공하지 못할 수도 있습니다.

코드 예제

입력 코드:
 CREATE TABLE table1 (
    col1 BPCHAR, 
    col2 BPCHAR(20)
);
Copy
SELECT 'Y'::BPCHAR;

SELECT 'Y   '::BPCHAR(20);
SELECT COL1::BPCHAR(20) FROM tbl;
Copy
생성된 코드:
 CREATE TABLE table1 (
    col1 VARCHAR /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/,
    col2 VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy
 SELECT 'Y':: VARCHAR /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/;

SELECT
    RTRIM( 'Y   ') :: VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/;

SELECT
    RTRIM( COL1) :: VARCHAR(20) /*** SSC-FDM-PG0002 - BPCHAR CONVERTED TO VARCHAR. THESE TYPES MAY HAVE SOME FUNCTIONAL DIFFERENCES. ***/
FROM
    tbl;
Copy

모범 사례

  • rtrim 함수는 후행 공백을 제거하여 저장소 차이를 해결하는 데 도움이 될 수 있습니다. 명시적 형변환 은 이 작업을 자동으로 처리하지만, 다른 상황에서는 rtrim 을 수동으로 사용해야 할 수도 있습니다. 자세한 내용은 Snowflake RTRIM 설명서의 rtrim 섹션을 참조하십시오.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.

SSC-FDM-PG0003

설명

이 경고는 데이터를 바이트 형식에서 이진 형식으로 변환하면 최대 크기 제한이 1기가바이트(GB)에서 8메가바이트(MB)로 크게 줄어든다는 것을 나타냅니다.

코드 예제

입력 코드:
CREATE TABLE tbl(
    col BYTEA
);
Copy
생성된 코드:
 CREATE TABLE tbl (
    col BINARY /*** SSC-FDM-PG0003 - BYTEA CONVERTED TO BINARY. SIZE LIMIT REDUCED FROM 1GB TO 8MB ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

모범 사례

SSC-FDM-PG0004

설명

날짜 출력 형식은 타임스탬프 유형과 timestamp_output_format 설정이라는 두 가지 요소에 따라 달라집니다. 자세한 내용은 Snowflake 설명서 를 참조하십시오.

코드 예제

입력 코드:
 CREATE TABLE table1 (
    dt_update timestamp without time zone DEFAULT clock_timestamp()
);
Copy
생성된 코드:
 CREATE TABLE table1 (
    dt_update TIMESTAMP_NTZ DEFAULT CAST(
    --** SSC-FDM-PG0004 - THE DATE OUTPUT FORMAT MAY VARY DEPENDING ON THE TIMESTAMP TYPE AND THE TIMESTAMP_OUTPUT_FORMAT BEING USED. **
    CURRENT_TIMESTAMP() AS TIMESTAMP_NTZ)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "09/17/2024" }}';
Copy

테이블 생성하기: 기본 예제

이 예는 데이터베이스에서 테이블을 생성하는 방법을 보여줍니다.

입력 코드:

 CREATE TABLE sample2 (
    platform_id integer NOT NULL,
    dt_update timestamp with time zone DEFAULT clock_timestamp()
);
    
insert into postgres.public.sample2 (platform_id) values (1);
   
select *, clock_timestamp() from postgres.public.sample2;
Copy
 platform_id|dt_update                    |clock_timestamp              |
-----------+-----------------------------+-----------------------------+
          1|2023-02-05 22:47:34.275 -0600|2023-02-05 23:16:15.754 -0600|
Copy
생성된 코드:
 CREATE TABLE sample2 (
    platform_id integer NOT NULL,
    dt_update TIMESTAMP_TZ DEFAULT CAST(
--** SSC-FDM-PG0004 - THE DATE OUTPUT FORMAT MAY VARY DEPENDING ON THE TIMESTAMP TYPE AND THE TIMESTAMP_OUTPUT_FORMAT BEING USED. **
CURRENT_TIMESTAMP() AS TIMESTAMP_TZ)
);

insert into postgres.public.sample2 (platform_id) values (1);
ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';

select *,
CURRENT_TIMESTAMP(3)
from
postgres.public.sample2;
Copy
 PLATFORM_ID   DT_UPDATE	                        CURRENT_TIMESTAMP(3)
1	      2023-02-05 20:52:30.082000000	2023-02-05 21:20:31.593
Copy

clock_timestamp()와 함께 SELECT 사용 - 예제

입력 코드
 select clock_timestamp();
Copy
 clock_timestamp        |
-----------------------+
2023-02-05 23:24:13.740|
Copy
출력 코드
 ALTER SESSION SET timestamp_output_format = 'YYYY-MM-DD HH24:MI:SS.FF';
select
    CURRENT_TIMESTAMP(3);
Copy
 CURRENT_TIMESTAMP(3)
2023-02-05 21:29:24.258
Copy

모범 사례

SSC-FDM-PG0006

설명

검색 경로에 여러 스키마를 설정하는 것은 Snowflake에서 지원되지 않습니다. 스키마 사용법에 대한 자세한 내용은 Snowflake 설명서 를 참조하십시오.

코드 예제

입력 코드:
 SET SEARCH_PATH TO schema1, schema2, schema3;
Copy
생성된 코드:
 --** SSC-FDM-PG0006 - SET SEARCH PATH WITH MULTIPLE SCHEMAS IS NOT SUPPORTED IN SNOWFLAKE **
USE SCHEMA schema1 /*, schema2, schema3*/;
Copy

모범 사례

SSC-FDM-PG0007

심각도

낮음

설명

PostgreSQL 에서 설명을 제거하려면 NULL 을 사용합니다. 그러나 Snowflake에서는 빈 문자열('')을 대신 사용해야 합니다. 두 방법 모두 설명을 제거한다는 동일한 결과를 얻을 수 있습니다.

코드 예제

입력 코드:
 COMMENT ON TABLE mytable IS NULL;
Copy
생성된 코드:
 COMMENT ON TABLE mytable IS '' /*** SSC-FDM-PG0007 - NULL IS CONVERTED TO '' AND MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/;
Copy

모범 사례

SSC-FDM-PG0008

설명

SELECT INTO 문은 Snowflake에서 사용할 수 없습니다. 대신 CREATE TABLE AS 를 사용하여 유사한 기능을 구현할 수 있습니다. 또한 Snowflake는 모든 테이블의 트랜잭션 로그를 자동으로 유지 관리하여 데이터 무결성 및 복구 기능을 보장합니다. 따라서 UNLOGGED 옵션이 있는 테이블은 Snowflake에서 지원되지 않습니다.

코드 예제

입력 코드:
 select column1
      into UNLOGGED NewTable
      from oldTable;
Copy
출력 코드:
 CREATE TABLE IF NOT EXISTS NewTable AS
      select column1
--      --** SSC-FDM-PG0008 - SELECT INTO UNLOGGED TABLES ARE NOT SUPPORTED BY SNOWFLAKE. **
--            into UNLOGGED NewTable
            from
            oldTable;
Copy

모범 사례

SSC-FDM-PG0009

설명

Snowflake의 시퀀스 번호 사이에 공백이 있을 수 있습니다. 숫자는 항상 증가하지만(음수 스텝 크기를 사용하는 경우 감소) 연속적이지 않을 수 있습니다.

코드 예제

입력 코드:
 SELECT nextval('seq1');
Copy
출력 코드:
 SELECT seq1.nextval /*** SSC-FDM-PG0009 - THE SEQUENCE NEXTVAL PROPERTY SNOWFLAKE DOES NOT GUARANTEE GENERATING SEQUENCE NUMBERS WITHOUT GAPS. ***/;
Copy

권장 사항

SSC-FDM-PG0010

설명

PostgreSQL 비트 단위 시프트 연산자 << and >>는 Snowflake의 BITSHIFTLEFTBITSHIFTRIGHT 함수로 변환됩니다. 이러한 함수는 식 처리의 차이로 인해 PostgreSQL 과 비교하여 Snowflake에서 다른 결과를 생성할 수 있습니다.

코드 예제

입력 코드:
 SELECT 1 << 127 AS resultShiftedLeft, 16 >> 32 AS resultShiftedRight;
Copy

resultShiftedLeft

resultShiftedRight

-2147483648

16

출력 코드:
 SELECT
--** SSC-FDM-PG0010 - RESULTS MAY VARY DUE TO THE BEHAVIOR OF SNOWFLAKE'S BITSHIFTLEFT BITWISE FUNCTION **
BITSHIFTLEFT( 1, 127) AS resultShiftedLeft,
--** SSC-FDM-PG0010 - RESULTS MAY VARY DUE TO THE BEHAVIOR OF SNOWFLAKE'S BITSHIFTRIGHT BITWISE FUNCTION **
BITSHIFTRIGHT( 16, 32) AS resultShiftedRight;
Copy

resultShiftedLeft

resultShiftedRight

-170141183460469231731687303715884105728

0

권장 사항

SSC-FDM-PG0011

설명

이 메시지는 패턴 일치에 COLLATE 사양이 인자에 포함된 경우에 표시됩니다. Snowflake의 정규식 함수는 COLLATE 사양을 지원하지 않으므로 COLLATE 절을 제거해야 합니다. 이 절을 제거하면 소스 데이터베이스와 다른 결과가 나올 수 있습니다.

코드 예제

입력 코드:
 CREATE TABLE collateTable (
col1 VARCHAR(20) COLLATE CASE_INSENSITIVE,
col2 VARCHAR(30) COLLATE CASE_SENSITIVE);

INSERT INTO collateTable values ('HELLO WORLD!', 'HELLO WORLD!');

SELECT
col1 SIMILAR TO 'Hello%' as ci,
col2 SIMILAR TO 'Hello%' as cs
FROM collateTable;
Copy

CI

CS

TRUE

FALSE

출력 코드:

 CREATE TABLE collateTable (
col1 VARCHAR(20) COLLATE 'en-ci',
col2 VARCHAR(30) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "01/16/2025",  "domain": "test" }}';

INSERT INTO collateTable
values ('HELLO WORLD!', 'HELLO WORLD!');

SELECT
RLIKE(COLLATE(
--** SSC-FDM-PG0011 - THE USE OF THE COLLATE COLUMN CONSTRAINT HAS BEEN DISABLED FOR THIS PATTERN-MATCHING CONDITION. **
col1, ''), 'Hello.*', 's') as ci,
RLIKE(COLLATE(
--** SSC-FDM-PG0011 - THE USE OF THE COLLATE COLUMN CONSTRAINT HAS BEEN DISABLED FOR THIS PATTERN-MATCHING CONDITION. **
col2, ''), 'Hello.*', 's') as cs
FROM
collateTable;
Copy

CI

CS

FALSE

FALSE

권장 사항

  • 이러한 시나리오에서 기능적 동등성을 달성하려면 이러한 매개 변수를 함수에 수동으로 추가할 수 있습니다.

| Parameter | 설명 | | ——— | ————————- | | c | 대/소문자를 구분하는 일치 | | i | Case-insensitive matching |

SSC-FDM-PG0012

설명

Redshift에서 변수가 NOT NULL 로 표시된 경우 null 값을 할당하려고 하면 런타임 오류가 발생합니다. 그러나 Snowflake는 이 제약 조건을 지원하지 않습니다. 마이그레이션 프로세스 중에 NOT NULL 절이 제거되므로 NULL 값을 변수에 할당하는 것이 허용되며 실행 중에 오류가 발생하지 않습니다.

코드 예제

입력 코드:
 CREATE OR REPLACE PROCEDURE variable_Not_Null()
LANGUAGE plpgsql
AS $$
DECLARE
    v_notnull VARCHAR NOT NULL DEFAULT 'Test default';
BEGIN
    v_notnull := NULL;
    -- Procedure logic
END;
$$;
Copy

[22004] ERROR: NULL 값이 NOT NULL 제약 조건으로 선언되었으므로 변수 “v_notnull”에 할당할 수 없습니다.

출력 코드:
 CREATE OR REPLACE PROCEDURE variable_Not_Null ()
RETURNS VARCHAR
LANGUAGE SQL
AS $$
DECLARE
    --** SSC-FDM-PG0012 - NOT NULL CONSTRAINT HAS BEEN REMOVED. ASSIGNING NULL TO THIS VARIABLE WILL NO LONGER CAUSE A FAILURE. **
    v_notnull VARCHAR DEFAULT 'Test default';
BEGIN
    v_notnull := NULL;
    -- Procedure logic
END;
$$;
Copy

이 작업은 Snowflake에서 성공적으로 실행됩니다.

Recommendations

  • 프로시저의 논리로 인해 이 변수에 NULL 값이 할당되지 않는지 확인합니다.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.