SnowConvert: Oracle SQL 문

Alter Table

참고

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

1. Description

ALTER TABLE 문을 사용하여 파티션되지 않은 테이블, 파티션된 테이블, 테이블 파티션 또는 테이블 하위 파티션의 정의를 변경할 수 있습니다. 오브젝트 테이블 또는 오브젝트 열이 있는 관계형 테이블의 경우 ALTER TABLE 을 사용하여 유형이 변경된 후 참조된 유형의 최신 정의로 테이블을 변환합니다 (Oracle 설명서).

Oracle 구문

 ALTER TABLE [ schema. ] table
  [ alter_table_properties
  | column_clauses
  | constraint_clauses
  | alter_table_partitioning
  | alter_external_table
  | move_table_clause
  ]
  [ enable_disable_clause
  | { ENABLE | DISABLE } { TABLE LOCK | ALL TRIGGERS }
  ] ...
  ;
Copy

참고

Snowflake 구문을 검토하려면 다음 설명서 를 검토하십시오.

2. Sample Source Patterns

2.1. 절이 있는 테이블 변경

경고

memoptimize_read_clausememoptimize_read_clause 는 Snowflake에 적용되지 않으므로 제거됩니다.

Oracle

 ALTER TABLE SOMESCHEMA.SOMENAME 
MEMOPTIMIZE FOR READ 
MEMOPTIMIZE FOR WRITE
 ADD (SOMECOLUMN NUMBER , SOMEOTHERCOLUMN VARCHAR(23)) 
 (PARTITION PT NESTED TABLE COLUMN_VALUE STORE AS SNAME
 ( SUBPARTITION SPART NESTED TABLE COLUMN_VALUE STORE AS SNAME))
ENABLE TABLE LOCK;
Copy

Snowflake

 ALTER TABLE SOMESCHEMA.SOMENAME
ADD (SOMECOLUMN NUMBER(38, 18), SOMEOTHERCOLUMN VARCHAR(23));
Copy

참고

일부 column_clauses and constraint_clauses 만 Snowflake에 애플리케이션할 수 있습니다. Oracle에서는 테이블 변경을 통해 생성된 파티션의 속성을 수정할 수 있지만 Snowflake에서는 이러한 작업이 필요하지 않습니다

2.2. 지원되지 않는 대/소문자가 있는 테이블 변경

Oracle

 ALTER TABLE SOMENAME MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

ALTER TABLE SOMENAME MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);

ALTER TABLE SOMENAME MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
Copy

Snowflake

 !!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
Copy

2.3. ADD CONSTRAINT 작업

ADD CONSTRAINT 작업은 Snowflake에도 동일하지만, ALTER TABLE 문당 1개의 제약 조건만 추가할 수 있으므로 문에 제약 조건이 2개 이상 포함될 경우 설명이 추가됩니다.

경고

enable_disable_clause 은 Snowflake와 관련이 없으므로 제거되었습니다.

Oracle

 -- MULTIPLE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID)
ENABLE VALIDATE,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);

-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);
Copy

Snowflake

 -- MULTIPLE CONSTRAINT ADDITION SCENARIO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0067 - MULTIPLE CONSTRAINT DEFINITION IN A SINGLE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
ALTER TABLE TABLE1
ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID) ,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);

-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1
ADD
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE;
Copy

Known Issues

  1. 테이블의 일부 속성은 애플리케이션에 맞게 조정되거나 적용되지 않을 수 있습니다.

테이블 삭제

참고

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

설명

테이블 삭제 문은 테이블을 제거하는 데 사용됩니다. 이 문은Oracle Snowflake 사이에 약간씩 다릅니다. 차이점에 대한 자세한 내용은 각 설명서를 다시 확인할 수 있습니다.

Oracle에서 Drop Table 구문은 다음과 같습니다.

 DROP TABLE <table_name> [ CASCADE CONSTRAINTS ] [ PURGE ]
Copy

Snowflake에서 Drop Table 구문은 다음과 같습니다.

 DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
Copy

가장 큰 차이점은 테이블이 시스템에서 영구적으로 제거되지 않으므로 Snowflake에는 PURGE 절에 대한 등가물이 없다는 것입니다. 하지만 CASCADE CONSTRAINTS 및 CASCADE 절은 같습니다. 이 테이블을 참조하는 외래 키가 있더라도 둘 다 테이블을 삭제합니다.

이제 몇 가지 코드 예시와 변환된 후의 모습을 살펴보겠습니다. 각 예제에서는 테이블 드롭 문의 다른 변형을 사용합니다.

예 1:

이 예제에서는 가능한 한 간단하게 Drop Table 문을 사용합니다.

입력 코드:

 DROP TABLE TEST_TABLE1;
Copy

변환된 코드:

 DROP TABLE TEST_TABLE1;
Copy
예 2:

이 예제에서는 PURGE 절과 함께 Drop Table 문을 사용합니다. Snowflake에는 Drop Table 문 내에 있는 PURGE 절에 해당하는 문이 없다는 것을 기억하십시오.

입력 코드:

 DROP TABLE TEST_TABLE1 PURGE;
Copy

변환된 코드:

 DROP TABLE TEST_TABLE1;
Copy
예 3:

이 예제에서는 CASCADE CONSTRAINTS 절과 함께 Drop Table 문을 사용합니다.

입력 코드:

 DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS;
Copy

변환된 코드:

 DROP TABLE TEST_TABLE1 CASCADE;
Copy

변환된 코드에서는 CASCADE CONSTRAINTS 절에서 CONSTRAINTS 단어가 제거됩니다.

예 4:

이 예제에서는 CASCADE CONSTRAINTS 및 PURGE 절과 함께 Drop Table 문을 사용합니다.

입력 코드:

 DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS PURGE;
Copy

변환된 코드:

 DROP TABLE TEST_TABLE1 CASCADE;
Copy

보시다시피 코드가 변경됩니다. 새 Snowflake 코드에서는 PURGE 절이 제거되고 CASCADE 절에서 CONSTRAINTS 단어도 제거됩니다.

기능적 동등성

다음 코드를 실행하여 기능적 동등성을 확인하고, 동등하지 않은 유일한 부분은 PURGE 절이며, Oracle에서는 시스템에서 테이블을 완전히 제거하며 Snowflake와 동등한 것이 없다는 점에 유의하십시오. 두 경우 모두 다른 테이블에서 참조된 경우에도 테이블이 삭제됩니다.

Oracle:

 CREATE TABLE TEST_TABLE2 (
    col2 INTEGER,
    CONSTRAINT constraint_name PRIMARY KEY (col2)
);

CREATE TABLE OTHER_TABLE (
    other_col INTEGER REFERENCES TEST_TABLE2 (col2)
);

DROP TABLE TEST_TABLE2 CASCADE CONSTRAINTS PURGE;
Copy

Snowflake:

 CREATE OR REPLACE TABLE TEST_TABLE2 (
       col2 INTEGER,
       CONSTRAINT constraint_name PRIMARY KEY (col2)
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;

   CREATE OR REPLACE TABLE OTHER_TABLE (
          other_col INTEGER REFERENCES TEST_TABLE2 (col2)
      )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;

   DROP TABLE TEST_TABLE2 CASCADE;
Copy

관련 EWIs

관련 EWIs 없음.

Create Index

경고

현재 _ Create Index _ 문은 변환되지 않지만, 구문 분석 중입니다. 또한 소스 코드에 Create index 문이 있는 경우 _ Assessment Report _에서 이를 설명합니다.

create index 구문 분석 코드의 예입니다.

 CREATE UNIQUE INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE AFTER 10 DAYS OF NO ACCESS) ON CLUSTER CLUSTER1
ONLINE USABLE DEFERRED INVALIDATION;

CREATE BITMAP INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE ( ON FUNC1 )) ON TABLE1 AS TAB1 (COL1 ASC) GLOBAL PARTITION BY RANGE (COL1, COL2) ( PARTITION VALUES LESS THAN (MAXVALUE) ) UNUSABLE IMMEDIATE INVALIDATION;

CREATE MULTIVALUE INDEX COL1_INDEX ILM (ADD POLICY SEGMENT TIER TO LOW_COST_TBS) ON TABLE1( TAB1 COL1 DESC, TAB1 COL2 ASC) FROM TABLE1 AS TAB1 WHERE COL1 > 0 LOCAL STORE IN (STORAGE1)
VISIBLE USABLE DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ILM (DELETE POLICY POLICY1) ON CLUSTER CLUSTER1
PCTFREE 10
LOGGING
ONLINE
TABLESPACE DEFAULT
NOCOMPRESS
SORT
REVERSE
VISIBLE
INDEXING PARTIAL
NOPARALLEL;

CREATE INDEX COL1_INDEX ILM (DELETE_ALL) ON TABLE1 AS TAB1 (COL1 ASC) LOCAL (
PARTITION PARTITION1 TABLESPACE TABLESPACE1 NOCOMPRESS USABLE) DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) GLOBAL
PARTITION BY HASH (COL1, COL2) (PARTITION PARTITION1 LOB(LOB1) STORE AS BASICFILE LOB_NAME (TABLESPACE TABLESPACE1)) USABLE IMMEDIATE INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 DESC, COL2 ASC) INDEXTYPE IS INDEXTYPE1 LOCAL ( PARTITION PARTITION1 PARAMETERS('PARAMS')) NOPARALLEL PARAMETERS('PARAMS') USABLE DEFERRED INVALIDATION;

CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) INDEXTYPE IS XDB.XMLINDEX LOCAL ( PARTITION PARTITION1) PARALLEL 6 UNUSABLE IMMEDIATE INVALIDATION;
Copy

참고

아키텍처상의 이유로 Snowflake는 인덱스를 지원하지 않으므로 SnowConvert 에서 인덱스 생성과 관련된 모든 코드를 제거합니다. Snowflake는 DML 작업의 성능 속도를 높이는 데 도움이 되는 모든 테이블에 대해 자동으로 마이크로 파티션을 생성하므로 사용자는 이러한 마이크로 파티션을 생성하거나 관리하는 것에 대해 걱정할 필요가 없습니다.

일반적으로 이 정도면 예외적으로 쿼리 성능이 매우 우수합니다. 그러나 데이터 클러스터링 키를 생성하여 이를 개선할 수 있는 방법이 있습니다. 마이크로 파티션과 데이터 클러스터링에 대한 자세한 내용은 Snowflake의 공식 페이지 에서 확인할 수 있습니다.

구체화된 뷰 만들기

설명

Snowconvert에서 Oracle 구체화된 뷰는 Snowflake 동적 테이블로 변환됩니다. 동적 테이블을 올바르게 구성하려면 2개의 필수 매개 변수 TARGET_LAG 및 WAREHOUSE 를 정의해야 합니다. 구성 옵션에서 이러한 매개 변수를 지정하지 않으면 아래 예시와 같이 변환 중에 기본값이 미리 지정된 값으로 설정됩니다.

구체화된 뷰에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.

동적 테이블에 필요한 매개 변수에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.

샘플 소스 패턴

Oracle

 CREATE MATERIALIZED VIEW sales_total
AS
SELECT SUM(amount) AS total_sales
FROM sales;
Copy

Snowflake

 CREATE OR REPLACE DYNAMIC TABLE sales_total
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT SUM(amount) AS total_sales
FROM
sales;
Copy

새로 고침 모드

Snowflake 동적 테이블은 Oracle의 구체화된 뷰 새로 고침 모드와 동등한 기능을 지원합니다. 해당 모드는 다음과 같습니다.

  • Oracle:

    • FAST: 변경된 행만 새로 고칩니다.

    • COMPLETE: 구체화된 뷰 전체를 새로 고칩니다.

    • FORCE: 가능하면 FAST 를 사용하지만, 그렇지 않으면 COMPLETE 를 사용합니다.

  • Snowflake:

    • AUTO: 최적의 새로 고침 방법을 자동으로 결정합니다.

    • FULL: 전체 테이블을 새로 고칩니다(Oracle의 COMPLETE 모드와 동일).

    • INCREMENTAL: 변경된 행만 새로 고칩니다.

기본 새로 고침 모드

SnowConvert 를 사용하는 경우 동적 테이블의 기본 새로 고침 모드는 AUTO 입니다.

모드 매핑
  • Oracle FASTFORCE -> Snowflake AUTO

  • Oracle COMPLETE -> Snowflake FULL

자세한 내용은 Oracle 새로 고침 모드Snowflake 새로 고침 모드 에 대한 공식 설명서를 참조하십시오.

Oracle

 CREATE MATERIALIZED VIEW CUSTOMER_SALES_SUMMARY
REFRESH COMPLETE
AS
SELECT
    CUSTOMER_ID,
    SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
    SALES
GROUP BY
    CUSTOMER_ID;
Copy

Snowflake

 CREATE OR REPLACE DYNAMIC TABLE CUSTOMER_SALES_SUMMARY
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
REFRESH_MODE=FULL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT
   CUSTOMER_ID,
   SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
   SALES
GROUP BY
   CUSTOMER_ID;
Copy

Known Issues

현재 알려진 오류가 감지되지 않았습니다.

관련 EWIs

  1. ssc-fdm-0031.md: 기본적으로 설정된 동적 테이블 필수 매개 변수

Create Sequence

먼저 코드 예시를 통해 코드가 변환된 후 어떤 모습일지 살펴보겠습니다.

입력 코드:

 CREATE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
Copy

출력 코드:

 CREATE OR REPLACE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
Copy

첫 번째 변경은 스키마 또는 데이터 웨어하우스를 시퀀스 이름에 적용하는 것입니다. 두 번째 변환은 일부 요소를 제거한 다음 설명으로 추가하는 것으로 구성되는데, Oracle은 생성 시퀀스에 Snowflake에서 지원되지 않는 일부 요소를 가지고 있기 때문입니다.

Oracle에서 시퀀스 이름 뒤에 NOT 설명이 있는 요소는 다음과 같습니다

  • START WITH 1000

  • INCREMENT BY 1

요소가 이러한 요소 중 하나가 아닌 경우 예시에서와 같이 생성 시퀀스 바로 앞에 설명과 함께 경고로 추가됩니다.

제거되는 요소는 다음과 같습니다

  • MAXVALUE

  • NOMAXVALUE

  • MINVALUE

  • NOMINVALUE

  • CYCLE

  • NOCYCLE

  • CACHE

  • NOCACHE

  • ORDER

  • NOORDER

  • KEEP

  • NOKEEP

  • SESSION

  • GLOBAL

  • SCALE

  • EXTEND

  • SCALE

  • NOEXTEND

  • NOSCALE

  • SHARD

  • EXTEND

  • SHARD

  • NOEXTEND

  • NOSHARD

SEQUENCE EXPRESSIONS

  • NEXTVAL: Snowflake 문법은 Oracle 문법과 동일합니다.

  • CURRVAL: Snowflake에 해당하는 함수가 없으므로 stub 함수로 변환됩니다. 이링크 에서 Snowflake의 접근법을 이해할 수 있습니다.

입력 코드:
 select seq1.nextval from dual;
select seq1.currval from dual;
Copy
출력 코드:
 select seq1.nextval from dual;

select
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0069 - THE SEQUENCE CURRVAL PROPERTY IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! seq1.currval from dual;
Copy

시퀀스 START WITH

START WITH 문 값은 Snowflake에서 허용하는 최대 값을 초과할 수 있습니다. 시작 값에 대해 Snowflake가 말한 것은 다음과 같습니다. 시퀀스에서 반환되는 첫 번째 값을 지정합니다. 지원되는 값은 64비트 2의 보수 정수로 표현할 수 있는 모든 값입니다(-2^63 ~ 2^63-1)_. 따라서 앞서 언급한 대로 최대 허용 값은 양수의 경우 9223372036854775807, 음수의 경우 9223372036854775808 입니다.

코드 예시

입력 코드:
 CREATE SEQUENCE SEQUENCE1
START WITH 9223372036854775808;

CREATE SEQUENCE SEQUENCE2
START WITH -9223372036854775809;
Copy
출력 코드:
 CREATE OR REPLACE SEQUENCE SEQUENCE1
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - 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"}}';

CREATE OR REPLACE SEQUENCE SEQUENCE2
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - 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

관련 EWIs

  1. SSC-EWI-OR0069: 시퀀스 CURRVAL 속성은 Snowflake에서 지원되지 않습니다.

  2. SSC-EWI-OR0068: 시퀀스 시작 값이 Snowflake에서 허용하는 최대 값을 초과합니다.

세션 변경

세션 변경

세션 변경에는 Snowflake에 해당하는 기능이 있으며 일부 변수는 Snowflake 변수에 매핑됩니다. 세션 변경 순열이 지원되지 않으면 노드에 설명이 추가되고 경고가 추가됩니다.

Oracle 코드:

 alter session set nls_date_format = 'DD-MM-YYYY';
Copy
Snowflake 코드:
 ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
Copy

세션 매개 변수 참조

참고

테이블에 표시되지 않는 세션 매개 변수는 현재 변환되고 있지 않습니다.

세션 매개 변수

Snowflake 변환

NLS_DATE_FORMAT

DATE_INPUT_FORMAT and DATE_OUTPUT_FORMAT

NLS_NUMERIC_CHARACTERS

NOT SUPPORTED

알려진 문제

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

관련 EWIs

관련 EWIs 없음.

Create Synonym

참고

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

Create Synonym

Snowflake에서는 동의어가 지원되지 않습니다. 동의어에 대한 참조가 원래 오브젝트에 대해 변경됩니다.

입력 코드:

 CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
Copy
출력 코드:
 ----** 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.TABLITA_SYNONYM FOR TABLITA
                                                       ;
Copy

예 1: 테이블을 가리키는 동의어.

Oracle 소스 코드:

 CREATE TABLE TABLITA
(
    COLUMN1 NUMBER
);

CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;

SELECT * FROM B.TABLITA_SYNONYM WHERE B.TABLITA_SYNONYM.COLUMN1 = 20;
Copy

Snowflake 마이그레이션 코드: SELECT 가 원래 동의어를 가리키던 것이 이제는 동의어를 가리키는 테이블을 가리키는 것을 알 수 있습니다.

 CREATE OR REPLACE TABLE TABLITA
    (
        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.TABLITA_SYNONYM FOR TABLITA
                                                           ;

SELECT * FROM
    TABLITA
    WHERE
    TABLITA.COLUMN1 = 20;
Copy

예 2: 다른 동의어를 지칭하는 동의어.

Oracle 소스 코드:

 CREATE TABLE TABLITA
(
    COLUMN1 NUMBER
);

CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;

SELECT * FROM C.TABLITA_SYNONYM2 WHERE C.TABLITA_SYNONYM2.COLUMN1 = 20;

UPDATE C.TABLITA_SYNONYM2 SET COLUMN1 = 10;

INSERT INTO C.TABLITA_SYNONYM2 VALUES (1);
Copy

Snowflake 마이그레이션 코드: 기존에 SELECT , UPDATE, INSERT 는 동의어를 참조했지만, 이제 테이블인 원자 오브젝트를 참조합니다.

 CREATE OR REPLACE TABLE TABLITA
    (
        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.TABLITA_SYNONYM FOR TABLITA
                                                           ;

--    --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
                                                                  ;

SELECT * FROM
    TABLITA
    WHERE
    TABLITA.COLUMN1 = 20;

    UPDATE TABLITA
    SET COLUMN1 = 10;

    INSERT INTO TABLITA
    VALUES (1);
Copy

예 3: 뷰를 참조하는 동의어

Oracle 소스 코드

 CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;

CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;

CREATE VIEW VIEW_ORGINAL AS SELECT * FROM C.TABLITA_SYNONYM2;

CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL;

SELECT * FROM VIEW_SYNONYM;
Copy

Snowflake 마이그레이션 코드: 기존에 SELECT 는 동의어를 참조했지만, 이제 뷰인 원자 오브젝트를 참조합니다.

 ----** 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.TABLITA_SYNONYM FOR TABLITA
                                                       ;

----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
                                                                  ;

CREATE OR REPLACE VIEW VIEW_ORGINAL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT * FROM
TABLITA;

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

--CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL
                                                       ;

SELECT * FROM
VIEW_ORGINAL;
Copy

동의어 변환은 UI 설정에서 사용하거나 사용하지 않도록 설정할 수 있습니다.

관련 EWIs

  1. SSC-FDM-0001: 단일 테이블에서 모든 열을 선택하는 뷰는 Snowflake에서 필수가 아닙니다.

  2. SSC-FDM-0006: 숫자 유형 열은 Snowflake에서 유사하게 작동하지 않을 수 있습니다.

  3. SSC-FDM-OR0005: Snowflake에서는 동의어가 지원되지 않지만, 이 동의어에 대한 참조는 원래 오브젝트 이름에 의해 변경되었습니다.

Create Table

1. Description

Oracle에서 CREATE TABLE 문은 사용자 데이터를 보관하는 기본 구조인 관계형 테이블 또는 열 정의에 데이터 타입을 사용하는 테이블인 오브젝트 테이블 중 한 가지 유형의 테이블을 생성하는 데 사용됩니다. (Oracle 설명서)

Oracle 구문

 CREATE [ { GLOBAL | PRIVATE } TEMPORARY | SHARDED | DUPLICATED | [ IMMUTABLE ] BLOCKCHAIN 
  | IMMUTABLE  ] 
   TABLE
  [ schema. ] table
  [ SHARING = { METADATA | DATA | EXTENDED DATA | NONE } ]
  { relational_table | object_table | XMLType_table }
  [ MEMOPTIMIZE FOR READ ]
  [ MEMOPTIMIZE FOR WRITE ]
  [ PARENT [ schema. ] table ] ;
Copy

Snowflake 구문

 CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ STAGE_FILE_FORMAT = (
     { FORMAT_NAME = '<file_format_name>'
       | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ]
     } ) ]
  [ STAGE_COPY_OPTIONS = ( copyOptions ) ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

참고

Snowflake에 대한 자세한 내용은 다음 설명서 를 참조하십시오.

2. Sample Source Patterns

2.1. 물리적 및 테이블 속성

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
    BaseId NUMBER DEFAULT 10 NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
  PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
  COLUMN STORE COMPRESS FOR QUERY HIGH NO ROW LEVEL LOCKING LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "MyTableSpace"
  PARTITION BY LIST ("BaseId")
 (
    PARTITION "P20211231"  VALUES (20211231) SEGMENT CREATION DEFERRED
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
    ROW STORE COMPRESS ADVANCED LOGGING
    STORAGE(
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "MyTableSpace" 
  )
  PARALLEL;
Copy

Snowflake

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

참고

테이블 속성은 Snowflake에서 마이그레이션한 후에는 필수가 아니므로 제거됩니다.

2.2. 제약 조건 및 제약 상태

다음 제약 조건에 대해 설명합니다.

  • CHECK 제약 조건

참고

변환하는 동안 USING INDEX 제약 조건은 출력 코드에서 완전히 제거됩니다.

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
    BaseId NUMBER DEFAULT 10 NOT NULL ENABLE NOVALIDATE,
    "COL1" NUMBER CHECK( "COL1" IS NOT NULL ),
	  CHECK( "COL1" IS NOT NULL ),
    CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
        USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
        STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
        PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) ENABLE
);
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."BaseTable"
	(
	    BaseId NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT 10 NOT NULL,
	    "COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ NOT NULL
 	                                                                                                                     !!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
 	                                                                                                                     CHECK( "COL1" IS NOT NULL ),
	!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
		  CHECK( "COL1" IS NOT NULL ),
	    CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
	;
Copy

반면에 같은 방식으로 다음과 같이 NOT NULL 제약 조건 뒤에 제약 조건 상태가 있는 경우에도 마찬가지입니다.

  • RELY

  • NO RELY

  • RELY ENABLE

  • RELY DISABLE

  • VALIDATE

  • NOVALIDATE

이 또한 설명이 추가됩니다.

참고

ENABLE 제약 조건 상태는 변환 프로세스 중에 출력 코드에서 완전히 제거됩니다. DISABLE 상태의 경우 NOT NULL 제약 조건과 동시에 제거됩니다.

Oracle

 CREATE TABLE Table1(
  col1 INT NOT NULL ENABLE,
  col2 INT NOT NULL DISABLE,
  col3 INT NOT NULL RELY
);
Copy

Snowflake

 CREATE OR REPLACE TABLE Table1 (
    col1 INT NOT NULL,
    col2 INT ,
    col3 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

2.3. 외래 키

전체 자릿수나 스케일이 없는 NUMBER 열이 있는 테이블과 앞서 언급한 NUMBER 열을 참조하는 NUMBER(*,0) 열이 있는 다른 테이블이 있는 경우, 이 외래 키를 설명합니다.

Oracle

 CREATE TABLE "MySchema"."MyTable"
(
    "COL1" NUMBER, 
    CONSTRAINT "PK" PRIMARY KEY ("COL1")
);
Copy

Snowflake

 CREATE OR REPLACE TABLE "MySchema"."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"}}'
    ;
Copy

2.4. 가상 열

Oracle

 CREATE TABLE "MySchema"."MyTable"
(
    "COL1" NUMBER GENERATED ALWAYS AS (COL1 * COL2) VIRTUAL
);
Copy

Snowflake

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

2.5. ID 열

ID 열의 경우 시퀀스가 생성되어 열에 할당됩니다.

Oracle

 CREATE TABLE "MySchema"."BaseTable"
(
	"COL0" NUMBER GENERATED BY DEFAULT ON NULL 
		AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 
		INCREMENT BY 1 
		START WITH 621 
		CACHE 20 
		NOORDER  NOCYCLE  NOT NULL ENABLE
);
Copy

Snowflake

 CREATE OR REPLACE SEQUENCE MySchema.BaseTable_COL0
	INCREMENT BY 1
	START WITH 621
COMMENT = 'FOR TABLE-COLUMN "MySchema.BaseTable".COL0';

CREATE OR REPLACE TABLE "MySchema"."BaseTable" (
	"COL0" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT MySchema.BaseTable_COL0.NEXTVAL NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

2.6. CLOB 및 BLOB 열 선언

CLOB 또는 BLOB 으로 선언된 열은 VARCHAR 로 변경됩니다.

Oracle

 CREATE TABLE T
(
 Col1 BLOB DEFAULT EMPTY_BLOB(),
Col5 CLOB DEFAULT EMPTY_CLOB()
);
Copy

Snowflake

 CREATE OR REPLACE TABLE T
 (
  Col1 BINARY,
 Col5 VARCHAR
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

2.7. 제약 조건 이름

경고

제약 조건 이름은 Snowflake에 적용되지 않으므로 코드에서 제거되었습니다.

Oracle

 CREATE TABLE "CustomSchema"."BaseTable"(
 "PROPERTY" VARCHAR2(64) CONSTRAINT "MICROSOFT_NN_PROPERTY" NOT NULL ENABLE
  );
Copy

Snowflake

 CREATE OR REPLACE TABLE "CustomSchema"."BaseTable" (
  "PROPERTY" VARCHAR(64) NOT NULL
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
   ;
Copy

2.8. 시간이 포함된 기본 열

날짜 유형으로 선언된 열은 특정 날짜 유형과 일치하도록 형 변환됩니다.

Oracle

 CREATE TABLE TABLE1
(
"COL1" VARCHAR(50) DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE TABLE1
(
 COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
 COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME,
 COL2 TIMESTAMP(6) WITH LOCAL TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL3 TIMESTAMP(6) WITH TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00',
 COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM')
 );
Copy

Snowflake

 CREATE OR REPLACE TABLE TABLE1
 (
 "COL1" VARCHAR(50) DEFAULT TO_VARCHAR(CURRENT_TIMESTAMP(), 'YYYY-MM-DD HH:MI:SS')
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;

 --** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR TABLE1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
 CREATE OR REPLACE TABLE TABLE1
 (
  COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP() :: TIMESTAMP(6),
  COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME() :: TIMESTAMP(6),
  COL2 TIMESTAMP_LTZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_LTZ(6),
  COL3 TIMESTAMP_TZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_TZ(6),
  COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP(6) WITHOUT TIME ZONE,
  COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM') :: TIMESTAMP(6)
  )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

2.9 공유 및 메모 최적화 옵션

Oracle의 일부 옵션은 Snowflake에서 필수가 아닙니다. sharingmemoptimize 옵션의 경우 출력 코드에서 제거됩니다.

Oracle

 CREATE TABLE table1 
    SHARING = METADATA (
     id NUMBER,
     name VARCHAR2(50),
     date DATE,
     CONSTRAINT pk_table PRIMARY KEY (id)
 ) MEMOPTIMIZE FOR READ;
Copy

Snowflake

 CREATE OR REPLACE TABLE table1 (
     id NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
     name VARCHAR(50),
     date TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
     CONSTRAINT pk_table PRIMARY KEY (id)
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
 ;
Copy

2.10 AS SubQuery

Snowflake에서 AS SubQuery 를 통해 테이블을 생성할 때 다음 속성 및 절은 지원되지 않습니다.

[ immutable_table_clauses ]
[ blockchain_table_clauses ]
[ DEFAULT COLLATION collation_name ]
[ ON COMMIT { DROP | PRESERVE } DEFINITION ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]

Copy

Oracle

 create table table1
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
DEFAULT COLLATION somename
ON COMMIT DROP DEFINITION
ON COMMIT DELETE ROWS
COMPRESS
NOLOGGING
AS
   select
      *
   from
      table1;
Copy

Snowflake

 CREATE OR REPLACE TABLE table1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
AS
   select
      *
   from
      table1;
Copy

Known Issues

  1. 테이블의 일부 속성은 Snowflake의 동작이 다르기 때문에 이에 맞게 조정되거나 설명이 추가될 수 있습니다.

관련 EWIs

  1. SSC-EWI-0035: Check 문은 지원되지 않습니다.

  2. SSC-FDM-0006: 숫자 유형 열은 Snowflake에서 유사하게 작동하지 않을 수 있습니다.

  3. SSC-FDM-0019: 의미 체계 정보를 로딩할 수 없습니다.

  4. SSC-FDM-OR0042: 타임스탬프로 변환된 날짜 유형은 동작이 다릅니다.

  5. SSC-FDM-OR0006: Null이 아닌 인라인 제약 조건에서 제약 조건 상태가 제거되었습니다.

Create View

참고

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

Create View

 CREATE OR REPLACE VIEW View1 AS SELECT Column1 from Schema1.Table1;
Copy
 CREATE OR REPLACE VIEW View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Copy

Create View에 대한 다음 절이 제거됩니다.

  • No Force/ Force

  • Edition 절

  • Sharing 절

  • 기본 데이터 정렬

  • Bequeath 절

  • Container 절

 CREATE OR REPLACE
NO FORCE
NONEDITIONABLE
VIEW Schema1.View1
SHARING = DATA
DEFAULT COLLATION Collation1
BEQUEATH CURRENT_USER
AS SELECT Column1 from Schema1.Table1
CONTAINER_MAP;
Copy
 CREATE OR REPLACE VIEW Schema1.View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Copy

Alter View

변경 사항은 아직 SnowConvert 에서 지원되지 않습니다.

Drop View

CASCADE CONSTRAINT 절은 아직 지원되지 않습니다.

 DROP VIEW Schema1.View1;

DROP VIEW Schema1.View1
CASCADE CONSTRAINTS;
Copy
 DROP VIEW Schema1.View1;

DROP VIEW Schema1.View1
CASCADE CONSTRAINTS !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DropBehavior' NODE ***/!!!;
Copy

관련 EWIs

  1. SSC-EWI-0073: 보류 중 함수 동등성 검토.

Create Type

일반 설명

Oracle 데이터베이스 엔진이 제공하는 가장 중요한 기능 중 하나는 오브젝트 지향 접근법입니다. PL/SQL 은 패키지, 함수, 테이블, 유형 등의 형태로 Java와 유사한 문을 사용하여 OOP 형태의 다른 관계형 데이터베이스를 뛰어넘는 함수를 제공합니다. 이 문서에서는 마지막 문제와 SnowConvert 에서 기능을 준수하면서 문제를 해결하는 방법을 다룹니다.

Oracle은 다음 사양을 지원합니다.

  • 추상 데이터 타입 (_ADT _) (SQLJ 오브젝트 타입 포함).

  • 독립형 가변 배열 (varray) 유형.

  • 독립형 중첩 테이블 유형.

  • 불완전한 오브젝트 유형.

이러한 모든 내용은 Oracle 생성 유형 문 설명서 의 정보에 따른 것입니다

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]

Copy

제한 사항

온라인 설명서 지원되지 않는 데이터 타입 에 따르면 Snowflake는 사용자 정의 데이터 타입을 지원하지 않지만, 대부분의 사용자 정의 타입의 계층 구조를 모방하는 데 사용할 수 있는반정형 데이터 타입 을 지원합니다. 이러한 이유로 해결 방법이 없는 여러 유형의 기능이 있습니다.

다음은 해결 방법이 제안되지 않은 사용자 정의 유형 기능입니다.

하위 유형: 유형 계층 구조

이러한 문은 Snowflake에서 지원되지 않습니다. SnowConvert 는 인식만 할 뿐 변환은 제공되지 않습니다.

 CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER) 
   NOT FINAL;
/

CREATE TYPE employee_t UNDER person_t 
   (department_id NUMBER, salary NUMBER) 
   NOT FINAL;
/

CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);
/
Copy

Type 속성

PL/SQL 의 OOP 를 사용할 때 일반적으로 사용되는 옵션인 Persistable, Instantiable 및 Final 참조합니다.

 CREATE OR REPLACE TYPE type1 AS OBJECT () NOT FINAL NOT INSTANTIABLE NOT PERSISTABLE;
CREATE OR REPLACE TYPE type2 AS OBJECT () FINAL INSTANTIABLE PERSISTABLE;
Copy

중첩된 테이블 유형

이러한 문은 Snowflake에서 지원되지 않습니다. SnowConvert 는 인식만 할 뿐 변환은 제공되지 않습니다.

 CREATE TYPE textdoc_typ AS OBJECT
    ( document_typ      VARCHAR2(32)
    , formatted_doc     BLOB
    ) ;
/

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Copy

Type Source Creation 옵션

이 옵션은 액세스 및 유형 쿼리와 관련된 사용자 지정 옵션을 나타냅니다.

 CREATE TYPE type1 FORCE OID 'abc' SHARING = METADATA DEFAULT COLLATION schema1.collation ACCESSIBLE BY (schema1.unitaccesor) AS OBJECT ();
CREATE TYPE type2 FORCE OID 'abc' SHARING = NONE DEFAULT COLLATION collation ACCESSIBLE BY (PROCEDURE unitaccesor) AS OBJECT ();
CREATE TYPE type3 AUTHID CURRENT_USER AS OBJECT ();
CREATE TYPE type4 AUTHID DEFINER AS OBJECT ();
Copy

제안된 해결 방법

유형 정의 정보

정의를 위해 제안된 해결 방법은 Oracle의 데이터 타입을 모방하는 반정형 데이터 타입을 생성하는 것입니다.

유형 멤버 함수 정보

논리 및 DML 을 포함하는 멤버 함수의 경우 제안된 해결 방법은 이를 저장 프로시저로 변환하는 도우미에 의존합니다.

현재 SnowConvert 지원

다음 테이블은 SnowConvert 도구에서 제공하는 현재 지원의 요약을 보여줍니다. 아직 최종 변환이 완료되지 않았을 수 있으며 추가 작업이 필요할 수 있다는 점을 감안하십시오.

Type Statement ElementCurrent recognition statusCurrent translation statusHas Known Workarounds
Object Type DefinitionsRecognized.Partially Translated.Yes.
Subtype DefinitionsRecognized.Not Translated.No.
Array Type DefinitionsRecognized.Not Translated.Yes.
Nested Table DefinitionsRecognized.Not Translated.No.
Member Function DefinitionsRecognized.Not Translated.Yes.

Known Issues

1. DML usages for Object Types are not being transformed

현재로서는 사용자 정의 유형을 사용하는 DDL 정의만 베리언트로 변환되고 있습니다. 즉, 사용자 정의 유형을 사용하는 모든 삽입, 업데이트 또는 삭제는 변환되지 않으며 수동으로 변환해야 합니다. 이에 대한 EWI 는 없지만 이에 해당하는 EWI 를 추가하는 작업 항목이 있습니다.

2. Create Type creation options are not supported

현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.

관련 EWIs

관련 EWIs 없음.

배열 유형 정의

SnowConvert 는 이러한 정의만 인식하며 현재로서는 해당 정의에 대한 변환을 지원하지 않습니다. 이 페이지는 향후 변환을 위한 참고 자료로만 사용됩니다.

참고

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

설명

배열 유형은 이전에 존재하는 데이터 타입(다른 사용자 정의 유형 포함)의 배열 구조를 정의합니다.

배열 타입의 변환의 경우, 타입 정의가 반정형 데이터 타입 으로 대체된 다음 코드 전체에서 모든 사용처에 확장됩니다. 즉, 타입의 정의를 가져와서 원본 코드에서 확장하는 것을 의미합니다.

 CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
Copy

샘플 소스 패턴

배열 사용법에 대한 인서트

다음 데이터는 선택 쿼리 전에 테이블 내부에 삽입됩니다. 이러한 인서트는 현재 Snowflake로 수동으로 마이그레이션해야 합니다.

Oracle
 INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('2000-0000', '4000-0000', '0000-0000'));

INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('8000-2000', '0000-0000', '5000-0000'));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('2000-0000', '4000-0000', '0000-0000');

INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('8000-2000', '0000-0000', '5000-0000');
Copy

배열 유형 사용법

Oracle
 CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);
/

CREATE TABLE customer_table_demo (
    customer_table_id INTEGER,
    customer_data phone_list_typ_demo
);
/

SELECT * FROM customer_table_demo;
/
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                          |
-----------------+---------------------------------------+
                1|[['2000-0000','4000-0000','0000-0000']]|
                1|[['8000-2000','0000-0000','5000-0000']]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'VARYING ARRAY' NODE ***/!!!
CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);

CREATE OR REPLACE TABLE customer_table_demo (
        customer_table_id INTEGER,
        customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'phone_list_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
        customer_table_id,
        customer_data
FROM
        customer_table_demo;

    SELECT * FROM
        customer_table_demo_view;
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                          |
-----------------+---------------------------------------+
                1|{['2000-0000','4000-0000','0000-0000']}|
                1|{['8000-2000','0000-0000','5000-0000']}|

Copy

Known Issues

1. Create Type creation options are not supported

현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.

2. Migrated code output is not functional

문이 불필요하게 변경되어 출력 코드에서 더 이상 함수를 발휘하지 못합니다. 이 문제는 적절한 변환이 이루어지면 해결될 것입니다.

관련 EWIs

  1. SSC-EWI-0062: 사용자 지정 유형 사용이 베리언트로 변경되었습니다.

  2. SSC-EWI-0073: 보류 중 함수 동등성 검토.

멤버 함수 정의

SnowConvert 는 여전히 타입 멤버 함수나 타입 본문 정의를 인식하지 못합니다. 이 페이지는 향후 변환을 위한 참고 자료로만 사용됩니다.

참고

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

설명

다른 클래스 정의와 마찬가지로 Oracle의 TYPE 은 그 특성에 따라 동작을 노출하는 메서드를 구현할 수 있습니다. MEMBER FUCTION 은 제한 사항으로 인해 기능적 동등성을 유지하기 위해 Snowflake의 저장 프로시저로 변환됩니다.

함수가 프로시저로 변환되고 있으므로 PL/SQL 에 대한 변환 참조 가 여기에도 적용됩니다.

샘플 소스 패턴

Simple square() 멤버 함수에 대한 삽입물

다음 데이터는 선택 쿼리 전에 테이블 내부에 삽입됩니다. 이러한 인서트는 현재 Snowflake로 수동으로 마이그레이션해야 합니다.

Oracle
 INSERT INTO table_member_function_demo(column1) VALUES
(type_member_function_demo(5));
Copy
Snowflake
 INSERT INTO table_member_function_demo (column1)
SELECT OBJECT_CONSTRUCT('a1', 5);
Copy

Simple square() 멤버 함수

Oracle
 -- TYPE DECLARATION
CREATE TYPE type_member_function_demo AS OBJECT (
    a1 NUMBER,
    MEMBER FUNCTION get_square RETURN NUMBER
);
/

-- TYPE BODY DECLARATION
CREATE TYPE BODY type_member_function_demo IS
   MEMBER FUNCTION get_square
   RETURN NUMBER
   IS x NUMBER;
   BEGIN
      SELECT c.column1.a1*c.column1.a1 INTO x
      FROM table_member_function_demo c;
      RETURN (x);
   END;
END;
/

-- TABLE
CREATE TABLE table_member_function_demo (column1 type_member_function_demo);
/

-- QUERYING DATA
SELECT
    t.column1.get_square()
FROM
    table_member_function_demo t;
/
Copy
T.COLUMN1.GET_SQUARE()|
----------------------+
                    25|

Copy
Snowflake
-- TYPE DECLARATION
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type_member_function_demo AS OBJECT (
    a1 NUMBER,
    MEMBER FUNCTION get_square RETURN NUMBER
)
;

---- TYPE BODY DECLARATION
--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE WITHOUT BODY IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
--CREATE TYPE BODY type_member_function_demo IS
--   MEMBER FUNCTION get_square
--   RETURN NUMBER
--   IS x NUMBER;
--   BEGIN
--      SELECT c.column1.a1*c.column1.a1 INTO x
--      FROM table_member_function_demo c;
--      RETURN (x);
--   END;
--END
   ;

-- TABLE
CREATE OR REPLACE TABLE table_member_function_demo (column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type_member_function_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.table_member_function_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
    column1:a1 :: NUMBER AS a1
FROM
    table_member_function_demo;

-- QUERYING DATA
SELECT
    t.column1.get_square() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 't.column1.get_square' NODE ***/!!!
FROM
    table_member_function_demo t;
Copy
GET_SQUARE()|
------------+
          25|

Copy

Known Issues

알려진 문제 없음.

관련 EWIs

  1. SSC-EWI-0056: 지원되지 않는 Create Type입니다.

  2. SSC-EWI-0062: 사용자 지정 유형 사용이 베리언트로 변경되었습니다.

  3. SSC-EWI-0073: 보류 중 함수 동등성 검토.

  4. SSC-EWI-OR0007: Snowflake에서 지원되지 않는 Create Type

중첩된 테이블 유형 정의

SnowConvert 는 이러한 정의만 인식하고 변환을 지원하지 않으며 이에 대한 알려진 해결 방법도 없습니다.

Description

중첩된 테이블 유형은 이전에 존재하는 데이터 타입(다른 사용자 정의 유형 포함)의 임베디드 테이블 구조를 정의합니다. 배열 유형의 보다 강력한 버전으로 사용할 수 있습니다.

다른 유형과 달리 아직 알려진 해결 방법이나 가능한 변환이 없습니다.

 CREATE TYPE <type name> AS TABLE OF <data type>
Copy

Sample Source Patterns

중첩된 테이블 유형 사용법

Oracle
 CREATE TYPE textdoc_typ AS OBJECT (
    document_typ VARCHAR2(32),
    formatted_doc BLOB
);
/

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Copy
Snowflake
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE textdoc_typ AS OBJECT (
    document_typ VARCHAR2(32),
    formatted_doc BLOB
)
;

!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'NESTED TABLE' NODE ***/!!!

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
Copy

Known Issues

1. Create Type creation options are not supported

현재로서는 이러한 생성 옵션에 대한 알려진 해결 방법이 없으므로 유형을 정의할 때 이러한 옵션은 고려되지 않습니다.

Related EWIs

  1. SSC-EWI-0073: 보류 중 함수 동등성 검토

  2. SSC-EWI-0056: 지원되지 않는 Create Type입니다.

오브젝트 유형 정의

참고

SnowConvert 는 오브젝트 유형 정의 자체에 대한 변환을 지원합니다. 그러나 그 활용은 아직 진행 중입니다.

참고

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

설명

오브젝트 타입은 레코드와 유사한 데이터 구조를 정의하며, 멤버 함수 정의의 이점이 추가됩니다. 즉, 해당 데이터는 유형 내에서 일부 동작을 따라 사용될 수 있습니다.

오브젝트 타입의 변환을 위해 타입 정의가 반정형 데이터 타입 으로 대체된 다음 코드 전체에 걸쳐 모든 사용처에서 확장됩니다. 테이블의 경우 베리언트의 열을 바꾸고 뷰를 추가하여 원래 테이블의 선택 항목(및 뷰)이 계속 작동할 수 있도록 합니다.

 CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
Copy

샘플 소스 패턴

단순 유형 사용을 위한 인서트

다음 데이터는 선택 쿼리 전에 테이블 내부에 삽입됩니다. 이러한 인서트는 현재 Snowflake로 수동으로 마이그레이션해야 합니다.

Oracle
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1'));

INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2'));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);

INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Copy

단순 유형 사용

Oracle
 CREATE TYPE customer_typ_demo AS OBJECT (
    customer_id INTEGER,
    cust_first_name VARCHAR2(20),
    cust_last_name VARCHAR2(20)
);

CREATE TABLE customer_table_demo (
    customer_table_id INTEGER,
    customer_data customer_typ_demo
);

SELECT * FROM customer_table_demo;
Copy
CUSTOMER_TABLE_ID|CUSTOMER_DATA                 |
-----------------+------------------------------+
                1|[1, First Name 1, Last Name 1]|
                2|[2, First Name 2, Last Name 2]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE customer_typ_demo AS OBJECT (
    customer_id INTEGER,
    cust_first_name VARCHAR2(20),
    cust_last_name VARCHAR2(20)
)
;

CREATE OR REPLACE TABLE customer_table_demo (
        customer_table_id INTEGER,
        customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
        customer_table_id,
        customer_data:customer_id :: INTEGER AS customer_id,
        customer_data:cust_first_name :: VARCHAR AS cust_first_name,
        customer_data:cust_last_name :: VARCHAR AS cust_last_name
FROM
        customer_table_demo;

    SELECT * FROM
        customer_table_demo_view;
Copy
CUSTOMER_TABLE_ID|CUST_ID|CUST_FIRST_NAME|CUST_LAST_NAME|
-----------------+-------+---------------+--------------+
                1|1      |First Name 1   |Last Name 1   |
                2|2      |First Name 2   |Last Name 2   |

Copy

중첩 유형 사용을 위한 인서트

이러한 문은 테이블 생성과 select 문 사이에 배치하여 출력을 테스트해야 합니다.

Oracle
 INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com')));

INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com')));
Copy
Snowflake
 INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);

INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Copy

Nested Type Usage

Oracle
 CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20));

CREATE TYPE customer_typ_demo AS OBJECT (
    cust_name VARCHAR2(20),
    cust_email email_typ_demo
);

CREATE TABLE customer_table_demo (
    customer_id INTEGER,
    customer_data customer_typ_demo
);

SELECT * FROM customer_table_demo;
Copy
CUSTOMER_ID|CUSTOMER_DATA                    |
-----------+---------------------------------+
          1|[Customer 1, [email@domain.com]] |
          2|[Customer 2, [email2@domain.com]]|

Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20))
;

!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!

CREATE TYPE customer_typ_demo AS OBJECT (
    cust_name VARCHAR2(20),
    cust_email email_typ_demo
)
;

CREATE OR REPLACE TABLE customer_table_demo (
    customer_id INTEGER,
    customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
    customer_id,
    customer_data:cust_name :: VARCHAR AS cust_name,
    customer_data:cust_email:email :: VARCHAR AS email
FROM
    customer_table_demo;

SELECT * FROM
    customer_table_demo_view;
Copy
CUSTOMER_ID|CUST_NAME |CUST_EMAIL       |
-----------+----------+-----------------+
          1|Customer 1|email@domain.com |
          2|Customer 2|email2@domain.com|

Copy

Known Issues

1. Migrated code output is not the same

뷰 문이 불필요하게 변경되어 출력 코드에서 테이블이 더 이상 동일한 동작을 하지 않습니다. 이 문제를 수정하기 위한 작업 항목이 있습니다.

2. DML for User-defined Types is not being transformed

DML 테이블과 같이 내부에 사용자 정의 유형이 있는 요소와 상호 작용하는 요소는 변환되지 않습니다. 향후 이를 구현하기 위한 작업 항목이 있습니다.

3. Create Type creation options are not supported

현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.

관련 EWIs

  1. SSC-EWI-0056: 지원되지 않는 Create Type입니다.

  2. SSC-EWI-0062: 사용자 지정 유형 사용이 베리언트로 변경되었습니다.

  3. SSC-EWI-0073: 보류 중 함수 동등성 검토.

하위 유형 정의

알려진 해결 방법이 없으므로 SnowConvert 는 이러한 정의만 인식하며 이에 대한 변환은 지원하지 않습니다.

Description

하위 유형은 레코드와 유사한 데이터 구조를 정의하며, 멤버 함수 정의의 이점이 추가됩니다. 즉, 해당 데이터는 유형 내에서 일부 동작을 따라 사용될 수 있습니다. 오브젝트 유형과 달리 하위 유형은 다른 기존 유형의 확장자으로 구축됩니다.

하위 유형 정의에 대해서는 아직 변환이 없지만오브젝트 유형 정의를 사용하여 다시 구현한 다음 해당 변환을 사용하는 방법이 있을 수 있습니다.

 CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
Copy

Sample Source Patterns

오브젝트 유형 아래의 하위 유형

Oracle
 CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER) 
   NOT FINAL;
/

CREATE TYPE employee_t UNDER person_t 
   (department_id INTEGER, salary INTEGER) 
   NOT FINAL;
/

CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER);
/
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER)
   NOT FINAL;

--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!

--CREATE TYPE employee_t UNDER person_t
--   (department_id INTEGER, salary INTEGER)
--   NOT FINAL
            ;

--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!

--CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER)
                                                              ;
Copy

Known Issues

1. Create Type creation options are not supported

현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.

Related EWIs

  1. SSC-EWI-0056: 지원되지 않는 Create Type입니다.

  2. SSC-EWI-OR0007: Snowflake에서 지원되지 않는 Create Type입니다.