SnowConvert AI :Oracle - リテラル¶
リテラルと定数値は同義語で、固定データ値を指します。\([OracleSQL Language Reference Literals](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Literals.html#GUID-192417E8-A79D-4A1D-9879-68272D925707))
間隔リテラル¶
現在のシナリオではサポートされていないインターバルリテラル
説明¶
Snowflake間隔は算術演算でのみ使用できます。その他のシナリオで使用される間隔はサポートされていません。
コード例¶
Oracle¶
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Snowflake¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
既知の問題¶
問題は見つかりませんでした。
間隔タイプと日付タイプ¶
Interval型とDate型の間の操作はサポートされていません
説明¶
INTERVAL YEAR TO MONTH および INTERVAL DAY TO SECOND はサポートされていないデータ型で、それらは VARCHAR(20) に変換されます。したがって、 Date型 と元の Interval型列 との間のすべての算術演算はサポートされていません。
さらに、SnowflakeではInterval型とDate型(この順序)の間の操作はサポートされておらず、これらの操作でもこのEWIが使用されます。
コード例¶
Oracle¶
CREATE TABLE table_with_intervals
(
date_col DATE,
time_col TIMESTAMP,
intervalYearToMonth_col INTERVAL YEAR TO MONTH,
intervalDayToSecond_col INTERVAL DAY TO SECOND
);
-- Date + Interval Y to M
SELECT date_col + intervalYearToMonth_col FROM table_with_intervals;
-- Date - Interval D to S
SELECT date_col - intervalDayToSecond_col FROM table_with_intervals;
-- Timestamp + Interval D to S
SELECT time_col + intervalDayToSecond_col FROM table_with_intervals;
-- Timestamp - Interval Y to M
SELECT time_col - intervalYearToMonth_col FROM table_with_intervals;
Snowflake¶
CREATE OR REPLACE TABLE table_with_intervals
(
date_col TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
time_col TIMESTAMP(6),
intervalYearToMonth_col VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!,
intervalDayToSecond_col VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO SECOND DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
-- Date + Interval Y to M
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col + intervalYearToMonth_col FROM
table_with_intervals;
-- Date - Interval D to S
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col - intervalDayToSecond_col FROM
table_with_intervals;
-- Timestamp + Interval D to S
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col + intervalDayToSecond_col FROM
table_with_intervals;
-- Timestamp - Interval Y to M
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col - intervalYearToMonth_col FROM
table_with_intervals;
推奨事項¶
Oracleの動作をシミュレートするために UDF を実装します。
移行時に列に格納されていたすでに変換済みの値を抽出し、可能であればSnowflake間隔定数として使用します。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
関連 EWIS¶
SSC-EWI-0036: データ型が別のデータ型に変換されました。
[SSC-EWI-OR0095](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI.md#ssc-ewi-or0095):Interval型とDate型の間の操作はサポートされていません。
[SSC-FDM-OR0042](../../../general/technical-documentation/issues-and-troubleshooting/functional-difference/oracleFDM.md#ssc-fdm-or0042):日付型をタイムスタンプに変換すると異なる動作をします。
テキストリテラル¶
説明¶
このリファレンスの他の部分で、式、条件、SQL 関数、SQL ステートメントの構文に
文字列が登場するときは、テキストリテラル表記を使用して値を指定してください。
[ {N | n} ]
{ '[ c ]...'
| { Q | q } 'quote_delimiter c [ c ]... quote_delimiter'
}
サンプルソースパターン¶
空の文字列 ('')¶
空文字列は、Oracleでは NULL と等価であるため、Snowflakeでの動作をエミュレートするために、リテラルをプロシージャ内で使用するかどうかに応じて、空文字列は NULL または undefined に変換されます。
Oracle¶
SELECT UPPER('') FROM DUAL;
結果¶
UPPER('') |
|---|
Snowflake¶
SELECT UPPER(NULL) FROM DUAL;
結果¶
UPPER(NULL) |
|---|
ストアドプロシージャ内の空文字列¶
Oracle¶
CREATE TABLE empty_string_table(
col1 VARCHAR(10),
col2 VARCHAR(10));
CREATE OR REPLACE PROCEDURE null_proc AS
var1 INTEGER := '';
var3 INTEGER := null;
var2 VARCHAR(20) := 'hello';
BEGIN
var1 := var1 + 456;
var2 := var2 || var1;
IF var1 IS NULL THEN
INSERT INTO empty_string_table VALUES (var1, var2);
END IF;
END;
CALL null_proc();
SELECT * FROM empty_string_table;
結果¶
COL1 |
COL2 |
|---|---|
hello |
Snowflake¶
CREATE OR REPLACE TABLE empty_string_table (
col1 VARCHAR(10),
col2 VARCHAR(10))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}}'
;
CREATE OR REPLACE PROCEDURE null_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}}'
EXECUTE AS CALLER
AS
$$
DECLARE
var1 INTEGER := NULL;
var3 INTEGER := null;
var2 VARCHAR(20) := 'hello';
BEGIN
var1 := :var1 + 456;
var2 := NVL(:var2 :: STRING, '') || NVL(:var1 :: STRING, '');
IF (:var1 IS NULL) THEN
INSERT INTO empty_string_table
VALUES (:var1, :var2);
END IF;
END;
$$;
CALL null_proc();
SELECT * FROM
empty_string_table;
結果¶
COL1 |
COL2 |
|---|---|
hello |
組み込み関数内の空文字列¶
警告
REPLACE および _CONCAT_関数の引数として空文字列が使用されている場合、機能的等価性を保つため、この変換は適用されません。
Oracle¶
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
結果¶
REPLACE('HELLOWORLD','','L') |
CONCAT('A','') |
|---|---|
Hello world |
A |
Snowflake¶
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
結果¶
REPLACE('HELLO WORLD', '', 'L') |
CONCAT('A','') |
|---|---|
Hello world |
A |
注釈
このような場合に空の文字列を NULL に置き換えると、クエリの結果が異なります。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
関連 EWIs はありません。