Oracle SQL 変換ガイド
このドキュメントでは、Oracle と BigQuery の間の SQL 構文の類似点と相違点について詳しく説明します。移行の計画を作成する際に参考にしてください。SQL スクリプトをまとめて移行する場合は、バッチ SQL 変換を使用します。また、クエリをアドホックで変換する場合は、インタラクティブ SQL 変換を使用します。
データ型
以下では、Oracle と BigQuery の間のデータ型の対応について説明します。
Oracle | BigQuery | 注 |
---|---|---|
VARCHAR2
|
STRING
|
|
NVARCHAR2
|
STRING
|
|
CHAR
|
STRING
|
|
NCHAR
|
STRING
|
|
CLOB
|
STRING
|
|
NCLOB
|
STRING
|
|
INTEGER
|
INT64
|
|
SHORTINTEGER
|
INT64
|
|
LONGINTEGER
|
INT64
|
|
NUMBER
|
NUMERIC
|
BigQuery では、ユーザーが精度またはスケールにカスタム値を指定することはできません。結果として、Oracle の列に、BigQuery でサポートされるスケールよりも大きい値が定義されることがあります。
さらに、Oracle では、10 進数を格納する前に、その値の小数点以下の桁数が対応する列に指定されている桁数よりも大きいと、切り上げ処理が行われます。BigQuery では、この機能を |
NUMBER(*, x)
|
NUMERIC
|
BigQuery では、ユーザーが精度またはスケールにカスタム値を指定することはできません。結果として、Oracle の列に、BigQuery でサポートされるスケールよりも大きい値が定義されることがあります。
さらに、Oracle では、10 進数を格納する前に、その値の小数点以下の桁数が対応する列に指定されている桁数よりも大きいと、切り上げ処理が行われます。BigQuery では、この機能を |
NUMBER(x, -y)
|
INT64
|
Oracle では、10 進数を保存しようとすると整数への切り上げが行われます。BigQuery では、INT64 として定義された列に 10 進数を格納しようとすると、エラーが発生します。この場合、ROUND() 関数を適用する必要があります。
BigQuery の |
NUMBER(x)
|
INT64
|
Oracle では、10 進数を保存しようとすると整数への切り上げが行われます。BigQuery では、INT64 として定義された列に 10 進数を格納しようとすると、エラーが発生します。この場合、ROUND() 関数を適用する必要があります。
BigQuery の |
FLOAT
|
FLOAT64 / NUMERIC |
FLOAT は完全一致のデータ型で、Oracle では NUMBER のサブタイプです。BigQuery では、FLOAT64 は近似のデータ型です。BigQuery の FLOAT 型には NUMERIC のほうが適している場合があります。 |
BINARY_DOUBLE
|
FLOAT64 / NUMERIC |
FLOAT は完全一致のデータ型で、Oracle では NUMBER のサブタイプです。BigQuery では、FLOAT64 は近似のデータ型です。BigQuery の FLOAT 型には NUMERIC のほうが適している場合があります。 |
BINARY_FLOAT
|
FLOAT64 / NUMERIC |
FLOAT は完全一致のデータ型で、Oracle では NUMBER のサブタイプです。BigQuery では、FLOAT64 は近似のデータ型です。BigQuery の FLOAT 型には NUMERIC のほうが適している場合があります。 |
LONG
|
BYTES
|
LONG データ型は、以前のバージョンの Oracle Database で使用されていましたが、新しいバージョンでは推奨されていません。
BigQuery で |
BLOB
|
BYTES
|
BYTES データ型には可変長のバイナリデータを格納できます。このフィールドに対するクエリを行わず、分析でも使用しない場合は、Cloud Storage にバイナリデータを保存することをおすすめします。 |
BFILE
|
STRING
|
バイナリ ファイルは Cloud Storage に格納できます。また、STRING データ型は BigQuery テーブルでのファイルの参照に使用できます。 |
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
Oracle では 0~9 の精度がサポートされているのに対し、BigQuery ではマイクロ秒の精度(10-6)がサポートされています。 BigQuery では、TZ データベースからのタイムゾーン リージョン名と UTC からのタイムゾーン オフセットがサポートされています。
BigQuery では、Oracle の |
TIMESTAMP(x)
|
TIMESTAMP
|
Oracle では 0~9 の精度がサポートされているのに対し、BigQuery ではマイクロ秒の精度(10-6)がサポートされています。 BigQuery では、TZ データベースからのタイムゾーン リージョン名と UTC からのタイムゾーン オフセットがサポートされています。
BigQuery では、Oracle の |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
Oracle では 0~9 の精度がサポートされているのに対し、BigQuery ではマイクロ秒の精度(10-6)がサポートされています。 BigQuery では、TZ データベースからのタイムゾーン リージョン名と UTC からのタイムゾーン オフセットがサポートされています。
BigQuery では、Oracle の |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
Oracle では 0~9 の精度がサポートされているのに対し、BigQuery ではマイクロ秒の精度(10-6)がサポートされています。 BigQuery では、TZ データベースからのタイムゾーン リージョン名と UTC からのタイムゾーン オフセットがサポートされています。
BigQuery では、Oracle の |
INTERVAL YEAR TO MONTH
|
STRING
|
BigQuery では、間隔値は STRING データ型として格納できます。 |
INTERVAL DAY TO SECOND
|
STRING
|
BigQuery では、間隔値は STRING データ型として格納できます。 |
RAW
|
BYTES
|
BYTES データ型には可変長のバイナリデータを格納できます。このフィールドに対するクエリを行わず、分析でも使用しない場合は、Cloud Storage にバイナリデータを格納することをおすすめします。 |
LONG RAW
|
BYTES
|
BYTES データ型には可変長のバイナリデータを格納できます。このフィールドに対するクエリを行わず、分析でも使用しない場合は、Cloud Storage にバイナリデータを格納することをおすすめします。 |
ROWID
|
STRING
|
これらのデータ型は、テーブル内の行に一意のアドレスを指定するために Oracle で内部的に使用されます。一般に、ROWID または UROWID フィールドはアプリケーションで使用するべきではありません。ただし、使用する場合は、STRING データ型を使用してこのデータを保持できます。 |
型の形式
Oracle SQL では、式と列データの表示やデータ型の変換時に、パラメータとして設定された一連のデフォルト形式を使用します。たとえば、YYYY/MM/DD
として設定された NLS_DATE_FORMAT
は、デフォルトで日付を YYYY/MM/DD
としてフォーマットします。詳しくは、Oracle のオンライン ドキュメントで NLS 設定に関する説明をご覧ください。BigQuery には初期化パラメータはありません。
BigQuery のデフォルトでは、読み込み時にすべてのソースデータが UTF-8 でエンコードされていることを前提としています。CSV ファイルに ISO-8859-1 形式でエンコードされたデータが含まれている場合は、インポート中に BigQuery がデータを UTF-8 に正しく変換できるよう、インポートの際にエンコードを明示的に指定できます。
ISO-8859-1 または UTF-8 でエンコードされたデータのみをインポートできます。BigQuery では、UTF-8 でエンコードされたデータを格納して返します。必要な日付形式またはタイムゾーンは、DATE
関数と TIMESTAMP
関数で設定できます。
タイムスタンプと日付型の形式
タイムスタンプと日付形式要素を Oracle から BigQuery に変換する場合は、次の表に示すように、TIMESTAMP
と DATETIME
のタイムゾーンの違いに注意する必要があります。
Oracle の形式ではかっこを使用しません。この形式(CURRENT_*
)はキーワードであり、関数ではありません。
Oracle | BigQuery | 注 | |
---|---|---|---|
CURRENT_TIMESTAMP
|
Oracle の TIMESTAMP 情報には、異なるタイムゾーン情報が含まれている場合があります。これらの情報は、列定義で WITH TIME ZONE を使用するか、 TIME_ZONE 変数を設定することで定義されます。 |
可能であれば、ISO 形式の CURRENT_TIMESTAMP() 関数を使用してください。ただし、出力形式は常に UTC タイムゾーンです(内部的には、BigQuery にタイムゾーンがありません)。ISO 形式の次の違いに注意してください。
明示的な形式を使用する場合は、 |
|
CURRENT_DATE
|
Oracle では日付に次の 2 つのタイプを使用します。
SYSDATE or CURRENT_DATE によって返される場合、Oracle は type 13 を使用します。 |
BigQuery には、日付を常に ISO 8601 形式で返す別の DATE 形式があります。
|
|
CURRENT_DATE-3
|
日付値は整数で表現されます。Oracle では日付型の算術演算子がサポートされています。 | 日付型の場合は、DATE_ADD () または DATE_SUB () を使用します。BigQuery では、データ型 INT64 、NUMERIC 、FLOAT64 に算術演算子を使用します。 |
|
NLS_DATE_FORMAT
|
セッションまたはシステムの日付形式を設定します。 | BigQuery では常に ISO 8601 が使用されるため、Oracle の日付と時刻を必ず変換してください。 |
クエリ構文
ここでは、Oracle と BigQuery のクエリ構文の違いについて説明します。
SELECT
ステートメント
Oracle の SELECT
ステートメントの大部分は、BigQuery と互換性があります。
関数、演算子、式
以下のセクションでは、Oracle の関数とそれに対応する BigQuery の機能のマッピングを示します。
比較演算子
Oracle も BigQuery も比較演算子は ANSI SQL:2011 に準拠しています。次の表の比較演算子は BigQuery と Oracle とで同一です。BigQuery では、REGEXP_LIKE
の代わりに REGEXP_CONTAINS
を使用できます。
演算子 | 説明 |
---|---|
"="
|
等しい |
<>
|
等しくない |
!=
|
等しくない |
>
|
次より大きい |
>=
|
以上 |
<
|
次より小さい |
<=
|
以下 |
IN ( )
|
リスト内の値と一致 |
NOT
|
条件を否定 |
BETWEEN
|
範囲内(両端を含む) |
IS NULL
|
NULL 値 |
IS NOT NULL
|
NULL 値でない |
LIKE
|
% を指定したパターン マッチング |
EXISTS
|
サブクエリで 1 行以上返される場合、条件に合致 |
表の比較演算子は BigQuery と Oracle とで同一です。
論理式と論理関数
集計関数
次の表に、Oracle の一般的な集計関数、統計集計関数、近似集計関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
ANY_VALUE (Oracle 19c から) |
ANY_VALUE |
APPROX_COUNT
|
HLL_COUNT set of functions with specified precision
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_AGG
|
APPROX_COUNT_DISTINCT
|
APPROX_COUNT_DISTINCT_DETAIL
|
APPROX_COUNT_DISTINCT
|
APPROX_PERCENTILE(percentile) WITHIN GROUP (ORDER BY expression)
|
APPROX_QUANTILES(expression, 100)[ Oracle で定義されている残りの引数は、BigQuery ではサポートされていません。 |
<codeAPPROX_PERCENTILE_AGG | APPROX_QUANTILES(expression, 100)[
|
APPROX_PERCENTILE_DETAIL
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
|
APPROX_SUM
|
APPROX_TOP_SUM(expression, weight, number)
|
AVG
|
AVG
|
BIT_COMPLEMENT
|
ビット NOT 演算子: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery では TYPE AS TABLE OF はサポートされていません。BigQuery では STRING_AGG() または ARRAY_AGG() の使用を検討してください。 |
CORR/CORR_K/
CORR_S
|
CORR
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
FIRST
|
BigQuery では、暗黙的には存在しません。ユーザー定義関数(UDF)の使用を検討してください。 |
GROUP_ID
|
BigQuery では使用されません。 |
GROUPING
|
BigQuery では使用されません。 |
GROUPING_ID
|
BigQuery では使用されません。 |
LAST
|
BigQuery では、暗黙的には存在しません。UDF の使用を検討してください。 |
LISTAGG
|
STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
|
MAX
|
MAX
|
MIN
|
MIN
|
OLAP_CONDITION
|
Oracle 固有で、BigQuery には存在しません。 |
OLAP_EXPRESSION
|
Oracle 固有で、BigQuery には存在しません。 |
OLAP_EXPRESSION_BOOL
|
Oracle 固有で、BigQuery には存在しません。 |
OLAP_EXPRESSION_DATE
|
Oracle 固有で、BigQuery には存在しません。 |
OLAP_EXPRESSION_TEXT
|
Oracle 固有で、BigQuery には存在しません。 |
OLAP_TABLE
|
Oracle 固有で、BigQuery には存在しません。 |
POWERMULTISET
|
Oracle 固有で、BigQuery には存在しません。 |
POWERMULTISET_BY_CARDINALITY
|
Oracle 固有で、BigQuery には存在しません。 |
QUALIFY
|
Oracle 固有で、BigQuery には存在しません。 |
REGR_AVGX
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, ind_var_expr) )
|
REGR_AVGY
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, dep_var_expr) )
|
REGR_COUNT
|
SUM( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, 1) )
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
WM_CONCAT
|
STRING_AGG
|
BigQuery では、次の集計関数も使用できます。
分析関数
次の表に、Oracle の一般的な分析関数、集計分析関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
ビット NOT 演算子: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
BOOL_TO_INT
|
CAST(X AS INT64)
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUBE_TABLE
|
BigQuery ではサポートされていません。BI ツールまたはカスタムの UDF の使用を検討してください。 |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
BigQuery では、暗黙的には存在しません。UDF と BigQuery ML の使用を検討してください。 |
FEATURE_DETAILS
|
BigQuery では、暗黙的には存在しません。UDF と BigQuery ML の使用を検討してください。 |
FEATURE_ID
|
BigQuery では、暗黙的には存在しません。UDF と BigQuery ML の使用を検討してください。 |
FEATURE_SET
|
BigQuery では、暗黙的には存在しません。UDF と BigQuery ML の使用を検討してください。 |
FEATURE_VALUE
|
BigQuery では、暗黙的には存在しません。UDF と BigQuery ML の使用を検討してください。 |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_CHILD_COUNT
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_COLUMN
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_DEPTH
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_DESCRIPTION
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_HAS_CHILDREN
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_LEVEL
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_MEMBER_NAME
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_ORDER
|
BigQuery では、階層クエリはサポートされていません。 |
HIER_UNIQUE_MEMBER_NAME
|
BigQuery では、階層クエリはサポートされていません。 |
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
LISTAGG
|
ARRAY_AGG
|
MATCH_NUMBER
|
BigQuery では、パターン認識と計算に正規表現と UDF を使用できます。 |
MATCH_RECOGNIZE
|
BigQuery では、パターン認識と計算に正規表現と UDF を使用できます。 |
MAX
|
MAX
|
MEDIAN
|
PERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
|
MIN
|
MIN
|
NTH_VALUE
|
NTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_DISC
|
PRESENTNNV
|
Oracle 固有で、BigQuery には存在しません。 |
PRESENTV
|
Oracle 固有で、BigQuery には存在しません。 |
PREVIOUS
|
Oracle 固有で、BigQuery には存在しません。 |
RANK (ANSI) |
RANK
|
RATIO_TO_REPORT(expr) OVER (partition clause)
|
expr / SUM(expr) OVER (partition clause)
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE()
|
WIDTH_BUCKET
|
UDF を使用できます。 |
日付 / 時間関数
次の表に、Oracle の一般的な日時関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
ADD_MONTHS(date, integer)
|
DATE_ADD(date, INTERVAL integer MONTH), 日付が TIMESTAMP の場合は、次を使用できます。
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
DATE - k
|
DATE_SUB(date_expression, INTERVAL k DAY)
|
DATE + k
|
DATE_ADD(date_expression, INTERVAL k DAY)
|
DBTIMEZONE
|
BigQuery では、データベースのタイムゾーンはサポートされていません。 |
EXTRACT
|
EXTRACT(DATE), EXTRACT(TIMESTAMP)
|
LAST_DAY
|
DATE_SUB(
|
LOCALTIMESTAMP
|
BigQuery では、タイムゾーン設定はサポートされていません。 |
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEW_TIME
|
DATE(timestamp_expression, time zone)
|
NEXT_DAY
|
DATE_ADD(
|
SYS_AT_TIME_ZONE
|
CURRENT_DATE([time_zone])
|
SYSDATE
|
CURRENT_DATE()
|
SYSTIMESTAMP
|
CURRENT_TIMESTAMP()
|
TO_DATE
|
PARSE_DATE
|
TO_TIMESTAMP
|
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ
|
PARSE_TIMESTAMP
|
TZ_OFFSET
|
BigQuery ではサポートされていません。カスタム UDF の使用を検討してください。 |
WM_CONTAINS WM_EQUALS WM_GREATERTHAN WM_INTERSECTION WM_LDIFF WM_LESSTHAN WM_MEETS WM_OVERLAPS WM_RDIFF |
BigQuery では、期間は使用されません。UDF は、2 つの期間の比較に使用できます。 |
BigQuery では、次の日時関数も使用できます。
CURRENT_DATETIME
DATE_FROM_UNIX_DATE
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
FORMAT_DATE
FORMAT_DATETIME
文字列関数
次の表に、Oracle の文字列関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
BigQuery では、UTF-16 はサポートされていません。 |
RAWTOHEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING(
|
COLLATION
|
BigQuery にはありません。BigQuery では、DML の COLLATE はサポートされていません。 |
COMPOSE
|
カスタムのユーザー定義関数。 |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
カスタムのユーザー定義関数。 |
ESCAPE_REFERENCE (UTL_I18N)
|
BigQuery ではサポートされていません。ユーザー定義関数の使用を検討してください。 |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
カスタムのユーザー定義関数。 |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
カスタムのユーザー定義関数。 |
NLS_LOWER
|
LOWER
|
NLS_UPPER
|
UPPER
|
NLSSORT
|
Oracle 固有で、BigQuery には存在しません。 |
POSITION
|
STRPOS(string, substring)
|
PRINTBLOBTOCLOB
|
Oracle 固有で、BigQuery には存在しません。 |
REGEXP_COUNT
|
ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
|
REGEXP_INSTR
|
STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))
注: 最初の一致が返されます。 |
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REGEXP_LIKE
|
IF(REGEXP_CONTAINS,1,0)
|
REGEXP_SUBSTR
|
REGEXP_EXTRACT, REGEXP_EXTRACT_ALL
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RIGHT
|
SUBSTR(source_string, -1, length)
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
BigQuery ではサポートされていません。カスタムの UDF の使用を検討してください。 |
STRTOK
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4
|
SUBSTR
|
TRANSLATE
|
REPLACE
|
TRANSLATE USING
|
REPLACE
|
TRIM
|
TRIM
|
UNISTR
|
CODE_POINTS_TO_STRING
|
UPPER
|
UPPER
|
|| (縦棒) |
CONCAT
|
BigQuery では、次の文字列関数を使用できます。
BYTE_LENGTH
CODE_POINTS_TO_BYTES
ENDS_WITH
FROM_BASE32
FROM_BASE64
FROM_HEX
NORMALIZE
NORMALIZE_AND_CASEFOLD
REPEAT
SAFE_CONVERT_BYTES_TO_STRING
SPLIT
STARTS_WITH
STRPOS
TO_BASE32
TO_BASE64
TO_CODE_POINTS
数学関数
次の表に、Oracle の数学関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ACOSH
|
ACOSH
|
ASIN
|
ASIN
|
ASINH
|
ASINH
|
ATAN
|
ATAN
|
ATAN2
|
ATAN2
|
ATANH
|
ATANH
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
COSH
|
COSH
|
EXP
|
EXP
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
ISNULL と一緒に使用 |
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
BigQuery ではサポートされていません。カスタムの UDF と RAND 関数の使用を検討してください。 |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
BigQuery ではサポートされていません。カスタムの UDF と RAND 関数の使用を検討してください。 |
REMAINDER
|
MOD
|
ROUND
|
ROUND
|
ROUND_TIES_TO_EVEN
|
ROUND()
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SINH
|
SINH
|
SQRT
|
SQRT
|
STANDARD_HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV
|
標準偏差 |
TAN
|
TAN
|
TANH
|
TANH
|
TRUNC
|
TRUNC
|
NVL
|
IFNULL(expr, 0), COALESCE(exp, 0)
|
BigQuery では、次の数学関数も使用できます。
型変換関数
次の表に、Oracle の型変換関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery | |
---|---|---|
BIN_TO_NUM
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
BINARY2VARCHAR
|
SAFE_CONVERT_BYTES_TO_STRING(value)
|
|
CAST
|
CAST(expr AS typename)
|
|
CHARTOROWID
|
Oracle 固有です。BigQuery では不要です。 | |
CONVERT
|
BigQuery では、文字セットはサポートされていません。カスタムのユーザー定義関数の使用を検討してください。 | |
EMPTY_BLOB
|
BigQuery では、BLOB は使用されません。 |
|
EMPTY_CLOB
|
BigQuery では、CLOB は使用されません。 |
|
FROM_TZ
|
BigQuery では、タイムゾーンを使用する型はサポートされていません。ユーザー定義関数と FORMAT_TIMESTAMP の使用を検討してください。 | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
BigQuery では、暗黙的には存在しません。UDF の使用を検討してください。 | |
NCHR
|
UDF を使用して、バイナリに相当する文字を取得できます。 | |
NUMTODSINTERVAL
|
BigQuery では、INTERVAL データ型はサポートされていません。 |
|
NUMTOHEX
|
BigQuery ではサポートされていません。カスタム UDF と TO_HEX 関数の使用を検討してください。 |
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
BigQuery では、INTERVAL データ型はサポートされていません。 |
|
RAW_TO_CHAR
|
Oracle 固有で、BigQuery には存在しません。 | |
RAW_TO_NCHAR
|
Oracle 固有で、BigQuery には存在しません。 | |
RAW_TO_VARCHAR2
|
Oracle 固有で、BigQuery には存在しません。 | |
RAWTOHEX
|
Oracle 固有で、BigQuery には存在しません。 | |
RAWTONHEX
|
Oracle 固有で、BigQuery には存在しません。 | |
RAWTONUM
|
Oracle 固有で、BigQuery には存在しません。 | |
RAWTONUM2
|
Oracle 固有で、BigQuery には存在しません。 | |
RAWTOREF
|
Oracle 固有で、BigQuery には存在しません。 | |
REFTOHEX
|
Oracle 固有で、BigQuery には存在しません。 | |
REFTORAW
|
Oracle 固有で、BigQuery には存在しません。 | |
ROWIDTOCHAR
|
ROWID は Oracle 固有の型です。BigQuery に存在しません。この値は文字列として表す必要があります。 |
|
ROWIDTONCHAR
|
ROWID は Oracle 固有の型です。BigQuery に存在しません。この値は文字列として表す必要があります。 |
|
SCN_TO_TIMESTAMP
|
SCN は Oracle 固有の型です。BigQuery に存在しません。この値はタイムスタンプとして表す必要があります。 |
|
TO_ACLID TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename) PARSE_DATE PARSE_TIMESTAMP キャスト構文は、式の結果の型を他の型に変換する必要があることを示す目的でクエリで使用されます。 |
|
TREAT
|
Oracle 固有で、BigQuery には存在しません。 | |
VALIDATE_CONVERSION
|
BigQuery ではサポートされていません。カスタムの UDF の使用を検討してください。 | |
VSIZE
|
BigQuery ではサポートされていません。カスタムの UDF の使用を検討してください。 |
JSON 関数
次の表に、Oracle の JSON 関数とそれに対応する BigQuery の機能のマッピングを示します。
Oracle | BigQuery |
---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
UDF と TO_JSON_STRING 関数の使用を検討してください。 |
JSON_ARRAYAGG
|
UDF と TO_JSON_STRING 関数の使用を検討してください。 |
JSON_DATAGUIDE
|
カスタムのユーザー定義関数。 |
JSON_EQUAL
|
カスタムのユーザー定義関数。 |
JSON_EXIST
|
UDF と、JSON_EXTRACT または JSON_EXTRACT_SCALAR の使用を検討してください。 |
JSON_MERGEPATCH
|
カスタムのユーザー定義関数。 |
JSON_OBJECT
|
BigQuery ではサポートされていません。 |
JSON_OBJECTAGG
|
BigQuery ではサポートされていません。 |
JSON_QUERY
|
UDF と、JSON_EXTRACT または JSON_EXTRACT_SCALAR の使用を検討してください。 |
JSON_TABLE
|
カスタムのユーザー定義関数。 |
JSON_TEXTCONTAINS
|
UDF と、JSON_EXTRACT または JSON_EXTRACT_SCALAR の使用を検討してください。 |
JSON_VALUE
|
JSON_EXTRACT_SCALAR
|
XML 関数
BigQuery では、暗黙的な XML 関数は提供されていません。XML は、文字列として BigQuery に読み込んだ後、UDF を使用して解析できます。また、Dataflow などの ETL / ELT ツールを使用して XML を処理することもできます。次のリストに、Oracle の XML 関数を示します。
Oracle | BigQuery |
---|---|
DELETEXML
|
UDF または DataFlow などの ETL ツールを使用して XML を処理できます。 |
ENCODE_SQL_XML | |
EXISTSNODE | |
EXTRACTCLOBXML | |
EXTRACTVALUE | |
INSERTCHILDXML | |
INSERTCHILDXMLAFTER | |
INSERTCHILDXMLBEFORE | |
INSERTXMLAFTER | |
INSERTXMLBEFORE | |
SYS_XMLAGG | |
SYS_XMLANALYZE | |
SYS_XMLCONTAINS | |
SYS_XMLCONV | |
SYS_XMLEXNSURI | |
SYS_XMLGEN | |
SYS_XMLI_LOC_ISNODE | |
SYS_XMLI_LOC_ISTEXT | |
SYS_XMLINSTR | |
SYS_XMLLOCATOR_GETSVAL | |
SYS_XMLNODEID | |
SYS_XMLNODEID_GETLOCATOR | |
SYS_XMLNODEID_GETOKEY | |
SYS_XMLNODEID_GETPATHID | |
SYS_XMLNODEID_GETPTRID | |
SYS_XMLNODEID_GETRID | |
SYS_XMLNODEID_GETSVAL | |
SYS_XMLT_2_SC | |
SYS_XMLTRANSLATE | |
SYS_XMLTYPE2SQL | |
UPDATEXML | |
XML2OBJECT | |
XMLCAST | |
XMLCDATA | |
XMLCOLLATVAL | |
XMLCOMMENT | |
XMLCONCAT | |
XMLDIFF | |
XMLELEMENT | |
XMLEXISTS | |
XMLEXISTS2 | |
XMLFOREST | |
XMLISNODE | |
XMLISVALID | |
XMLPARSE | |
XMLPATCH | |
XMLPI | |
XMLQUERY | |
XMLQUERYVAL | |
XMLSERIALIZE | |
XMLTABLE | |
XMLTOJSON | |
XMLTRANSFORM | |
XMLTRANSFORMBLOB | |
XMLTYPE |
ML 関数
Oracle と BigQuery では機械学習(ML)関数が異なります。Oracle でデータベースに対して ML を実行するには、Advanced Analytics パックとライセンスが必要です。Oracle では ML に DBMS_DATA_MINING
パッケージを使用します。Oracle データ マイニング ジョブの変換にはコードの書き換えが必要です。BigQuery ML、AI API(Speech-to-Text、Text-to-Speech、Dialogflow、Cloud Translation、NLP、Cloud Vision、Timeseries Insights API を含む)、AutoML、AutoML Tables、AI Platform などの包括的な Google AI プロダクトから選択できます。データ サイエンティスト向けの開発環境として、Google のユーザー管理ノートブックを使用できます。また、Google の AI Platform Training を使用して、トレーニングと大規模なワークロードのスコア付けを行うことができます。次の表に、Oracle の ML 関数を示します。
Oracle | BigQuery |
---|---|
CLASSIFIER
|
ML の分類機能と回帰オプションについては、BigQuery ML をご覧ください。 |
CLUSTER_DETAILS
|
|
CLUSTER_DISTANCE
|
|
CLUSTER_ID
|
|
CLUSTER_PROBABILITY
|
|
CLUSTER_SET
|
|
PREDICTION
|
|
PREDICTION_BOUNDS
|
|
PREDICTION_COST
|
|
PREDICTION_DETAILS
|
|
PREDICTION_PROBABILITY
|
|
PREDICTION_SET
|
セキュリティ関数
次の表に、ユーザーを識別するための Oracle の関数と BigQuery の関数を示します。
Oracle | BigQuery |
---|---|
UID
|
SESSION_USER
|
USER/SESSION_USER/CURRENT_USER
|
SESSION_USER()
|
SET 関数または配列関数
次の表に、Oracle の SET 関数または配列関数とそれに対応する BigQuery の機能を示します。
Oracle | BigQuery |
---|---|
MULTISET
|
ARRAY_AGG
|
MULTISET EXCEPT
|
ARRAY_AGG([DISTINCT] expression)
|
MULTISET INTERSECT
|
ARRAY_AGG([DISTINCT])
|
MULTISET UNION
|
ARRAY_AGG
|
ウィンドウ関数
次の表に、Oracle のウィンドウ関数とそれに対応する BigQuery の機能を示します。
Oracle | BigQuery |
---|---|
LAG
|
LAG (value_expression[, offset [, default_expression]])
|
LEAD
|
LEAD (value_expression[, offset [, default_expression]])
|
階層クエリまたは再帰クエリ
BigQuery では、階層クエリや再帰クエリは使用されません。階層の深さがわかっている場合は、次の例のように、結合を使用して同様の機能を実現できます。また、BigQueryStorage API と Spark を使用する方法もあります。
select
array(
select e.update.element
union all
select c1 from e.update.element.child as c1
union all
select c2 from e.update.element.child as c1, c1.child as c2
union all
select c3 from e.update.element.child as c1, c1.child as c2, c2.child as c3
union all
select c4 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4
union all
select c5 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4, c4.child as c5
) as flattened,
e as event
from t, t.events as e
次の表に、Oracle の階層関数を示します。
Oracle | BigQuery |
---|---|
DEPTH
|
BigQuery では、階層クエリは使用されません。 |
PATH
|
|
SYS_CONNECT_BY_PATH (hierarchical)
|
UTL 関数
UTL_File
パッケージは、主に PL/SQL との間でオペレーティング システム ファイルの読み取りと書き込みを行うために使用されます。Cloud Storage は、どのような種類の未加工ファイルのステージングにも使用できます。Cloud Storage との間でファイルを読み書きするには、外部テーブルと BigQuery の読み込みおよびエクスポートを使用する必要があります。詳細については、外部データソースの概要をご覧ください。
空間関数
空間関数の代わりに BigQuery の地理空間分析を使用できます。Oracle には SDO_*
関数と SDO_GEOM_KEY
、SDO_GEOM_MBR
、SDO_GEOM_MMB
などの型があります。これらの関数は、空間分析に使用されます。空間分析を行うには、地理空間分析を使用します。
DML 構文
このセクションでは、Oracle と BigQuery のデータ マネジメント言語の構文の違いについて説明します。
INSERT
ステートメント
Oracle の INSERT
ステートメントの大部分は、BigQuery と互換性があります。次の表に例外を示します。
BigQuery の DML スクリプトは、それに対応する Oracle のステートメントとは整合性セマンティクスが少し異なります。スナップショット分離とセッションとトランザクションの処理の概要については、このドキュメントの CREATE [UNIQUE] INDEX
section
をご覧ください。
Oracle | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle では、null 値が許可されない列に
注: BigQuery では、ターゲット テーブル内のすべての列の値が元の順序位置に基づいて昇順で挿入されている場合にのみ、 |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
BigQuery では、1 日に実行できる DML ステートメント数を制限する DML 割り当てが適用されます。割り当てを最大限に利用するには、次の方法を検討してください。
|
UPDATE
ステートメント
Oracle の UPDATE
ステートメントの大部分は BigQuery と互換性がありますが、BigQuery では UPDATE
ステートメントに WHERE
句を指定する必要があります。
ベスト プラクティスとして、単一の UPDATE
ステートメントと INSERT
ステートメントを繰り返し使用するのではなく、バッチ DML ステートメントを使用することをおすすめします。BigQuery の DML スクリプトは、それに対応する Oracle のステートメントとは整合性セマンティクスが少し異なります。スナップショット分離とセッションとトランザクションの処理の概要については、このドキュメントの CREATE INDEX
セクションをご覧ください。
次の表に、同じタスクを実行する Oracle の UPDATE
ステートメントと BigQuery のステートメントを示します。
BigQuery では、UPDATE
ステートメントに WHERE
句が必要になります。BigQuery の UPDATE
の詳細については、DML ドキュメントの BigQuery UPDATE の例をご覧ください。
DELETE
および TRUNCATE
ステートメント
DELETE
ステートメントと TRUNCATE
ステートメントは、どちらもテーブル スキーマに影響を与えることなくテーブルから行を削除する方法です。BigQuery では、TRUNCATE
は使用されません。ただし、DELETE
ステートメントを使用しても結果は同じです。
BigQuery では、DELETE
ステートメントには WHERE
句が必要です。BigQuery の DELETE
の詳細については、DML ドキュメントの BigQuery DELETE
の例をご覧ください。
Oracle | BigQuery |
---|---|
DELETE database.table;
|
DELETE FROM table WHERE TRUE;
|
MERGE
ステートメント
MERGE
ステートメントは、演算子 INSERT
、UPDATE
、DELETE
を組み合わせて 1 つの UPSERT
ステートメントにし、複数のオペレーションを自動的に実行できます。MERGE
操作では、ターゲット行ごとに 1 つのソース行を対応させる必要があります。BigQuery も Oracle も ANSI 構文に準拠します。
ただし、BigQuery の DML スクリプトは、それに対応する Oracle のステートメントとは整合性セマンティクスが少し異なります。
DDL 構文
ここでは、Oracle と BigQuery のデータ定義言語の構文の違いについて説明します。
CREATE TABLE
ステートメント
Oracle の CREATE TABLE
ステートメントの大部分は BigQuery と互換性があります。例外として以下の制約と構文要素がありますが、これらは BigQuery では使用されません。
STORAGE
TABLESPACE
DEFAULT
GENERATED ALWAYS AS
ENCRYPT
PRIMARY KEY (col, ...)
。詳細については、CREATE INDEX
をご覧ください。UNIQUE INDEX
。詳細については、CREATE INDEX
をご覧ください。CONSTRAINT..REFERENCES
DEFAULT
PARALLEL
COMPRESS
BigQuery の CREATE TABLE
の詳細については、BigQuery の CREATE TABLE
の例をご覧ください。
列のオプションと属性
Oracle 12c バージョンで、列の自動インクリメントを有効にする Identity 列が導入されました。これは BigQuery では使用されませんが、この機能は次のバッチ方法で実現できます。サロゲートキーと変化が緩やかなディメンション(SCD)について詳しくは、次のガイドをご覧ください。
Oracle | BigQuery |
---|---|
CREATE TABLE table (
|
INSERT INTO dataset.table SELECT
|
列に関するコメント
Oracle では、Comment
構文を使用して列にコメントを追加します。BigQuery では、次の表のように、列の説明を使用することで、同様の機能を実装できます。
Oracle | BigQuery |
---|---|
Comment on column table is 'column desc';
|
CREATE TABLE dataset.table (
|
一時テーブル
Oracle では、一時テーブルがサポートされています。これは、スクリプトに中間結果を格納するためによく使用されます。一時テーブルは BigQuery でもサポートされています。
Oracle | BigQuery |
---|---|
CREATE GLOBAL TEMPORARY TABLE
|
CREATE TEMP TABLE temp_tab
|
次の Oracle 要素は BigQuery では使用されません。
ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;
さらに、BigQuery で一時テーブルをエミュレートする方法が他にもあります。
- データセット TTL: 短い有効期間(たとえば 1 時間)のデータセットを作成します。このデータセット内に作成されたすべてのテーブルは、データセットの有効期間を超えて持続することがないため、事実上一時的なものになります。このデータセット内のすべてのテーブルは、名前の先頭に
temp
を付けることで、一時的なものであることを明示できます。 テーブル TTL: 次のような DDL ステートメントを使用して、テーブル固有の短い有効期間が設定されたテーブルを作成します。
CREATE TABLE temp.name (col1, col2, ...)
OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));WITH
句: 一時テーブルが同じブロック内でのみ必要な場合は、WITH
ステートメントまたはサブクエリを使用した一時的な結果を使用します。
CREATE SEQUENCE
ステートメント
BigQuery ではシーケンスは使用されません。この機能は次のバッチ手法で実現できます。サロゲートキーと変化が緩やかなディメンション(SCD)について詳しくは、次のガイドをご覧ください。
INSERT INTO dataset.table
SELECT *,
ROW_NUMBER() OVER () AS id
FROM dataset.table
CREATE VIEW
ステートメント
次の表は、Oracle と BigQuery で CREATE VIEW
ステートメントに相当するステートメントを示しています。
Oracle | BigQuery | 注 |
---|---|---|
CREATE VIEW view_name AS SELECT ...
|
CREATE VIEW view_name AS SELECT ...
|
|
CREATE OR REPLACE VIEW view_name AS SELECT ...
|
CREATE OR REPLACE VIEW
view_name AS
SELECT ...
|
|
サポート対象外。 | CREATE VIEW IF NOT EXISTS
view_name
OPTIONS(view_option_list)
AS SELECT ...
|
指定されたデータセットに現在ビューが存在しない場合にのみ、新しいビューを作成します。 |
CREATE MATERIALIZED VIEW
ステートメント
BigQuery では、マテリアライズド ビューの更新オペレーションが自動的に実行されます。BigQuery で、commit 時やスケジュール時などの更新オプションを指定する必要はありません。詳細については、マテリアライズド ビューの概要をご覧ください。
ベーステーブルが追記のみによって変更され続ける場合、マテリアライズド ビューを使用するクエリは、ビューが明示的に参照されているかクエリ オプティマイザによって選択されたかに関係なく、すべてのマテリアライズド ビューと、前回のビュー更新以降のベーステーブルの差分をスキャンします。つまり、クエリをより高速かつ低コストで実行できます。
一方、前回のビュー更新以降にベーステーブル内で更新(DML UPDATE、MERGE)または削除(DML DELETE、切り捨て、パーティションの有効期限切れ)があった場合、マテリアライズド ビューはスキャンされず、クエリは保存された内容を次のビューの更新まで取得しません。基本的に、ベーステーブル内の更新または削除はマテリアライズド ビューの状態を無効にします。
また、ベーステーブルのストリーミング バッファからのデータはマテリアライズド ビューに保存されません。マテリアライズド ビューが使用されているかどうかにかかわらず、ストリーミング バッファは引き続き完全にスキャンされます。
次の表は、Oracle と BigQuery で CREATE MATERIALIZED VIEW
ステートメントに相当するステートメントを示しています。
Oracle | BigQuery | 注 |
---|---|---|
CREATE MATERIALIZED VIEW view_name
|
CREATE MATERIALIZED VIEW
|
CREATE [UNIQUE] INDEX
ステートメント
ここでは、BigQuery で Oracle のインデックスと同様の機能を作成するための方法を示します。
パフォーマンス向上のためのインデックス作成
BigQuery は明示的なインデックスを必要としません。クエリとストレージの最適化を備えた列指向のデータベースだからです。BigQuery では、パーティショニングとクラスタリング、さらにネストされたフィールドなどの機能を使用できます。これらを使用してデータの格納方法を最適化することで、クエリの効率とパフォーマンスが向上します。
整合性向上のためのインデックス作成(UNIQUE、PRIMARY INDEX)
Oracle では、一意のインデックスを使用して、一意でないキーを持つ行がテーブル内に存在しないようにします。インデックス内にすでに存在する値を持つデータを挿入または更新しようとすると、オペレーションはインデックス違反で失敗します。
BigQuery は明示的なインデックスを提供しないため、代わりに MERGE
ステートメントを使用して、ステージング テーブルからターゲット テーブルに一意のレコードのみを挿入すると同時に、重複レコードを破棄できます。ただし、編集権限を持つユーザーが重複レコードを挿入しないようにする方法はありません。
BigQuery で重複レコードのエラーを生成するには、次の例に示すように、ステージング テーブルから MERGE
ステートメントを使用します。
Oracle | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
ダウンストリーム システムのエラーを見つけるために、ユーザーが個別に重複を排除することを選ぶ場合がよくあります。
BigQuery では、DEFAULT
列と IDENTITY
(シーケンス)列がサポートされていません。
ロック
BigQuery には、Oracle のようなロック メカニズムはありません。割り当てに達するまで同時実行クエリを行うことができます。ただし、DML ステートメントには同時実行の上限があります。場合によっては、実行中のテーブルロックが必要になります。
プロシージャル SQL ステートメント
ここでは、ストアド プロシージャ、関数、トリガーで使用される手続き型 SQL ステートメントを Oracle から BigQuery に変換する方法について説明します。
CREATE PROCEDURE
ステートメント
ストアド プロシージャは、BigQuery スクリプトのベータ版の一部としてサポートされています。
Oracle | BigQuery | 注 |
---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
Oracle と同様に、BigQuery は IN, OUT, INOUT 引数モードをサポートしています。その他の構文仕様は BigQuery ではサポートされていません。 |
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
以下のセクションでは、Oracle の既存の手続き型ステートメントを、同様の機能を持つ BigQuery のスクリプト ステートメントに変換する方法について説明します。
CREATE TRIGGER
ステートメント
BigQuery では、トリガーは使用されません。行ベースのアプリケーション ロジックは、アプリケーション レイヤで処理する必要があります。トリガー機能を実現するには、取り込み中に取り込みツール、Pub/Sub、Cloud Run functions を使用したり、定期的なスキャンを使用します。
変数宣言と割り当て
次の表に、Oracle の DECLARE
ステートメントとそれに対応する BigQuery のステートメントを示します。
Oracle | BigQuery |
---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
カーソル宣言と演算子
BigQuery ではカーソルがサポートされないため、次のステートメントは BigQuery で使用されません。
DECLARE cursor_name CURSOR [FOR | WITH] ...
OPEN CUR_VAR FOR sql_str;
OPEN cursor_name [USING var, ...];
FETCH cursor_name INTO var, ...;
CLOSE cursor_name;
動的 SQL ステートメント
次の Oracle 動的 SQL ステートメントについては、BigQuery に同等の機能があります。
Oracle | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str
|
EXECUTE IMMEDIATE
|
フロー制御ステートメント
次の表に、Oracle のフロー制御ステートメントとそれに対応する BigQuery の機能を示します。
Oracle | BigQuery |
---|---|
IF condition THEN
|
IF condition THEN
|
SET SERVEROUTPUT ON;
|
DECLARE x INT64 DEFAULT 0;
|
LOOP
|
LOOP
|
WHILE boolean_expression DO
|
WHILE boolean_expression DO
|
FOR LOOP
|
BigQuery では、FOR LOOP は使用されません。他の LOOP ステートメントを使用します。 |
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
IF 条件とともに CONTINUE を使用します。 |
GOTO
|
BigQuery には、GOTO ステートメントは存在しません。IF 条件を使用します。 |
メタデータおよびトランザクション SQL ステートメント
Oracle | BigQuery |
---|---|
GATHER_STATS_JOB
|
今のところ BigQuery では使用されていません。 |
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT;
|
今のところ BigQuery では使用されていません。 |
Alter session set isolation_level=serializable; /
|
BigQuery では、常にスナップショット分離が使用されます。詳しくは、このドキュメントの整合性の保証とトランザクション分離をご覧ください。 |
EXPLAIN PLAN ...
|
BigQuery では使用されません。 類似の機能としては、BigQuery のウェブ UI でのクエリプランの説明、スロット割り当て、Stackdriver における監査ロギングがあります |
SELECT * FROM DBA_[*];
(Oracle DBA_/ALL_/V$ ビュー)。 |
SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;
詳しくは、BigQuery INFORMATION_SCHEMA の概要をご覧ください。 |
SELECT * FROM GV$SESSION;
|
BigQuery には、従来型のセッションのコンセプトはありません。UI でクエリジョブを表示するか、Stackdriver 監査ログを BigQuery にエクスポートして、BigQuery ログを分析することで、ジョブの分析を行うことができます。詳細については、ジョブの詳細を表示するをご覧ください。 |
START TRANSACTION;
|
テーブルのコンテンツをクエリ出力で置き換える処理は、トランザクションに相当します。これは、クエリまたはコピー オペレーションで実行できます。 クエリを使用する場合:
コピーを使用する場合:
|
マルチステートメントおよび複数行 SQL ステートメント
Oracle と BigQuery はどちらも、トランザクション(セッション)をサポートしているため、セミコロンで区切られ、一貫して実行される複数のステートメントをサポートしています。詳細については、マルチステートメント トランザクションをご覧ください。
エラーコードとメッセージ
Oracle のエラーコードと BigQuery のエラーコードは異なります。アプリケーション ロジックで現在エラーが検出されている場合は、エラーの原因を取り除いてください。BigQuery は同じエラーコードを返しません。
整合性の保証とトランザクション分離
Oracle と BigQuery はどちらもアトミックです。つまり、多数の行にわたってミューテーション単位で ACID に準拠しています。たとえば MERGE
オペレーションは、複数の値を挿入、更新していても、アトミックです。
トランザクション
Oracle では、commit された読み取りまたはシリアル化可能なトランザクション分離レベルが用意されています。デッドロックが発生する可能性があります。Oracle の挿入追記ジョブは個別に実行されます。
また、BigQuery はトランザクションをサポートしています。BigQuery では、スナップショット分離を使用して、楽観的同時実行制御(最初の commit が優先)が確実に実行されるようにします。この場合、クエリは、クエリが開始される前に最後に commit されたデータを読み取ります。この方法により、行ごと、ミューテーションごと、同じ DML ステートメント内の行全体で、同じレベルの整合性が保証され、デッドロックも回避されます。同じテーブルに対する複数の UPDATE
ステートメントの場合、BigQuery は悲観的同時実行制御に切り替え、複数の UPDATE
ステートメントをキューに入れて、競合が発生した場合に自動的に再試行します。INSERT
DML ステートメントと読み込みジョブは、同時かつ独立して実行され、テーブルへの連結を実行できます。
ロールバック
Oracle ではロールバックがサポートされています。BigQuery には明示的なトランザクション境界がないため、BigQuery には明示的なロールバックのコンセプトはありません。この問題を回避するには、テーブル デコレータを使用するか、FOR SYSTEM_TIME AS OF
を使用します。
データベースに関する制限
BigQuery の最新の割り当てと上限を確認します。大量のユーザーに対する割り当ての多くは、Cloud カスタマーケアに連絡して増やすことができます。次の表に、Oracle と BigQuery のデータベースに関する上限の比較を示します。
上限 | Oracle | BigQuery |
---|---|---|
データベースあたりのテーブル数 | 制限なし | 制限なし |
テーブルあたりの列数 | 1,000 | 10,000 |
行の最大サイズ | 無制限(列の型によります) | 100 MB |
列とテーブルの名前の長さ | バージョン 12.2 以降は 128 バイト それ以外は 30 バイト |
Unicode 形式の 16,384 個の文字。 |
テーブルあたりの行数 | 無制限 | 無制限 |
SQL リクエストの最大長 | 無制限 | 1 MB(未解決の GoogleSQL クエリの最大長) 12 MB(解決済みの以前のクエリと GoogleSQL クエリの最大長) ストリーミング:
|
リクエストおよびレスポンスの最大サイズ | 無制限 | 10 MB(リクエスト)と 10 GB(レスポンス)。ページ分割または Cloud Storage API を使用する場合は事実上無制限になります。 |
同時実行セッションの最大数 | セッションまたはプロセスのパラメータによって制限されます | 100 同時実行クエリ(スロット予約で増やすことができます)、1 ユーザーあたり 300 同時実行 API リクエスト。 |
同時実行(高速)読み込みの最大数。 | セッションまたはプロセスのパラメータによって制限されます | 同時実行の制限はありません。ジョブはキューに格納されます。プロジェクトごとに 1 日あたり 100,000 読み込みジョブ。 |
他の Oracle データベースの上限には、データタイプの上限、物理データベースの上限、論理データベースの上限、プロセスとランタイムの上限などがあります。