SnowConvert AI - Oracle - Create Type
This is a translation reference to convert Oracle Create Type Statements (UDTs) to snowflake
일반 설명
SnowConvert translates many Oracle CREATE TYPE statements to Snowflake native user-defined types where the shape is supported—for example object types with attributes, VARRAY mapped to Snowflake ARRAY, and nested table types mapped to ARRAY of the element type. Unsupported options (subtype inheritance, member bodies, incomplete types, and others) are flagged with Oracle-specific EWIs; see Related EWIs and the issues reference.
Oracle 데이터베이스 엔진이 제공하는 가장 중요한 기능 중 하나는 오브젝트 지향 접근 방식입니다. PL/SQL은 패키지, 함수, 테이블 및 유형의 형태로 Java와 유사한 문을 사용하여 OOP 형식으로 다른 관계형 데이터베이스를 능가하는 기능을 제공합니다. 이 문서에서는 마지막 항목 및 SnowConvert AI가 기능을 준수하면서 이를 해결하는 방법에 대해 다룹니다.
Oracle은 다음 사양을 지원합니다.
이러한 모든 내용은 Oracle 생성 유형 문 설명서 의 정보에 따른 것입니다
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]
제한 사항
Snowflake supports native user-defined types (CREATE TYPE … AS OBJECT, ARRAY, etc.) as documented in the SQL data types overview. SnowConvert maps many Oracle type definitions to those native types. Patterns that still have no or partial mapping—such as subtype inheritance (UNDER), member methods and type bodies, table types, and incomplete forward declarations—may require manual redesign or are reported via EWIs (for example SSC-EWI-OR0139 through SSC-EWI-OR0142). Semi-structured Data Types remain relevant for legacy scenarios that still use VARIANT in converted code.
다음은 해결 방법이 제안되지 않은 사용자 정의 유형 기능입니다.
하위 유형: 유형 계층 구조
이러한 문은 Snowflake에서 지원되지 않습니다. SnowConvert AI는 인식만 할 뿐 변환은 제공되지 않습니다.
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);
/
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;
중첩된 테이블 유형
이러한 문은 Snowflake에서 지원되지 않습니다. SnowConvert AI는 인식만 할 뿐 변환은 제공되지 않습니다.
CREATE TYPE textdoc_typ AS OBJECT
( document_typ VARCHAR2(32)
, formatted_doc BLOB
) ;
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
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 ();
제안된 해결 방법
유형 정의 정보
정의를 위해 제안된 해결 방법은 Oracle의 데이터 타입을 모방하는 반정형 데이터 타입을 생성하는 것입니다.
유형 멤버 함수 정보
논리 및 DML 을 포함하는 멤버 함수의 경우 제안된 해결 방법은 이를 저장 프로시저로 변환하는 도우미에 의존합니다.
현재 SnowConvert AI 지원
The next table shows a summary of the current support provided by the SnowConvert AI tool. Please keep in mind that translations may still not be final, and more work may be needed.
Known Issues
1. DML usages for Object Types — partial support
DDL definitions for User-Defined Types are translated to native Snowflake CREATE TYPE … AS OBJECT / … AS ARRAY where the shape is supported. Constructor calls (for example address_type('123 Main St', …) for object types and VARRAY_TYPE('a', 'b', 'c') for VARRAY / nested-table types) are now also translated to OBJECT_CONSTRUCT(…) :: <type> and ARRAY_CONSTRUCT(…) :: <type> respectively, in INSERT … VALUES, INSERT … SELECT, UPDATE … SET, top-level SELECT, and PL/SQL variable initialization. DML that relies on object-type member functions or other Oracle-specific UDT operations may still require manual review; an SSC-EWI-0073 is emitted in those cases.
2. Create Type creation options are not supported
현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.
배열 유형 정의
This is a translation reference to convert the Array Variant of the Oracle Create Type Statements (UDTs) to Snowflake
참고
Oracle VARRAY types are translated to Snowflake CREATE TYPE … AS ARRAY ( element_type ). Fixed varray capacity is not preserved; see SSC-FDM-0043. Column usages may still be migrated to VARIANT in older or mixed scenarios—verify generated DDL for your workload.
VARRAY and nested-table constructor calls (for example phone_list_typ_demo('2000-0000', '4000-0000')) used in INSERT, UPDATE and top-level SELECT are translated to ARRAY_CONSTRUCT(...) :: <type_name>. See VARRAY constructor calls in DML below.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명
배열 유형은 이전에 존재하는 데이터 타입(다른 사용자 정의 유형 포함)의 배열 구조를 정의합니다.
For many workloads, the type definition is emitted as a Snowflake native ARRAY type. Usages in tables and PL/SQL may still involve Semi-structured Data Types or OBJECT depending on context.
CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
샘플 소스 패턴
배열 사용법에 대한 인서트
VARRAY and nested-table constructor calls used in INSERT … VALUES, INSERT … SELECT, UPDATE and top-level SELECT are translated to ARRAY_CONSTRUCT(...) and explicitly cast to the original UDT name with :: <type>, so column type checks against the UDT continue to succeed.
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'));
Snowflake
INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, ARRAY_CONSTRUCT('2000-0000', '4000-0000', '0000-0000') :: phone_list_typ_demo);
INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, ARRAY_CONSTRUCT('8000-2000', '0000-0000', '5000-0000') :: phone_list_typ_demo);
VARRAY constructor calls in DML
The translator handles standalone constructor calls in INSERT … VALUES, INSERT … SELECT, UPDATE … SET, and top-level SELECT statements. For nested-table types defined with CREATE TYPE … AS TABLE OF … the same ARRAY_CONSTRUCT(...) :: <type> shape is produced.
Oracle
CREATE TYPE VARRAY_TYPE AS VARRAY(3) OF VARCHAR2(50);
/
CREATE TABLE my_varray_table (id NUMBER, varray_column VARRAY_TYPE);
/
INSERT INTO my_varray_table SELECT 1, VARRAY_TYPE('Apple', 'Banana', 'Orange') FROM dual;
CREATE TYPE NUMBER_LIST AS TABLE OF NUMBER;
/
INSERT INTO my_table SELECT 1, NUMBER_LIST(10, 20, 30) FROM dual;
Snowflake
--** SSC-FDM-0043 - ARRAY SIZE LIMIT '3' WAS REMOVED. SNOWFLAKE ARRAYS ARE DYNAMICALLY SIZED. **
CREATE TYPE VARRAY_TYPE AS ARRAY ( VARCHAR(50) );
CREATE OR REPLACE TABLE my_varray_table (
id NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
varray_column ARRAY
)
;
INSERT INTO my_varray_table
SELECT
1,
ARRAY_CONSTRUCT('Apple', 'Banana', 'Orange') :: VARRAY_TYPE
FROM
dual;
CREATE TYPE NUMBER_LIST AS ARRAY ( NUMBER(38, 18) );
INSERT INTO my_table
SELECT
1,
ARRAY_CONSTRUCT(10, 20, 30) :: NUMBER_LIST
FROM
dual;
Oracle (top-level SELECT)
CREATE TYPE STRING_ARRAY AS VARRAY(5) OF VARCHAR2(100);
/
SELECT STRING_ARRAY('hello', 'world') FROM dual;
Snowflake
--** SSC-FDM-0043 - ARRAY SIZE LIMIT '5' WAS REMOVED. SNOWFLAKE ARRAYS ARE DYNAMICALLY SIZED. **
CREATE TYPE STRING_ARRAY AS ARRAY ( VARCHAR(100) );
SELECT
ARRAY_CONSTRUCT('hello', 'world') :: STRING_ARRAY
FROM
dual;
배열 유형 사용법
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;
/
Snowflake
--** SSC-FDM-0043 - ARRAY SIZE LIMIT '3' WAS REMOVED. SNOWFLAKE ARRAYS ARE DYNAMICALLY SIZED. **
CREATE TYPE phone_list_typ_demo AS ARRAY ( VARCHAR(25) );
CREATE OR REPLACE TABLE customer_table_demo (
customer_table_id INTEGER,
customer_data phone_list_typ_demo
)
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;
Known Issues
1. Create Type creation options are not supported
현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.
2. Migrated code output is not functional
문이 불필요하게 변경되어 출력 코드에서 더 이상 함수를 발휘하지 못합니다. 이 문제는 적절한 변환이 이루어지면 해결될 것입니다.
멤버 함수 정의
This is a translation reference to convert the Member Functions of the Oracle Create Type Statements (UDTs) to Snowflake
위험
SnowConvert AI는 유형 멤버 함수 또는 유형 본문 정의를 여전히 인식하지 못합니다. 이 페이지는 향후 변환 참조용으로만 사용됩니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명
다른 클래스 정의와 마찬가지로 Oracle의 TYPE 은 그 특성에 따라 동작을 노출하는 메서드를 구현할 수 있습니다. MEMBER FUCTION 은 제한 사항으로 인해 기능적 동등성을 유지하기 위해 Snowflake의 저장 프로시저로 변환됩니다.
함수는 프로시저로 변환되므로, PL/SQL에 대한 변환 참조도 여기에 적용됩니다.
샘플 소스 패턴
Simple square() 멤버 함수에 대한 삽입물
다음 데이터는 선택 쿼리 전에 테이블 내부에 삽입됩니다. 이러한 인서트는 현재 Snowflake로 수동으로 마이그레이션해야 합니다.
Oracle
INSERT INTO table_member_function_demo(column1) VALUES
(type_member_function_demo(5));
Snowflake
INSERT INTO table_member_function_demo (column1)
SELECT OBJECT_CONSTRUCT('a1', 5);
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;
/
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
<strong>COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "" }}'
</strong><strong>AS
</strong>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;
중첩된 테이블 유형 정의
This is a translation reference to convert the Nested Table Variant of the Oracle Create Type Statements (UDTs) to Snowflake
참고
Standalone CREATE TYPE … AS TABLE OF element_type is translated to Snowflake CREATE TYPE … AS ARRAY ( element_type ) when the element type is supported. Nested tables used as table columns may still require manual review depending on DML and PL/SQL usage.
설명
Nested Table Types define an embedded table structure of a previously existing datatype (including other Custom Types). They are closely related to Array Type definitions; SnowConvert maps many patterns to Snowflake ARRAY.
CREATE TYPE <type name> AS TABLE OF <data type>
샘플 소스 패턴
중첩된 테이블 유형 사용법
Oracle
CREATE TYPE textdoc_typ AS OBJECT (
document_typ VARCHAR2(32),
formatted_doc BLOB
);
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Snowflake
CREATE TYPE textdoc_typ AS OBJECT (
document_typ VARCHAR(32),
formatted_doc BINARY
)
;
CREATE TYPE textdoc_tab AS ARRAY ( textdoc_typ );
Known Issues
1. Create Type creation options are not supported
현재로서는 이러한 생성 옵션에 대한 알려진 해결 방법이 없으므로 유형을 정의할 때 이러한 옵션은 고려되지 않습니다.
오브젝트 유형 정의
This is a translation reference to convert the Object Variant of the Oracle Create Type Statements (UDTs) to Snowflake
참고
SnowConvert AI는 오브젝트 유형 정의 자체에 대한 변환을 지원합니다. 그러나 사용법은 아직 진행 중입니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명
오브젝트 타입은 레코드와 유사한 데이터 구조를 정의하며, 멤버 함수 정의의 이점이 추가됩니다. 즉, 해당 데이터는 유형 내에서 일부 동작을 따라 사용될 수 있습니다.
For the translation of object types, the type definition is mapped to Snowflake’s native CREATE TYPE … AS OBJECT (…) where the attribute list is supported, and constructor calls to the type are translated to OBJECT_CONSTRUCT(<field>, <value>, …) :: <type_name>. SnowConvert AI uses the symbol table to recover the field names from the original CREATE TYPE, so positional constructor arguments are mapped to the correct field names in upper-case. When the type symbol cannot be resolved (for example, because the CREATE TYPE is not part of the migrated source set), the constructor call is preserved and an SSC-EWI-0073 is emitted for manual review.
For legacy or partially-supported scenarios where the object type cannot be expressed natively, the column in dependent tables may still be migrated to VARIANT and an auxiliary view is added so that downstream SELECTs and views to the original table continue to work.
CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
샘플 소스 패턴
Object Type constructor calls
Object-type constructor calls are translated to OBJECT_CONSTRUCT('FIELD1', value1, 'FIELD2', value2, …) :: <type_name>. The cast to the original UDT name is preserved so column type checks and downstream OBJECT_INSERT / member access continue to work without changes. The transformation applies to constructor calls inside variable initialization, INSERT … VALUES, INSERT … SELECT, UPDATE … SET, and top-level SELECT expressions.
참고
Field names in the generated OBJECT_CONSTRUCT keys are always upper-case (for example 'NAME', 'AGE'). Snowflake object key lookups are case-sensitive, so downstream references using lowercase or mixed-case semi-structured path syntax (for example obj:name) will return NULL. Use the exact upper-case key or quote it consistently throughout the migrated code.
Oracle
CREATE OR REPLACE TYPE Person_Type AS OBJECT (
Name VARCHAR2(50),
Age NUMBER
);
/
CREATE OR REPLACE PROCEDURE test_udt_constructor
AS
person Person_Type := Person_Type('Alice', 30);
BEGIN
NULL;
END;
Snowflake
CREATE TYPE Person_Type AS OBJECT (Name VARCHAR(50), Age NUMBER(38, 18));
CREATE OR REPLACE PROCEDURE test_udt_constructor ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
person Person_Type := OBJECT_CONSTRUCT('NAME', 'Alice', 'AGE', 30) :: Person_Type;
BEGIN
NULL;
END;
$$;
Oracle (constructor in INSERT … VALUES and UPDATE … SET)
CREATE OR REPLACE TYPE address_type AS OBJECT (
street VARCHAR2(100),
city VARCHAR2(50),
state VARCHAR2(2),
postal_code VARCHAR2(10)
);
/
INSERT INTO employees
VALUES (1, 'John', 'Doe', address_type('123 Main St', 'Los Angeles', 'CA', '90001'));
UPDATE employees
SET home_address = address_type('456 Oak Ave', 'New York', 'NY', '10001')
WHERE employee_id = 1;
Snowflake
CREATE TYPE address_type AS OBJECT (street VARCHAR(100), city VARCHAR(50), state VARCHAR(2), postal_code VARCHAR(10));
INSERT INTO employees
VALUES (1, 'John', 'Doe', OBJECT_CONSTRUCT('STREET', '123 Main St', 'CITY', 'Los Angeles', 'STATE', 'CA', 'POSTAL_CODE', '90001') :: address_type);
UPDATE employees
SET
home_address = OBJECT_CONSTRUCT('STREET', '456 Oak Ave', 'CITY', 'New York', 'STATE', 'NY', 'POSTAL_CODE', '10001') :: address_type
WHERE
employee_id = 1;
Oracle (constructor when the type symbol is not in the migrated source)
CREATE OR REPLACE FUNCTION Get_Person_Func
RETURN Person_Type
AS
v_person Person_Type;
BEGIN
v_person := Person_Type('Jane Doe', 25);
RETURN v_person;
END;
Snowflake
CREATE OR REPLACE FUNCTION Get_Person_Func ()
RETURNS Person_Type
LANGUAGE SQL
AS
$$
WITH declaration_variables_cte1 AS
(
SELECT
Person_Type('Jane Doe', 25) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Person_Type' NODE ***/!!! AS
v_person
)
SELECT
v_person
FROM
declaration_variables_cte1
$$;
단순 유형 사용을 위한 인서트
다음 데이터는 선택 쿼리 전에 테이블 내부에 삽입됩니다. 이러한 인서트는 현재 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'));
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 ***/!!!);
단순 유형 사용
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;
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;
중첩 유형 사용을 위한 인서트
이러한 문은 테이블 생성과 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')));
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 ***/!!!);
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;
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;
Known Issues
1. Migrated code output is not the same
뷰 문이 불필요하게 변경되어 출력 코드에서 테이블이 더 이상 동일한 동작을 하지 않습니다. 이 문제를 수정하기 위한 작업 항목이 있습니다.
2. DML for User-defined Types — partial support
Constructor calls to object types (for example address_type('123 Main St', …)) and to collection types (VARRAY and nested-table) are now translated automatically when they appear in INSERT … VALUES, INSERT … SELECT, UPDATE … SET, and top-level SELECT expressions, as well as in PL/SQL variable initialization. See Object Type constructor calls above. Other DML shapes that depend on object-type member functions or implicit type promotion may still require manual review.
3. Create Type creation options are not supported
현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.
하위 유형 정의
This is a translation reference to convert the Subtype Variant of the Oracle Create Type Statements (UDTs) to Snowflake
위험
알려진 해결 방법이 없으므로 SnowConvert AI는 이러한 정의를 인식만 할 뿐 이에 대한 변환은 지원하지 않습니다.
설명
하위 유형은 레코드와 유사한 데이터 구조를 정의하며, 멤버 함수 정의의 이점이 추가됩니다. 즉, 해당 데이터는 유형 내에서 일부 동작을 따라 사용될 수 있습니다. 오브젝트 유형과 달리 하위 유형은 다른 기존 유형의 확장자으로 구축됩니다.
하위 유형 정의에 대해서는 아직 변환이 없지만오브젝트 유형 정의를 사용하여 다시 구현한 다음 해당 변환을 사용하는 방법이 있을 수 있습니다.
CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
샘플 소스 패턴
오브젝트 유형 아래의 하위 유형
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);
/
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)
;
Known Issues
1. Create Type creation options are not supported
현재 생성 옵션에 대한 알려진 해결 방법은 없으며, 이러한 이유로 유형을 정의할 때 계정을 고려하지 않습니다.