SnowConvert: Oracle SQL ステートメント¶
テーブルを変更¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
1.説明¶
パーティショニングされていないテーブル、パーティショニングされたテーブル、テーブルパーティション、テーブルサブパーティションの定義を変更するには、 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 }
] ...
;
注釈
Snowflakeの構文を確認するには、以下の ドキュメント を参照してください。
2.サンプルソースパターン¶
2.1.句によるテーブルの変更¶
警告
memoptimize_read_clause、 memoptimize_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;
Snowflake
ALTER TABLE SOMESCHEMA.SOMENAME
ADD (SOMECOLUMN NUMBER(38, 18), SOMEOTHERCOLUMN VARCHAR(23));
注釈
Snowflakeでは、 column_clausesとconstraint_clauses の一部のみが適用可能です。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));
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));
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);
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;
既知の問題¶
テーブルのプロパティによっては、適応されるもの、または適用できないものがあります。
データベースリンクの作成¶
警告
現在、_ データベースリンクの作成 _ ステートメントは変換されていませんが、解析されています。また、ソースコードに データベースリンクの作成
ステートメントがある場合、それらは _ 評価レポート _ に記載されます。
ソースコードの例¶
CREATE PUBLIC DATABASE LINK db_link_name
CONNECT TO CURRENT_USER
USING 'connect string'
CREATE DATABASE LINK db_link_name2
CONNECT TO user_name IDENTIFIED BY user_password
USING 'connect string'
CREATE PUBLIC DATABASE LINK db_link_name3
Snowflakeの出力¶
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name
--CONNECT TO CURRENT_USER
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK db_link_name2
--CONNECT TO user_name IDENTIFIED BY user_password
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name3
データベースリンクリファレンス¶
入力コードでデータベースリンクのオブジェクトを使用した場合、出力コードではこれらのオブジェクトの名前は保持されますが、それらが使用しているデータベースリンクの名前は削除されます。
ソースコードの例¶
-- CREATE DATABASE LINK STATEMENTS
CREATE DATABASE LINK mylink1
CONNECT TO user1 IDENTIFIED BY password1
USING 'my_connection_string1';
CREATE DATABASE LINK mylink2
CONNECT TO user2 IDENTIFIED BY password2
USING 'my_connection_string2';
-- SQL statements that use the database links
SELECT * FROM products@mylink1;
INSERT INTO employees@mylink2
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', SYSDATE, 'SH_CLERK');
UPDATE jobs@mylink2 SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM employees@mylink2
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
SELECT * FROM products@mylink;
Snowflakeの出力¶
---- CREATE DATABASE LINK STATEMENTS
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink1
-- CONNECT TO user1 IDENTIFIED BY password1
-- USING 'my_connection_string1'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink2
-- CONNECT TO user2 IDENTIFIED BY password2
-- USING 'my_connection_string2'
-- SQL statements that use the database links
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink1 | USER: user1/password1 | CONNECTION: 'my_connection_string1' ] ***/!!!
products;
INSERT INTO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', CURRENT_TIMESTAMP(), 'SH_CLERK');
UPDATE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
jobs
SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "mylink" **
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink | USER: / | CONNECTION: ] ***/!!!
products;
関連 EWIs¶
SSC-EWI-OR0123: データベースリンク接続はサポートされていません。
SSC-FDM-0007: 依存関係のない要素。
テーブルを削除¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
テーブルを削除するには、テーブルの削除ステートメントを使用します。このステートメントは、Oracle と Snowflake で少し異なります。相違点の詳細については、各ドキュメントを再確認してください。
Oracleでは、テーブルの削除の構文は次のようになります。
DROP TABLE <table_name> [ CASCADE CONSTRAINTS ] [ PURGE ]
Snowflakeでは、テーブルの削除の構文は次のようになります。
DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
主な違いは、テーブルがシステムから永久に削除されないため、Snowflakeには PURGE 句のイコールがないことです。ただし、CASCADE CONSTRAINTS と CASCADE 句は 同じです。どちらも、このテーブルを参照する外部キーが存在しても、テーブルを削除します。
例¶
それでは、コードの例と、変換後のコードを見てみましょう。各例では、テーブルの削除ステートメントの異なるバリエーションを使用しています。
例1:¶
この例では、 テーブルの削除 ステートメントをできるだけシンプルに使用しています。
入力コード:
DROP TABLE TEST_TABLE1;
変換後のコード:
DROP TABLE TEST_TABLE1;
例2:¶
この例では、 テーブルの削除 ステートメントと PURGE 句を使用しています。Snowflakeには、テーブルの削除ステートメント内の PURGE 句に相当するものがないことを覚えておいてください。
入力コード:
DROP TABLE TEST_TABLE1 PURGE;
変換後のコード:
DROP TABLE TEST_TABLE1;
例3:¶
この例では、 テーブルの削除 ステートメントと CASCADE CONSTRAINTS 句を使用しています。
入力コード:
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS;
変換後のコード:
DROP TABLE TEST_TABLE1 CASCADE;
変換後のコードでは、CASCADE CONSTRAINTS 句から CONSTRAINTS の単語が削除されています。
例4:¶
この例では、 テーブルの削除 ステートメントと、CASCADE CONSTRAINTS および PURGE 句を使用しています。
入力コード:
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS PURGE;
変換後のコード:
DROP TABLE TEST_TABLE1 CASCADE;
ご覧のように、コードが変わります。新しい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;
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;
関連 EWIs¶
関連 EWIs はありません。
インデックスの作成¶
警告
現在、_ Create Index _ ステートメントは変換されていませんが、解析されています。また、ソースコードにCreate index
ステートメントがある場合、_ Assessment Report _ ではこれらも考慮されます。
インデックスの作成 を解析したコードの例:¶
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;
注釈
アーキテクチャ上の理由により、Snowflakeはインデックスをサポートしていないため、 SnowConvert はインデックスの作成に関連するすべてのコードを削除します。Snowflakeは自動的にすべてのテーブルにマイクロパーティションを作成し、 DML 操作のパフォーマンスを高速化します。ユーザーはこれらのマイクロパーティションの作成や管理を心配する必要はありません。
通常、これだけで非常に優れたクエリパフォーマンスが得られます。しかし、データクラスタリングキーを作成することで改善する方法があります。Snowflakeの公式ページ には、マイクロパーティションとデータクラスタリングに関する詳細情報が掲載されています。
マテリアライズドビューの作成¶
説明¶
Snowconvertでは、OracleマテリアライズドビューがSnowflake動的テーブルに変換されます。動的テーブルを適切に構成するには、2つの重要なパラメーターを定義する必要があります: TARGET_LAG と WAREHOUSE。これらのパラメーターが構成オプションで指定されないままになっている場合、以下の例に示すように、Snowconvertは変換中にデフォルト値として事前に割り当てられた値を使用します。
マテリアライズドビューの詳細情報については、 こちら をクリックしてください。
動的テーブルに必要なパラメーターについては、 こちら をご覧ください。
サンプルソースパターン¶
Oracle
CREATE MATERIALIZED VIEW sales_total
AS
SELECT SUM(amount) AS total_sales
FROM sales;
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;
更新モード¶
Snowflakeの動的テーブルは、Oracleのマテリアライズドビューの更新モードと同等のものをサポートしています。対応するモードは以下の通りです。
Oracle:
FAST: 変更のあった行のみを更新します。
COMPLETE: マテリアライズドビュー全体を更新します。
FORCE: 可能であれば FAST を使用し、そうでなければ COMPLETE を使用します。
Snowflake:
AUTO: 自動的に最適な更新方法を決定します。
FULL: テーブル全体を更新します。Oracleの COMPLETE モードに相当します。
INCREMENTAL: 変更された行のみを更新します。
デフォルトの更新モード¶
SnowConvert を使用している場合、動的テーブルのデフォルトの更新モードは AUTO です。
モードマッピング¶
Oracle FAST および FORCE -> 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;
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;
既知の問題¶
現在、既知のエラーは検出されていません。
関連 EWIs¶
ssc-fdm-0031.md: デフォルトでセットされる動的テーブルの必須パラメーター
シーケンスを作成¶
まずはコード例と、変換後のコードを見てみましょう。
入力コード:¶
CREATE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
出力コード:¶
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"}}';
最初に行われる変更は、シーケンスの名前にスキーマやデータウェアハウスを適用することです。2つ目の変換は、いくつかの要素を削除し、コメントとして追加することです。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;
出力コード:¶
select seq1.nextval from dual;
select
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0069 - THE SEQUENCE CURRVAL PROPERTY IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! seq1.currval from dual;
シーケンス 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;
出力コード:¶
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"}}';
関連 EWIs¶
SSC-EWI-OR0069: シーケンス CURRVAL プロパティはSnowflakeではサポートされていません。
SSC-EWI-OR0068: シーケンス開始値がSnowflakeで許容される最大値を超えています。
セッションを変更¶
セッションを変更¶
セッションの変更はSnowflakeで同等の機能を持っており、いくつかの変数はSnowflake変数にマッピングされています。セッションの変更の順列がサポートされていない場合、そのノードはコメントされ、警告が追加されます。
Oracleコード:¶
alter session set nls_date_format = 'DD-MM-YYYY';
Snowflakeコード:¶
ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
セッションパラメーターリファレンス¶
注釈
テーブルに表示されていないセッションパラメーターは、現在変換されていません。
セッションパラメーター |
Snowflake変換 |
---|---|
NLS_DATE_FORMAT |
DATE_INPUT_FORMAT および DATE_OUTPUT_FORMAT |
NLS_NUMERIC_CHARACTERS |
NOT SUPPORTED |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
同義語の作成¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
同義語の作成¶
同義語はSnowflakeではサポートされていません。同義語への参照は、元のオブジェクトに対して変更されます。
入力コード:¶
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 B.TABLITA_SYNONYM FOR TABLITA
;
例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;
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;
例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);
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);
例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;
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;
同義語変換は、UI 設定から有効または無効にできます。
関連 EWIs¶
SSC-FDM-0001: 単一のテーブルからすべての列を選択するビューはSnowflakeでは必要ありません。
SSC-FDM-0006: Snowflakeで数値タイプ列が同様に動作しない場合があります。
SSC-FDM-OR0005: 同義語はSnowflakeではサポートされていませんが、この同義語への参照は元のオブジェクト名で変更されました。
テーブルを作成¶
1.説明¶
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 ] ;
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>' , ... ] ) ]
注釈
Snowflakeの詳細情報については、以下の ドキュメント を参照してください。
2.サンプルソースパターン¶
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;
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"}}'
;
注釈
テーブルプロパティは、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
);
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"}}'
;
一方、同じように、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
);
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"}}'
;
2.3.外部キー¶
精度もスケールもない NUMBER 列を持つテーブルと、前述の NUMBER 列を参照する NUMBER(*,0)列を持つ別のテーブルがある場合、この外部キーをコメントアウトします。
Oracle
CREATE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER,
CONSTRAINT "PK" PRIMARY KEY ("COL1")
);
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"}}'
;
2.4.仮想列¶
Oracle
CREATE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER GENERATED ALWAYS AS (COL1 * COL2) VIRTUAL
);
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"}}'
;
2.5.アイデンティティ列¶
アイデンティティ列の場合、シーケンスが作成され、列に割り当てられます。
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
);
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"}}'
;
2.6.CLOB および BLOB 列宣言¶
CLOB または BLOB として宣言された列は、VARCHAR に変更されます。
Oracle
CREATE TABLE T
(
Col1 BLOB DEFAULT EMPTY_BLOB(),
Col5 CLOB DEFAULT EMPTY_CLOB()
);
Snowflake
CREATE OR REPLACE TABLE T
(
Col1 BINARY,
Col5 VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.7.制約名¶
警告
制約名はSnowflakeでは適用できないため、コードから削除されています。
Oracle
CREATE TABLE "CustomSchema"."BaseTable"(
"PROPERTY" VARCHAR2(64) CONSTRAINT "MICROSOFT_NN_PROPERTY" NOT NULL ENABLE
);
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"}}'
;
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')
);
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"}}'
;
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 ]
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;
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;
既知の問題¶
Snowflakeでの動作が異なるため、テーブルのプロパティの一部を適応したり、コメントしたりする場合があります。
関連 EWIs¶
SSC-EWI-0035: チェックステートメントがサポートされていません。
SSC-FDM-0006: Snowflakeで数値タイプ列が同様に動作しない場合があります。
SSC-FDM-0019: セマティック情報をロードできませんでした。
SSC-FDM-OR0042: タイムスタンプに変換された日付タイプの動作が異なります。
SSC-FDM-OR0006: not nullインライン制約から制約状態が削除されました。
ビューを作成¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
ビューを作成¶
CREATE OR REPLACE VIEW View1 AS SELECT Column1 from Schema1.Table1;
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;
ビューの作成に関する以下の句が削除されました。
強制なし/強制
エディション句
共有句
デフォルトの照合順序
遺贈句
コンテナー句
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;
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;
ビューを変更¶
変更はまだ SnowConvert ではサポートされていません。
ビューを削除¶
CASCADE CONSTRAINT 句はまだサポートされていません。
DROP VIEW Schema1.View1;
DROP VIEW Schema1.View1
CASCADE CONSTRAINTS;
DROP VIEW Schema1.View1;
DROP VIEW Schema1.View1
CASCADE CONSTRAINTS !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DropBehavior' NODE ***/!!!;
関連 EWIs¶
SSC-EWI-0073: 機能同等性レビュー保留中。
タイプを作成¶
概要¶
Oracleデータベースエンジンが提供する最も重要な機能の1つは、オブジェクト指向のアプローチです。PL/SQL は、パッケージ、関数、テーブル、タイプという形でJavaライクなステートメントを使用することにより、OOP という形で他のリレーショナルデータベースを超える機能を提供します。このドキュメントでは、最後の1つを取り上げ、SnowConvert が機能に準拠したまま、どのようにそれを解決するかを説明します。
Oracleは以下の仕様をサポートしています。
抽象データ型(ADT)(SQLJ オブジェクト型を含む)。
スタンドアロンの変化する配列(varray)型。
スタンドアロンのネストされたテーブル型。
不完全なオブジェクト型。
これらの情報は、Oracle作成タイプステートメントドキュメント に記載されています。
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]
制限事項¶
オンラインドキュメントの サポートされていないデータ型 によると、Snowflakeはユーザー定義データ型をサポートしていませんが、半構造化データ型 をサポートしており、ほとんどのユーザー定義データ型の階層のような構造を模倣することができます。このため、回避策がないタイプの機能も複数あります。
以下は、 NO の回避策が提案されているユーザー定義型の機能です。
サブタイプ: タイプ階層¶
これらのステートメントは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);
/
タイププロパティ¶
これらは、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 は認識するだけで、翻訳は提供されません。
CREATE TYPE textdoc_typ AS OBJECT
( document_typ VARCHAR2(32)
, formatted_doc BLOB
) ;
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
タイプソース作成オプション¶
これらのオプションは、タイプへのアクセスやクエリに関するカスタムオプションです。
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 サポート¶
次のテーブルは、 SnowConvert ツールが現在提供しているサポートの概要です。翻訳はまだ最終的なものではない可能性があり、さらに作業が必要な場合があることをご考慮ください。
Type Statement Element | Current recognition status | Current translation status | Has Known Workarounds |
---|---|---|---|
Object Type Definitions | Recognized. | Partially Translated. | Yes. |
Subtype Definitions | Recognized. | Not Translated. | No. |
Array Type Definitions | Recognized. | Not Translated. | Yes. |
Nested Table Definitions | Recognized. | Not Translated. | No. |
Member Function Definitions | Recognized. | Not Translated. | Yes. |
既知の問題¶
1.オブジェクト型の DML の使用は変換されていません¶
現時点では、ユーザー定義型を使用する DDL 定義のみがバリアントに変換されます。つまり、ユーザー定義型を使用した挿入、更新、削除は変換されず、手動で変換する必要があります。これに対する EWI はありませんが、対応する EWI を追加する作業項目があります。
2.タイプ作成オプションはサポートされていません¶
現在、いずれの作成オプションにも既知の回避策はありません。これらの理由により、タイプを定義するときには作成オプションは考慮されません。
関連 EWIs¶
関連 EWIs はありません。
配列型定義¶
SnowConvert はこれらの定義のみを認識し、今のところ翻訳をサポートしていません。このページは、今後の翻訳のリファレンスとしてのみ使用します。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
配列型は、既存のデータ型(他のカスタム型を含む)の配列構造を定義します。
配列型の翻訳では、型定義は 半構造化データ型 に置き換えられ、コード全体で使用される場合に展開されます。これは、型の定義を元のコード上に展開することを意味します。
CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
サンプルソースパターン¶
配列の使用に対する挿入¶
次のデータは、選択をクエリする前にテーブルに挿入されます。これらの挿入は現在、手動で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'));
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');
配列型の使用法¶
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;
/
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|[['2000-0000','4000-0000','0000-0000']]|
1|[['8000-2000','0000-0000','5000-0000']]|
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;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|{['2000-0000','4000-0000','0000-0000']}|
1|{['8000-2000','0000-0000','5000-0000']}|
既知の問題¶
1.タイプ作成オプションはサポートされていません¶
現在、いずれの作成オプションにも既知の回避策はありません。これらの理由により、タイプを定義するときには作成オプションは考慮されません。
2.移行されたコード出力は機能しません¶
ステートメントが不必要に変更され、出力コード上で機能しなくなっています。適切な変換が実施されれば、この問題は解決されるでしょう。
関連 EWIs¶
SSC-EWI-0062: カスタムタイプの使用がバリアントに変更されました。
SSC-EWI-0073: 機能同等性レビュー保留中。
メンバー関数の定義¶
SnowConvert は型メンバー関数も型本文定義も認識しません。このページは、今後の翻訳のリファレンスとしてのみ使用します。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
他の型定義と同様に、Oracleの TYPE は、その属性に基づいた動作を公開するメソッドを実装できます。MEMBER FUCTION をSnowflakeのストアドプロシージャに変換し、制限による機能的等価性を維持します。
関数がプロシージャに変換されるため、PL/SQL の変換リファレンス がここでも適用されます。
サンプルソースパターン¶
単純な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);
単純な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;
/
T.COLUMN1.GET_SQUARE()|
----------------------+
25|
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;
GET_SQUARE()|
------------+
25|
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-EWI-0056: 作成タイプがサポートされていません。
SSC-EWI-0062: カスタムタイプの使用がバリアントに変更されました。
SSC-EWI-0073: 機能同等性レビュー保留中。
SSC-EWI-OR0007: 作成タイプがSnowflakeでサポートされていません
ネストされたテーブル型定義¶
SnowConvert はこれらの定義のみを認識し、翻訳はサポートしておらず、回避策も知られていません。
Description
ネストされたテーブル型は、既存のデータ型(他のカスタム型を含む)の埋め込みテーブル構造を定義します。配列型の強力なバージョンとして使うことができます。
他の型とは異なり、回避策や可能な翻訳がまだ知られていません。
CREATE TYPE <type name> AS TABLE OF <data type>
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;
/
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;
Known Issues
1. Create Type creation options are not supported
現在、いずれの作成オプションにも既知の回避策はありません。これらの理由により、タイプを定義するときには作成オプションは考慮されません。
Related EWIs
SSC-EWI-0073: 機能同等性レビュー保留中
SSC-EWI-0056: 作成タイプがサポートされていません。
オブジェクト型定義
注釈
SnowConvert はオブジェクト型定義自体の翻訳をサポートしています。しかし、その使用法はまだ未完成です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
オブジェクト型は、記録に似たデータ構造を定義しますが、メンバー関数の定義という利点が加わります。つまり、そのデータは型内の何らかの動作に沿って使用される可能性があるということです。
オブジェクト型の翻訳では、型定義は 半構造化データ型 に置き換えられ、コード全体で使用される場合に展開されます。テーブルの場合、これはバリアント用の列を置き換えることを意味し、ビューを追加することで、元のテーブルへの選択(およびビュー)がまだ機能するようにします。
CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
サンプルソースパターン¶
単純な型の使用時の挿入¶
次のデータは、選択をクエリする前にテーブルに挿入されます。これらの挿入は現在、手動で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;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+------------------------------+
1|[1, First Name 1, Last Name 1]|
2|[2, First Name 2, Last Name 2]|
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;
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 |
ネストされた型の使用時の挿入¶
これらのステートメントは、出力をテストするために、テーブルの作成と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 ***/!!!);
ネストされた型の使用¶
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;
CUSTOMER_ID|CUSTOMER_DATA |
-----------+---------------------------------+
1|[Customer 1, [email@domain.com]] |
2|[Customer 2, [email2@domain.com]]|
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;
CUSTOMER_ID|CUST_NAME |CUST_EMAIL |
-----------+----------+-----------------+
1|Customer 1|email@domain.com |
2|Customer 2|email2@domain.com|
既知の問題¶
1.移行したコードの出力が異なります¶
ビューステートメントが不必要に変更されているため、出力コードでテーブルが同じ動作をしなくなっています。この問題を修正するための作業項目があります。
2.DML ユーザー定義型は変換されません¶
(テーブルのような)ユーザー定義型を持つ要素と相互作用する DML は変換されません。将来的にこれを実装するための作業項目があります。
3.タイプ作成オプションはサポートされていません¶
現在、いずれの作成オプションにも既知の回避策はありません。これらの理由により、タイプを定義するときには作成オプションは考慮されません。
関連 EWIs¶
SSC-EWI-0056: 作成タイプがサポートされていません。
SSC-EWI-0062: カスタムタイプの使用がバリアントに変更されました。
SSC-EWI-0073: 機能同等性レビュー保留中。
サブタイプの定義¶
既知の回避策がないため、SnowConvert はこれらの定義のみを認識し、それに対する翻訳はサポートしていません。
Description
サブタイプは、記録に似たデータ構造を定義しますが、メンバー関数の定義という利点が加わります。つまり、そのデータは型内の何らかの動作に沿って使用される可能性があるということです。オブジェクト型とは異なり、サブタイプは既存のタイプの拡張として構築されます。
サブタイプの定義については、まだ翻訳がありませんが、オブジェクト型定義を使って再実装し、それぞれの翻訳を使う方法があるかもしれません。
CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
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);
/
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
現在、いずれの作成オプションにも既知の回避策はありません。これらの理由により、タイプを定義するときには作成オプションは考慮されません。
Related EWIs
SSC-EWI-0056: 作成タイプがサポートされていません。
SSC-EWI-OR0007: 作成タイプがSnowflakeでサポートされていません。