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 會先將小數點後的數字四捨五入,再儲存該數字。在 BigQuery 中,這項功能可透過 |
NUMBER(*, x)
|
NUMERIC
|
BigQuery 不允許使用者指定精確度或小數位數的自訂值。因此,Oracle 中的資料欄定義可能超出 BigQuery 支援的範圍。
此外,如果小數點後的位數超過對應資料欄指定的位數,Oracle 會先將小數點後的數字四捨五入,再儲存該數字。在 BigQuery 中,這項功能可透過 |
NUMBER(x, -y)
|
INT64
|
如果使用者嘗試儲存小數,Oracle 會將其四捨五入為整數。在 BigQuery 中,如果嘗試將十進位數字儲存在定義為 INT64 的資料欄,會發生錯誤。在這種情況下,應套用 ROUND() 函式。
BigQuery |
NUMBER(x)
|
INT64
|
如果使用者嘗試儲存小數,Oracle 會將其四捨五入為整數。在 BigQuery 中,如果嘗試將十進位數字儲存在定義為 INT64 的資料欄,會發生錯誤。在這種情況下,應套用 ROUND() 函式。
BigQuery |
FLOAT
|
FLOAT64/NUMERIC
|
FLOAT 是精確的資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。 |
BINARY_DOUBLE
|
FLOAT64/NUMERIC
|
FLOAT 是精確的資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。 |
BINARY_FLOAT
|
FLOAT64/NUMERIC
|
FLOAT 是精確的資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。 |
LONG
|
BYTES
|
LONG 資料類型用於舊版,不建議用於新版 Oracle Database。
如果需要在 BigQuery 中保留 |
BLOB
|
BYTES
|
BYTES 資料類型可用於儲存可變長度的二進位資料。如果這個欄位不會用於查詢和分析,建議將二進位檔資料儲存在 Cloud Storage。 |
BFILE
|
STRING
|
二進位檔案可以儲存在 Cloud Storage 中,STRING 資料類型則可用於參照 BigQuery 資料表中的檔案。 |
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
BigQuery 支援微秒精確度 (10-6),而 Oracle 支援的精確度範圍為 0 到 9。 BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與世界標準時間 (UTC) 的時差。
在 BigQuery 中,應手動執行時區轉換,以符合 Oracle 的 |
TIMESTAMP(x)
|
TIMESTAMP
|
BigQuery 支援微秒精確度 (10-6),而 Oracle 支援的精確度範圍為 0 到 9。 BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與世界標準時間 (UTC) 的時差。
在 BigQuery 中,應手動執行時區轉換,以符合 Oracle 的 |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
BigQuery 支援微秒精確度 (10-6),而 Oracle 支援的精確度範圍為 0 到 9。 BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與世界標準時間 (UTC) 的時差。
在 BigQuery 中,應手動執行時區轉換,以符合 Oracle 的 |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
BigQuery 支援微秒精確度 (10-6),而 Oracle 支援的精確度範圍為 0 到 9。 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 會使用一組預設格式做為參數,用於顯示運算式和資料欄資料,以及在資料類型之間進行轉換。例如,NLS_DATE_FORMAT 設為 YYYY/MM/DD 時,預設會將日期格式設為 YYYY/MM/DD。如要進一步瞭解 NLS 設定,請參閱 Oracle 線上說明文件。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 變數定義。 |
建議您使用 CURRENT_TIMESTAMP() 函式,其格式為 ISO 格式。不過,輸出格式一律會顯示世界標準時間時區。(在內部,BigQuery 沒有時區)。請注意下列 ISO 格式差異:
如要使用明確格式,請使用 |
|
CURRENT_DATE
|
Oracle 使用 2 種日期類型:
SYSDATE or CURRENT_DATE 傳回日期時,Oracle 會使用類型 13 |
BigQuery 具有獨立的 DATE 格式,一律會以 ISO 8601 格式傳回日期。
|
|
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_CONTAINS,而非 REGEXP_LIKE。
| Operator | 說明 |
|---|---|
"="
|
等於 |
<>
|
不等於 |
!=
|
不等於 |
>
|
大於 |
>=
|
大於或等於 |
<
|
小於 |
<=
|
小於或等於 |
IN ( )
|
比對清單中的值 |
NOT
|
否定條件 |
BETWEEN
|
在範圍內 (含) |
IS NULL
|
NULL 值
|
IS NOT NULL
|
Not NULL value
|
LIKE
|
使用 %進行模式比對 |
EXISTS
|
如果子查詢傳回至少一列,則符合條件 |
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)[BigQuery 不支援 Oracle 定義的其他引數。 |
APPROX_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 中沒有隱含。建議使用 user-defined function (UDF)。 |
GROUP_ID
|
不適用於 BigQuery |
GROUPING
|
GROUPING
|
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 NULLOR ind_var_expr is NULL,NULL, ind_var_expr))
|
REGR_AVGY
|
AVG(IF(dep_var_expr is NULLOR ind_var_expr is NULL,NULL, dep_var_expr))
|
REGR_COUNT
|
SUM(IF(dep_var_expr is NULLOR 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 不支援。建議使用商業智慧工具或自訂 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_CONTAINSWM_EQUALSWM_GREATERTHANWM_INTERSECTIONWM_LDIFFWM_LESSTHANWM_MEETSWM_OVERLAPSWM_RDIFF |
BigQuery 不會使用句號。UDF 可用於比較兩個時間範圍。 |
BigQuery 提供下列其他日期/時間函式:
CURRENT_DATETIMEDATE_FROM_UNIX_DATEDATE_TRUNCDATETIMEDATETIME_ADDDATETIME_DIFFDATETIME_SUBDATETIME_TRUNCFORMAT_DATEFORMAT_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
|
自訂 user-defined function。 |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
自訂 user-defined function。 |
ESCAPE_REFERENCE (UTL_I18N)
|
BigQuery 不支援。建議使用 user-defined function。 |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
自訂 user-defined function。 |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
自訂 user-defined function。 |
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_LENGTHCODE_POINTS_TO_BYTESENDS_WITHFROM_BASE32FROM_BASE64FROM_HEXNORMALIZENORMALIZE_AND_CASEFOLDREPEATSAFE_CONVERT_BYTES_TO_STRINGSPLITSTARTS_WITHSTRPOSTO_BASE32TO_BASE64TO_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
|
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 specific not needed. | |
CONVERT
|
BigQuery 不支援字元集。建議使用自訂 user-defined function。 | |
EMPTY_BLOB
|
BigQuery 不會使用 BLOB。 |
|
EMPTY_CLOB
|
BigQuery 不會使用 CLOB。 |
|
FROM_TZ
|
BigQuery 不支援含時區的類型。建議使用 user-defined function 和 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_ACLIDTO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename)PARSE_DATEPARSE_TIMESTAMP在查詢中使用 Cast 語法,表示運算式的結果類型應轉換為其他類型。 |
|
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
|
自訂 user-defined function。 |
JSON_EQUAL
|
自訂 user-defined function。 |
JSON_EXIST
|
建議使用 UDF 和 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR |
JSON_MERGEPATCH
|
自訂 user-defined function。 |
JSON_OBJECT
|
BigQuery 不支援。 |
JSON_OBJECTAGG
|
BigQuery 不支援。 |
JSON_QUERY
|
建議使用 UDF 和 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR。 |
JSON_TABLE
|
自訂 user-defined function。 |
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
|
您可以使用 BigQuery 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 |
機器學習函式
Oracle 和 BigQuery 的機器學習 (ML) 函式不同。Oracle 需要進階數據分析套件和授權,才能在資料庫上執行機器學習。Oracle 使用 DBMS_DATA_MINING 套件進行機器學習。如要轉換 Oracle Data Miner 工作,必須重寫程式碼,才能與 BigQuery 功能搭配使用。您可以從全方位的 Google AI 產品中選擇,包括下列產品和功能:
您可以使用 BigQuery ML 或 Agent Platform 開發人員工具,開發、訓練及評估機器學習模型。
下表列出 Oracle 機器學習函式:
| Oracle | BigQuery |
|---|---|
CLASSIFIER
|
如要瞭解機器學習分類器和迴歸選項,請參閱 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()
|
集合或陣列函式
下表列出 Oracle 中的集合或陣列函式,以及 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 不會使用階層式或遞迴查詢。如果已知階層深度,則可透過彙整達成類似功能,如下列範例所示。另一個解決方案是使用 BigQuery Storage 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 為不可為空值的資料欄提供
注意:在 BigQuery 中,只有在目標資料表的所有資料欄值,都按照序數位置遞增排序時,才能在 |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
BigQuery 設有 DML 配額,限制您每天可執行的 DML 陳述式數量。為充分運用配額,建議您採取下列做法:
|
UPDATE 陳述式
Oracle UPDATE 陳述式大多與 BigQuery 相容,但在 BigQuery 中,UPDATE 陳述式必須包含 WHERE 子句。
最佳做法是優先使用批次 DML 陳述式,而非多個單一 UPDATE 和 INSERT 陳述式。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 作業合併為單一 UPSERT 陳述式,並以不可分割的方式執行作業。MERGE 作業最多只能為每個目標資料列比對一個來源資料列。BigQuery 和 Oracle 都遵循 ANSI 語法。
不過,BigQuery 中的 DML 指令碼與 Oracle 中的對等陳述式,一致性語意略有不同。
DDL 語法
本節說明 Oracle 和 BigQuery 之間的資料定義語言語法差異。
CREATE TABLE 陳述式
大多數 Oracle CREATE TABLE 陳述式都與 BigQuery 相容,但下列限制和語法元素除外,因為 BigQuery 不會使用這些元素:
STORAGETABLESPACEDEFAULTGENERATED ALWAYS ASENCRYPTPRIMARY KEY (col, ...)。詳情請參閱「CREATE INDEX」。UNIQUE INDEX。詳情請參閱「CREATE INDEX」。CONSTRAINT..REFERENCESDEFAULTPARALLELCOMPRESS
如要進一步瞭解 BigQuery 中的 CREATE TABLE,請參閱 BigQuery CREATE TABLE 範例。
資料欄選項和屬性
Oracle 12c 版導入了識別欄,可自動遞增欄值。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
|
BigQuery 不會使用下列 Oracle 元素:
ON COMMIT DELETE ROWS;ON COMMIT PRESERVE ROWS;
您也可以透過其他方式在 BigQuery 中模擬臨時資料表:
- 資料集存留時間:建立存留時間較短 (例如一小時) 的資料集,這樣一來,在資料集中建立的所有資料表實際上都是暫時性的 (因為資料表的存留時間不會超過資料集的存留時間)。您可以在這個資料集的所有資料表名稱前加上
temp,清楚表示這些資料表是暫時性的。 資料表存留時間:使用類似下列的 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 中,系統會自動執行 materialized view 重新整理作業。您不需要在 BigQuery 中指定重新整理選項 (例如在提交或排程時)。詳情請參閱「materialized view 簡介」。
如果基礎資料表只會透過附加作業持續變更,使用 materialized view 的查詢 (無論是明確參照檢視表,還是由查詢最佳化工具選取) 會掃描所有 materialized view,以及基礎資料表自上次重新整理檢視表後的差異。因此查詢速度更快,成本也更低。
相反地,如果自上次檢視表重新整理後,基礎資料表有任何更新 (DML UPDATE / MERGE) 或刪除 (DML DELETE、截斷、分區到期),系統就不會掃描 materialized view,因此在下次檢視表重新整理前,查詢不會節省任何費用。基本上,基礎資料表中的任何更新或刪除作業,都會導致 materialized view 狀態失效。
此外,基礎資料表串流緩衝區中的資料不會儲存至 materialized view。無論是否使用 materialized view,系統仍會完整掃描串流緩衝區。
下表列出 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 Scripting Beta 版支援預存程序。
| 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
|
使用 CONTINUE 搭配 IF 條件。 |
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 沒有傳統的工作階段概念。 您可以在使用者介面中查看查詢工作,或將 Stackdriver 稽核記錄匯出至 BigQuery,並分析 BigQuery 記錄來分析工作。詳情請參閱「查看工作詳細資料」。 |
START TRANSACTION;
|
將資料表內容替換為查詢輸出內容,等同於一筆交易。您可以透過查詢或複製作業執行這項操作。 使用查詢:
使用副本:
|
多陳述式和多行 SQL 陳述式
Oracle 和 BigQuery 都支援交易 (工作階段),因此支援以分號分隔、一律一起執行的陳述式。詳情請參閱「多陳述式交易」。
錯誤代碼和訊息
Oracle 錯誤代碼和 BigQuery 錯誤代碼不同。如果應用程式邏輯目前會擷取錯誤,請嘗試消除錯誤來源,因為 BigQuery 不會傳回相同的錯誤代碼。
一致性保證和交易隔離
Oracle 和 BigQuery 都具備原子性,也就是在多個資料列的每個異動層級都符合 ACID 標準。舉例來說,MERGE 作業是不可分割的,即使插入和更新多個值也一樣。
交易
Oracle 提供讀取提交或可序列化交易隔離層級。可能發生死結。Oracle 插入附加工作會獨立執行。
BigQuery 也支援交易。BigQuery 透過快照隔離確保開放式並行控制 (先提交者優先),其中查詢會讀取查詢開始前最後提交的資料。這種做法可確保每個資料列、每個異動,以及同一 DML 陳述式中的各個資料列都有一致性,同時避免死結。如果對同一個資料表有多個 UPDATE 陳述式,BigQuery 會切換至悲觀並行控制,並將多個 UPDATE 陳述式排入佇列,在發生衝突時自動重試。INSERT DML 陳述式和載入工作可並行且獨立執行,將資料附加至資料表。
復原
Oracle 支援復原。BigQuery 沒有明確的交易界線,因此也沒有明確復原的概念。解決方法是使用資料表裝飾器或 FOR SYSTEM_TIME AS OF。
資料庫限制
查看 BigQuery 最新配額和限制。如果用量較大,可以聯絡 Cloud Customer Care 提高配額。下表比較 Oracle 和 BigQuery 資料庫的限制。
| Limit | Oracle | BigQuery |
|---|---|---|
| 每個資料庫的資料表數量 | 無限制 | 無限制 |
| 每個資料表的資料欄數 | 1000 | 10,000 |
| 資料列大小上限 | 無限制 (視資料欄類型而定) | 100 MB |
| 資料欄和資料表名稱長度 | If v12.2>= 128 Bytes
Else 30 Bytes |
16,384 個 Unicode 字元 |
| 每個資料表的資料列數 | Unlimited | Unlimited |
| SQL 要求長度上限 | Unlimited | 1 MB (未解析 GoogleSQL 查詢長度上限) 12 MB (已解析的舊版和 GoogleSQL 查詢長度上限) 串流:
|
| 要求和回應大小上限 | Unlimited | 10 MB (要求) 和 10 GB (回應),如果使用分頁或 Cloud Storage API,則幾乎沒有限制。 |
| 並行工作階段數量上限 | 受限於工作階段或程序參數 | 100 項並行查詢 (可透過預留運算單元提高),每位使用者 300 項並行 API 要求。 |
| 並行 (快速) 載入數量上限 | 受限於工作階段或程序參數 | 沒有並行限制,工作會排入佇列。每項專案每天 100,000 項載入工作。 |
其他 Oracle 資料庫限制包括資料類型限制、實體資料庫限制、邏輯資料庫限制,以及程序和執行階段限制。