Oracle SQL 翻譯指南

本文詳述 Oracle 和 BigQuery 之間 SQL 語法的相似與差異之處,協助您規劃遷移作業。使用批次 SQL 翻譯功能大量遷移 SQL 指令碼,或使用互動式 SQL 翻譯功能翻譯臨時查詢。

資料類型

本節說明 Oracle 和 BigQuery 的資料類型之間的對應關係。

OracleBigQuery附註
VARCHAR2STRING
NVARCHAR2STRING
CHARSTRING
NCHARSTRING
CLOBSTRING
NCLOBSTRING
INTEGERINT64
SHORTINTEGERINT64
LONGINTEGERINT64
NUMBERNUMERICBigQuery 不允許使用者指定精確度或比例的值。因此,Oracle 中的資料欄可能會定義為比 BigQuery 支援的更大規模。

此外,在儲存小數時,如果小數點後的位數超過對應資料欄指定的位數,Oracle 會將數字四捨五入。在 BigQuery 中,您可以使用 ROUND() 函式實作這項功能。

NUMBER(*, x)NUMERICBigQuery 不允許使用者指定精確度或比例的值。因此,Oracle 中的資料欄可能會定義為比 BigQuery 支援的更大規模。

此外,在儲存小數時,如果小數點後的位數超過對應資料欄指定的位數,Oracle 會將數字四捨五入。在 BigQuery 中,您可以使用 ROUND() 函式實作這項功能。

NUMBER(x, -y)INT64如果使用者嘗試儲存小數,Oracle 會將其捨入為整數。在 BigQuery 中,如果嘗試在定義為 INT64 的資料欄中儲存小數,系統會傳回錯誤。在這種情況下,應套用 ROUND() 函式。

BigQuery INT64 資料類型最多支援 18 位精確度。如果數字欄位有超過 18 個數字,請在 BigQuery 中使用 FLOAT64 資料類型。

NUMBER(x)INT64如果使用者嘗試儲存小數,Oracle 會將其捨入為整數。在 BigQuery 中,如果嘗試在定義為 INT64 的資料欄中儲存小數,系統會傳回錯誤。在這種情況下,應套用 ROUND() 函式。

BigQuery INT64 資料類型最多支援 18 位精確度。如果數字欄位有超過 18 個數字,請在 BigQuery 中使用 FLOAT64 資料類型。

FLOATFLOAT64/NUMERICFLOAT 是精確資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。
BINARY_DOUBLEFLOAT64/NUMERICFLOAT 是精確資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。
BINARY_FLOATFLOAT64/NUMERICFLOAT 是精確資料類型,也是 Oracle 中的 NUMBER 子類型。在 BigQuery 中,FLOAT64 是近似資料類型。NUMERIC 可能更適合 BigQuery 中的 FLOAT 類型。
LONGBYTESLONG 資料類型適用於舊版,不建議在新版 Oracle 資料庫中使用。

如果需要在 BigQuery 中保留 LONG 資料,可以使用 BigQuery 中的 BYTES 資料類型。更好的方法是將二進位物件放入 Cloud Storage,並在 BigQuery 中保留參照。

BLOBBYTESBYTES 資料類型可用於儲存變長二進位資料。如果這個欄位不會被查詢,也不會用於分析,建議您將二進位資料儲存在 Cloud Storage 中。
BFILESTRING二進位檔案可儲存在 Cloud Storage 中,STRING 資料類型可用於在 BigQuery 資料表中參照檔案。
DATEDATETIME
TIMESTAMPTIMESTAMPBigQuery 支援微秒精確度 (10-6),而 Oracle 支援的範圍為 0 到 9。

BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與 UTC 的時區偏移量。

在 BigQuery 中,您必須手動執行時區轉換作業,才能與 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能相符。

TIMESTAMP(x)TIMESTAMPBigQuery 支援微秒精確度 (10-6),而 Oracle 支援的範圍為 0 到 9。

BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與 UTC 的時區偏移量。

在 BigQuery 中,您必須手動執行時區轉換作業,才能與 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能相符。

TIMESTAMP WITH TIME ZONETIMESTAMPBigQuery 支援微秒精確度 (10-6),而 Oracle 支援的範圍為 0 到 9。

BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與 UTC 的時區偏移量。

在 BigQuery 中,您必須手動執行時區轉換作業,才能與 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能相符。

TIMESTAMP WITH LOCAL TIME ZONETIMESTAMPBigQuery 支援微秒精確度 (10-6),而 Oracle 支援的範圍為 0 到 9。

BigQuery 支援 TZ 資料庫中的時區區域名稱,以及與 UTC 的時區偏移量。

在 BigQuery 中,您必須手動執行時區轉換作業,才能與 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能相符。

INTERVAL YEAR TO MONTHSTRING間隔值可儲存在 BigQuery 中的 STRING 資料類型中。
INTERVAL DAY TO SECONDSTRING間隔值可儲存在 BigQuery 中的 STRING 資料類型中。
RAWBYTESBYTES 資料類型可用於儲存變長二進位資料。如果這個欄位不會在數據分析中查詢及使用,建議您將二進位檔資料儲存在 Cloud Storage 中。
LONG RAWBYTESBYTES 資料類型可用於儲存變長二進位資料。如果這個欄位不會在數據分析中查詢及使用,建議您將二進位檔資料儲存在 Cloud Storage 中。
ROWIDSTRING這些資料類型會在 Oracle 內部使用,用於指定資料表中資料列的專屬位址。一般來說,應用程式不應使用 ROWIDUROWID 欄位。但如果是這種情況,您可以使用 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 編碼儲存及傳回資料。您可以在 DATETIMESTAMP 函式中設定預期的日期格式或時區。

時間戳記和日期類型格式

將時間戳記和日期格式元素從 Oracle 轉換為 BigQuery 時,請留意 TIMESTAMPDATETIME 之間的時區差異,如下表所示。

請注意,Oracle 格式中沒有括號,因為這些格式 (CURRENT_*) 是關鍵字,而非函式。

OracleBigQuery附註
CURRENT_TIMESTAMPOracle 中的 TIMESTAMP 資訊可以包含不同的時區資訊,這些資訊會在資料欄定義或設定 TIME_ZONE 變數時使用 WITH TIME ZONE 定義。盡可能使用 CURRENT_TIMESTAMP() 函式,其格式為 ISO 格式。不過,輸出格式一律會顯示世界標準時間時區。(BigQuery 內部並沒有時區。)

請注意下列 ISO 格式差異的詳細資訊:

DATETIME 的格式會根據輸出管道慣例。在 BigQuery 指令列工具和 BigQuery 主控台中,DATETIME 會根據 RFC 3339 使用 T 分隔符進行格式設定。不過,在 Python 和 Java JDBC 中,空格會用來做為分隔符。

如要使用明確的格式,請使用 FORMAT_DATETIME() 函式,該函式會將明確的轉型轉換為字串。例如,下列運算式一律會傳回空格分隔符: CAST(CURRENT_DATETIME() AS STRING)

CURRENT_DATE
SYSDATE
Oracle 使用 2 種日期類型:
  • 類型 12
  • 類型 13
Oracle 會在儲存日期時使用類型 12。在內部,這些是固定長度的數字。當 SYSDATE or CURRENT_DATE 傳回 a 時,Oracle 會使用類型 13
BigQuery 有個獨立的 DATE 格式,一律會以 ISO 8601 格式傳回日期。

DATE_FROM_UNIX_DATE 是以 1970 年為基準,因此無法使用。

CURRENT_DATE-3日期值會以整數表示。Oracle 支援日期類型的算術運算子。如為日期類型,請使用 DATE_ADD() 或 DATE_SUB()。BigQuery 會使用以下算術運算子處理資料類型:INT64NUMERICFLOAT64
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

運算子說明
"="相等
<>不相等
!=不相等
>大於
>=大於或等於
<小於
<=小於或等於
IN ( )比對清單中的值
NOT否定條件
BETWEEN在範圍內 (含範圍內)
IS NULLNULL
IS NOT NULL不是 NULL
LIKE使用 %進行模式比對
EXISTS如果子查詢傳回至少一列,就符合條件

在 BigQuery 和 Oracle 中,表格上的運算子都相同。

邏輯運算式和函式

OracleBigQuery
CASECASE
COALESCECOALESCE(expr1, ..., exprN)
DECODECASE.. WHEN.. END
NANVLIFNULL
FETCH NEXT>LIMIT
NULLIFNULLIF(expression, expression_to_match)
NVLIFNULL(expr, 0), COALESCE(exp, 0)
NVL2IF(expr, true_result, else_result)

匯總函式

下表列出常見的 Oracle 匯總、統計匯總和近似匯總函式,以及其 BigQuery 等同函式:

OracleBigQuery
ANY_VALUE
(自 Oracle 19c 起)
ANY_VALUE
APPROX_COUNTHLL_COUNT set of functions with specified precision
APPROX_COUNT_DISTINCTAPPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT_AGGAPPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT_DETAILAPPROX_COUNT_DISTINCT
APPROX_PERCENTILE(percentile) WITHIN GROUP (ORDER BY expression)APPROX_QUANTILES(expression, 100)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]

BigQuery 不支援 Oracle 定義的其他引數。
<codeAPPROX_PERCENTILE_AGGAPPROX_QUANTILES(expression, 100)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
APPROX_PERCENTILE_DETAILAPPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
APPROX_SUMAPPROX_TOP_SUM(expression, weight, number)
AVGAVG
BIT_COMPLEMENT位元「非」運算子:~
BIT_ORBIT_OR, X | Y
BIT_XORBIT_XOR, X ^ Y
BITANDBIT_AND, X & Y
CARDINALITYCOUNT
COLLECTBigQuery 不支援 TYPE AS TABLE OF。建議您在 BigQuery 中使用 STRING_AGG()ARRAY_AGG()
CORR/CORR_K/ CORR_SCORR
COUNTCOUNT
COVAR_POPCOVAR_POP
COVAR_SAMPCOVAR_SAMP
FIRST在 BigQuery 中不存在隱含的資料。建議使用使用者定義函式 (UDF)
GROUP_ID不適用於 BigQuery
GROUPING不適用於 BigQuery
GROUPING_ID在 BigQuery 中未使用。
LAST在 BigQuery 中不存在隱含的資料。建議使用 UDF
LISTAGGSTRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
MAXMAX
MINMIN
OLAP_CONDITIONOracle 專屬,在 BigQuery 中不存在。
OLAP_EXPRESSIONOracle 專屬,在 BigQuery 中不存在。
OLAP_EXPRESSION_BOOLOracle 專屬,在 BigQuery 中不存在。
OLAP_EXPRESSION_DATEOracle 專屬,在 BigQuery 中不存在。
OLAP_EXPRESSION_TEXTOracle 專屬,在 BigQuery 中不存在。
OLAP_TABLEOracle 專屬,在 BigQuery 中不存在。
POWERMULTISETOracle 專屬,在 BigQuery 中不存在。
POWERMULTISET_BY_CARDINALITYOracle 專屬,在 BigQuery 中不存在。
QUALIFYOracle 專屬,在 BigQuery 中不存在。
REGR_AVGXAVG(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, ind_var_expr)
)
REGR_AVGYAVG(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, dep_var_expr)
)
REGR_COUNTSUM(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, 1)
)
REGR_INTERCEPTAVG(dep_var_expr)
- AVG(ind_var_expr)
* (COVAR_SAMP(ind_var_expr,dep_var_expr)
/ VARIANCE(ind_var_expr)
)
REGR_R2(COUNT(dep_var_expr) *
SUM(ind_var_expr * dep_var_expr) -
SUM(dep_var_expr) * SUM(ind_var_expr))
/ SQRT(
(COUNT(ind_var_expr) *
SUM(POWER(ind_var_expr, 2)) *
POWER(SUM(ind_var_expr),2)) *
(COUNT(dep_var_expr) *
SUM(POWER(dep_var_expr, 2)) *
POWER(SUM(dep_var_expr), 2)))
REGR_SLOPECOVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(ind_var_expr)

REGR_SXXSUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
REGR_SXYSUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
REGR_SYYSUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
ROLLUPROLLUP
STDDEV_POPSTDDEV_POP
STDDEV_SAMPSTDDEV_SAMP, STDDEV
SUMSUM
VAR_POPVAR_POP
VAR_SAMPVAR_SAMP, VARIANCE
WM_CONCATSTRING_AGG

BigQuery 提供下列其他匯總函式:

分析函式

下表列出常見 Oracle 分析函式和匯總分析函式與 BigQuery 對應函式的對應關係。

OracleBigQuery
AVGAVG
BIT_COMPLEMENT位元「非」運算子:~
BIT_ORBIT_OR, X | Y
BIT_XORBIT_XOR, X ^ Y
BITANDBIT_AND, X & Y
BOOL_TO_INTCAST(X AS INT64)
COUNTCOUNT
COVAR_POPCOVAR_POP
COVAR_SAMPCOVAR_SAMP
CUBE_TABLE不支援 BigQuery。建議使用 BI 工具或自訂 UDF
CUME_DISTCUME_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_VALUEFIRST_VALUE
HIER_CAPTIONBigQuery 不支援階層查詢。
HIER_CHILD_COUNTBigQuery 不支援階層查詢。
HIER_COLUMNBigQuery 不支援階層查詢。
HIER_DEPTHBigQuery 不支援階層查詢。
HIER_DESCRIPTIONBigQuery 不支援階層查詢。
HIER_HAS_CHILDRENBigQuery 不支援階層查詢。
HIER_LEVELBigQuery 不支援階層查詢。
HIER_MEMBER_NAMEBigQuery 不支援階層查詢。
HIER_ORDERBigQuery 不支援階層查詢。
HIER_UNIQUE_MEMBER_NAMEBigQuery 不支援階層查詢。
LAST_VALUELAST_VALUE
LAGLAG
LEADLEAD
LISTAGGARRAY_AGG
STRING_AGG
ARRAY_CONCAT_AGG
MATCH_NUMBER您可以在 BigQuery 中使用正規表示式和 UDF 進行模式辨識和計算
MATCH_RECOGNIZE您可以在 BigQuery 中使用正規表示式和 UDF 進行模式辨識和計算
MAXMAX
MEDIANPERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
MINMIN
NTH_VALUENTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
NTILENTILE(constant_integer_expression)
PERCENT_RANK
PERCENT_RANKM
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
PERCENTILE_CONT
PERCENTILE_CONT
PERCENTILE_DISC
PERCENTILE_DISC
PRESENTNNVOracle 專屬,BigQuery 中不存在。
PRESENTVOracle 專屬,在 BigQuery 中不存在。
PREVIOUS特定於 Oracle,在 BigQuery 中不存在。
RANK(ANSI)RANK
RATIO_TO_REPORT(expr) OVER (partition clause)expr / SUM(expr) OVER (partition clause)
ROW_NUMBERROW_NUMBER
STDDEV_POPSTDDEV_POP
STDDEV_SAMPSTDDEV_SAMP, STDDEV
SUMSUM
VAR_POPVAR_POP
VAR_SAMPVAR_SAMP, VARIANCE
VARIANCEVARIANCE()
WIDTH_BUCKET可以使用 UDF。

日期/時間函式

下表列出常見 Oracle 日期/時間函式與 BigQuery 對應函式之間的對應關係。

OracleBigQuery
ADD_MONTHS(date, integer)DATE_ADD(date, INTERVAL integer MONTH),
如果日期是 TIMESTAMP,您可以使用

EXTRACT(DATE FROM TIMESTAMP_ADD(date, INTERVAL integer MONTH))

CURRENT_DATECURRENT_DATE
CURRENT_TIMECURRENT_TIME
CURRENT_TIMESTAMPCURRENT_TIMESTAMP
DATE - kDATE_SUB(date_expression, INTERVAL k DAY)
DATE + kDATE_ADD(date_expression, INTERVAL k DAY)
DBTIMEZONEBigQuery 不支援資料庫時區。
EXTRACTEXTRACT(DATE), EXTRACT(TIMESTAMP)
LAST_DAYDATE_SUB(
  DATE_TRUNC(
    DATE_ADD(
      date_expression,
      INTERVAL 1 MONTH
    ),
  MONTH
  ),
INTERVAL 1 DAY
)
LOCALTIMESTAMPBigQuery 不支援時區設定。
MONTHS_BETWEENDATE_DIFF(date_expression, date_expression, MONTH)
NEW_TIMEDATE(timestamp_expression, time zone)
TIME(timestamp, time zone)
DATETIME(timestamp_expression, time zone)
NEXT_DAYDATE_ADD(
  DATE_TRUNC(
    date_expression,
    WEEK(day_value)
  ),
  INTERVAL 1 WEEK
)
SYS_AT_TIME_ZONECURRENT_DATE([time_zone])
SYSDATECURRENT_DATE()
SYSTIMESTAMPCURRENT_TIMESTAMP()
TO_DATEPARSE_DATE
TO_TIMESTAMPPARSE_TIMESTAMP
TO_TIMESTAMP_TZPARSE_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 比較兩個時間範圍。

BigQuery 提供下列其他日期/時間函式:

字串函式

下表列出 Oracle 字串函式與 BigQuery 對應函式的對應關係:

OracleBigQuery
ASCIITO_CODE_POINTS(string_expr)[OFFSET(0)]
ASCIISTRBigQuery 不支援 UTF-16
RAWTOHEXTO_HEX
LENGTHCHAR_LENGTH
LENGTHCHARACTER_LENGTH
CHRCODE_POINTS_TO_STRING(
[mod(numeric_expr, 256)]
)
COLLATION不存在於 BigQuery 中。BigQuery 不支援 DML 中的 COLLATE。
COMPOSE自訂使用者定義函式。
CONCAT, (|| operator)CONCAT
DECOMPOSE自訂使用者定義函式。
ESCAPE_REFERENCE (UTL_I18N)在 BigQuery 中不支援。建議使用使用者定義函式。
INITCAPINITCAP
INSTR/INSTR2/INSTR4/INSTRB/INSTRC自訂使用者定義函式。
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHCLENGTH
LOWERLOWER
LPADLPAD
LTRIMLTRIM
NLS_INITCAP自訂使用者定義函式。
NLS_LOWERLOWER
NLS_UPPERUPPER
NLSSORT特定於 Oracle,在 BigQuery 中不存在。
POSITIONSTRPOS(string, substring)
PRINTBLOBTOCLOBOracle 專屬,在 BigQuery 中不存在。
REGEXP_COUNTARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
REGEXP_INSTRSTRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))

注意:傳回第一次出現的值。

REGEXP_REPLACEREGEXP_REPLACE
REGEXP_LIKEIF(REGEXP_CONTAINS,1,0)
REGEXP_SUBSTRREGEXP_EXTRACT, REGEXP_EXTRACT_ALL
REPLACEREPLACE
REVERSEREVERSE
RIGHTSUBSTR(source_string, -1, length)
RPADRPAD
RTRIMRTRIM
SOUNDEX不支援 BigQuery。考慮使用自訂 UDF
STRTOKSPLIT(instring, delimiter)[ORDINAL(tokennum)]

Note: The entire delimiter string argument is used as a single delimiter. The default delimiter is a comma.

SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4SUBSTR
TRANSLATEREPLACE
TRANSLATE USINGREPLACE
TRIMTRIM
UNISTRCODE_POINTS_TO_STRING
UPPERUPPER
|| (垂直長條)CONCAT

BigQuery 提供下列其他字串函式:

數學函式

下表列出 Oracle 數學函式與 BigQuery 對應函式之間的對應關係。

OracleBigQuery
ABSABS
ACOSACOS
ACOSHACOSH
ASINASIN
ASINHASINH
ATANATAN
ATAN2ATAN2
ATANHATANH
CEILCEIL
CEILINGCEILING
COSCOS
COSHCOSH
EXPEXP
FLOORFLOOR
GREATESTGREATEST
LEASTLEAST
LNLN
LNNVL使用 ISNULL 的帳戶操作
LOGLOG
MOD (% operator)MOD
POWER (** operator)POWER, POW
DBMS_RANDOM.VALUERAND
RANDOMBYTES不支援 BigQuery。考慮使用自訂 UDF 和 RAND 函式
RANDOMINTEGERCAST(FLOOR(10*RAND()) AS INT64)
RANDOMNUMBER不支援 BigQuery。考慮使用自訂 UDF 和 RAND 函式
REMAINDERMOD
ROUNDROUND
ROUND_TIES_TO_EVENROUND()
SIGNSIGN
SINSIN
SINHSINH
SQRTSQRT
STANDARD_HASHFARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
STDDEVSTDDEV
TANTAN
TANHTANH
TRUNCTRUNC
NVLIFNULL(expr, 0), COALESCE(exp, 0)

BigQuery 提供下列其他數學函式:

類型轉換函式

下表列出 Oracle 類型轉換函式與 BigQuery 對應項目之間的對應關係。

OracleBigQuery
BIN_TO_NUMSAFE_CONVERT_BYTES_TO_STRING(value)

CAST(x AS INT64)

BINARY2VARCHARSAFE_CONVERT_BYTES_TO_STRING(value)
CAST
CAST_FROM_BINARY_DOUBLE
CAST_FROM_BINARY_FLOAT
CAST_FROM_BINARY_INTEGER
CAST_FROM_NUMBER
CAST_TO_BINARY_DOUBLE
CAST_TO_BINARY_FLOAT
CAST_TO_BINARY_INTEGER
CAST_TO_NUMBER
CAST_TO_NVARCHAR2
CAST_TO_RAW
>CAST_TO_VARCHAR
CAST(expr AS typename)
CHARTOROWID不需要 Oracle 專屬的工具。
CONVERTBigQuery 不支援字元集。建議使用自訂使用者定義函式。
EMPTY_BLOBBLOB 不會用於 BigQuery。
EMPTY_CLOBCLOB 不會用於 BigQuery。
FROM_TZBigQuery 不支援含有時區的類型。建議使用使用者定義函式和 FORMAT_TIMESTAMP
INT_TO_BOOLCAST
IS_BIT_SET在 BigQuery 中不存在隱含的資料。建議使用 UDF
NCHR您可以使用 UDF 取得二進位值的 char 等值。
NUMTODSINTERVALBigQuery 不支援 INTERVAL 資料類型
NUMTOHEX不支援 BigQuery。建議使用自訂 UDF 和 TO_HEX 函式
NUMTOHEX2
NUMTOYMINTERVALBigQuery 不支援 INTERVAL 資料類型。
RAW_TO_CHAROracle 專屬,在 BigQuery 中不存在。
RAW_TO_NCHAROracle 專屬,在 BigQuery 中不存在。
RAW_TO_VARCHAR2Oracle 專屬,在 BigQuery 中不存在。
RAWTOHEXOracle 專屬,在 BigQuery 中不存在。
RAWTONHEXOracle 專屬,在 BigQuery 中不存在。
RAWTONUMOracle 專屬,在 BigQuery 中不存在。
RAWTONUM2Oracle 專屬,在 BigQuery 中不存在。
RAWTOREFOracle 專屬,在 BigQuery 中不存在。
REFTOHEXOracle 專屬,在 BigQuery 中不存在。
REFTORAWOracle 專屬,在 BigQuery 中不存在。
ROWIDTOCHARROWID 是 Oracle 專屬類型,不存在於 BigQuery 中。此值應以字串表示。
ROWIDTONCHARROWID 是 Oracle 專屬類型,不存在於 BigQuery 中。此值應以字串表示。
SCN_TO_TIMESTAMPSCN 是 Oracle 專屬類型,不存在於 BigQuery 中。這個值應以時間戳記表示。
TO_ACLID
TO_ANYLOB
TO_APPROX_COUNT_DISTINCT
TO_APPROX_PERCENTILE
TO_BINARY_DOUBLE
TO_BINARY_FLOAT
TO_BLOB
TO_CHAR
TO_CLOB
TO_DATE
TO_DSINTERVAL
TO_LOB
TO_MULTI_BYTE
TO_NCHAR
TO_NCLOB
TO_NUMBER
TO_RAW
TO_SINGLE_BYTE
TO_TIME

TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_TIME_TZ
TO_UTC_TIMEZONE_TZ
TO_YMINTERVAL
CAST(expr AS typename)
PARSE_DATE
PARSE_TIMESTAMP
在查詢中使用轉換語法,表示運算式的結果類型應轉換為其他某一類型。
TREATOracle 專屬,在 BigQuery 中不存在。
VALIDATE_CONVERSION不支援 BigQuery。考慮使用自訂 UDF
VSIZE不支援 BigQuery。考慮使用自訂 UDF

JSON 函式

下表列出 Oracle JSON 函式與 BigQuery 對應函式之間的對應關係。

OracleBigQuery
AS_JSONTO_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_EXTRACTJSON_EXTRACT_SCALAR
JSON_MERGE自訂使用者定義函式。
JSON_OBJECTBigQuery 不支援。
JSON_OBJECTAGGBigQuery 不支援。
JSON_QUERY建議使用 UDF 和 JSON_EXTRACTJSON_EXTRACT_SCALAR
JSON_TABLE自訂使用者定義函式。
JSON_TEXTCONTAINS建議使用 UDF 和 JSON_EXTRACTJSON_EXTRACT_SCALAR
JSON_VALUEJSON_EXTRACT_SCALAR

XML 函式

BigQuery 不提供隱含的 XML 函式。XML 可做為字串載入至 BigQuery,並可使用 UDF 剖析 XML。您也可以使用 ETL/ELT 工具 (例如 Dataflow) 處理 XML。以下清單列出 Oracle XML 函式:

OracleBigQuery
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
XML
XMLPI
XMLQUERY
XMLQUERYVAL
XMLSERIALIZE
XMLTABLE
XMLTOJSON
XMLTRANSFORM
XMLTRANSFORMBLOB
XMLTYPE

機器學習功能

Oracle 和 BigQuery 中的機器學習 (ML) 函式不同。您必須購買 Oracle 進階數據分析套件和授權,才能在資料庫上執行機器學習。Oracle 會使用 DBMS_DATA_MINING 套件進行機器學習。轉換 Oracle 資料探勘作業需要重寫程式碼,您可以選擇 Google AI 產品,例如 BigQuery ML、AI API (包括語音轉文字文字轉語音DialogflowCloud TranslationNLPCloud VisionTimeseries Insights APIAutoMLAutoML TablesAI 平台。Google 使用者管理的筆記本可做為資料科學家的工作開發環境,而 Google AI 平台訓練則可用於大規模執行訓練和評分工作負載。下表列出 Oracle ML 函式:

OracleBigQuery
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 中識別使用者的函式:

OracleBigQuery
UIDSESSION_USER
USER/SESSION_USER/CURRENT_USERSESSION_USER()

集合或陣列函式

下表列出 Oracle 中的集合或陣列函式,以及 BigQuery 中的等效函式:

OracleBigQuery
MULTISETARRAY_AGG
MULTISET EXCEPTARRAY_AGG([DISTINCT] expression)
MULTISET INTERSECTARRAY_AGG([DISTINCT])
MULTISET UNIONARRAY_AGG

窗型函式

下表列出 Oracle 中的視窗函式,以及 BigQuery 中的等效函式。

OracleBigQuery
LAGLAG (value_expression[, offset [, default_expression]])
LEADLEAD (value_expression[, offset [, default_expression]])

階層或遞迴查詢

BigQuery 不支援階層或遞迴查詢。如果已知階層的深度,則可透過彙整達成類似的功能,如以下範例所示。另一個解決方案是使用 BigQueryStorage APISpark

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 中的階層函式。

OracleBigQuery
DEPTHBigQuery 不使用階層查詢。
PATH
SYS_CONNECT_BY_PATH (hierarchical)

UTL 函式

UTL_File 套件主要用於從 PL/SQL 讀取及寫入作業系統檔案。Cloud Storage 可用於任何類型的原始檔案暫存作業。您應使用外部資料表和 BigQuery 的載入匯出功能,讀取及寫入 Cloud Storage 中的檔案。詳情請參閱外部資料來源簡介

空間函式

您可以使用 BigQuery 地理空間分析取代空間功能。Oracle 中有 SDO_* 函式和類型,例如 SDO_GEOM_KEYSDO_GEOM_MBRSDO_GEOM_MMB。這些函式可用於空間分析。您可以使用地理空間分析功能進行空間分析。

DML 語法

本節說明 Oracle 和 BigQuery 之間資料管理語言語法的差異。

INSERT 陳述式

大部分的 Oracle INSERT 陳述式都與 BigQuery 相容。下表列出例外狀況。

BigQuery 中的 DML 指令碼與 Oracle 中的等效陳述式,在一致性方面略有不同。如需快照隔離和工作階段與交易處理的總覽,請參閱本文其他部分的 CREATE [UNIQUE] INDEX section

OracleBigQuery
INSERT INTO table VALUES (...);INSERT INTO table (...) VALUES (...);

Oracle 提供 DEFAULT 關鍵字,用於非空值資料欄。

注意:在 BigQuery 中,只有在目標資料表中的所有資料欄值依序數位置遞增排序時,才能在 INSERT 陳述式中省略資料欄名稱。

INSERT INTO table VALUES (1,2,3);
INSERT INTO table VALUES (4,5,6);
INSERT INTO table VALUES (7,8,9);
INSERT ALL
INTO table (col1, col2) VALUES ('val1_1', 'val1_2')
INTO table (col1, col2) VALUES ('val2_1', 'val2_2')
INTO table (col1, col2) VALUES ('val3_1', 'val3_2')
.
.
.
SELECT 1 FROM DUAL;
INSERT INTO table VALUES (1,2,3), (4,5,6),
(7,8,9);

BigQuery 會設立 DML 配額,限制您每天可執行的 DML 陳述式數量。如要充分運用配額,請考慮採用下列做法:

  • 在單一 INSERT 陳述式中合併多個資料列,而不是每個 INSERT 作業一個資料列。
  • 使用 MERGE 陳述式合併多個 DML 陳述式 (包括 INSERT)。
  • 使用 CREATE TABLE ... AS SELECT 建立及填入新的資料表。

UPDATE 陳述式

Oracle UPDATE 陳述式大多與 BigQuery 相容,但在 BigQuery 中,UPDATE 陳述式必須包含 WHERE 子句。

最佳做法是,您應使用批次 DML 陳述式,而非多個單一 UPDATEINSERT 陳述式。BigQuery 中的 DML 指令碼與 Oracle 中的等效陳述式,在一致性語意上略有不同。如要瞭解快照隔離和工作階段與交易處理,請參閱本文中的「CREATE INDEX」一節。

下表列出可完成相同工作的 Oracle UPDATE 陳述式和 BigQuery 陳述式。

在 BigQuery 中,UPDATE 陳述式必須包含 WHERE 子句。如要進一步瞭解 BigQuery 中的 UPDATE,請參閱 DML 說明文件中的 BigQuery UPDATE 範例

DELETETRUNCATE 陳述式

DELETETRUNCATE 陳述式都能在不影響資料表結構定義的情況下,從資料表中移除資料列。TRUNCATE 不會用於 BigQuery。不過,您可以使用 DELETE 陳述式來達到相同的效果。

在 BigQuery 中,DELETE 陳述式必須包含 WHERE 子句。如要進一步瞭解 BigQuery 中的 DELETE,請參閱 DML 說明文件中的 BigQuery DELETE 範例

OracleBigQuery
DELETE database.table;DELETE FROM table WHERE TRUE;

MERGE 陳述式

MERGE 陳述式可以將 INSERTUPDATEDELETE 作業合併成單一 UPSERT 陳述式,並以不可分割的形式執行這些作業。MERGE 作業必須與每個目標資料列相符,最多一個來源資料列。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 版本引進了識別資料欄,可讓資料欄自動遞增。這項功能不會在 BigQuery 中使用,但可以透過以下批次方式達成。如要進一步瞭解代替鍵和緩慢變更的維度 (SCD),請參閱下列指南:

OracleBigQuery
CREATE TABLE table (
  id NUMBER GENERATED ALWAYS AS IDENTITY,
  description VARCHAR2(30)
);
INSERT INTO dataset.table SELECT
  *,
  ROW_NUMBER() OVER () AS id
FROM dataset.table

資料欄註解

Oracle 使用 Comment 語法在資料欄上新增註解。您也可以在 BigQuery 中使用資料欄說明實作這項功能,如下表所示:

OracleBigQuery
Comment on column table is 'column desc';CREATE TABLE dataset.table (
   col1 STRING
OPTIONS(description="column desc")
);

臨時資料表

Oracle 支援暫時資料表,這類資料表通常用於在指令碼中儲存中繼結果。BigQuery 支援臨時資料表。

OracleBigQuery
CREATE GLOBAL TEMPORARY TABLE
temp_tab
    (x INTEGER,
    y VARCHAR2(50))
  ON COMMIT DELETE ROWS;
COMMIT;
CREATE TEMP TABLE temp_tab
(
  x INT64,
  y STRING
);
DELETE FROM temp_tab WHERE TRUE;

下列 Oracle 元素不會在 BigQuery 中使用:

  • ON COMMIT DELETE ROWS;
  • ON COMMIT PRESERVE ROWS;

您也可以透過其他方式在 BigQuery 中模擬臨時資料表:

  • 資料集 TTL:建立存留時間較短 (例如一小時) 的資料集,讓資料集中建立的任何資料表都會暫時保留 (因為資料表的存留時間不會超過資料集的存留時間)。您可以為這個資料集中的所有資料表名稱加上前置字串 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 陳述式

下表列出 CREATE VIEW 陳述式在 Oracle 和 BigQuery 中的等效項目。

OracleBigQuery附註
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 中指定重新整理選項 (例如在提交或排程時)。詳情請參閱「命名檢視表簡介」。

如果基礎資料表只透過附加方式不斷變更,使用了具體化檢視的查詢 (無論是明確參照檢視或由查詢最佳化工具選取) 都會掃描所有具體化檢視,以及自上次檢視重新整理後,基礎資料表中的差異。這表示查詢速度更快,成本也更低。

相反地,如果自上次刷新檢視表以來,在基礎資料表中進行任何更新 (DML UPDATE / MERGE) 或刪除 (DML DELETE、截斷、區隔過期),則系統不會掃描具體化檢視表,因此查詢不會在下次刷新檢視表前獲得任何節省。基本上,在基礎資料表中進行的任何更新或刪除作業都會使 materialized view 狀態失效。

此外,系統不會將基本資料表的串流緩衝區資料儲存至物化檢視畫面。無論是否使用具體化檢視表,系統仍會完整掃描串流緩衝區。

下表列出 CREATE MATERIALIZED VIEW 陳述式在 Oracle 和 BigQuery 中的等效項目。

OracleBigQuery附註
CREATE MATERIALIZED VIEW view_name
REFRESH FAST NEXT sysdate + 7
AS SELECT … FROM TABLE_1
CREATE MATERIALIZED VIEW
view_name AS SELECT ...

CREATE [UNIQUE] INDEX 陳述式

本節說明如何在 BigQuery 中建立類似於 Oracle 索引的功能。

為提升效能而建立索引

BigQuery 不需要明確的索引,因為它是針對查詢和儲存空間最佳化設計的資料庫。BigQuery 提供分區和叢集等功能,以及巢狀欄位,可透過最佳化資料儲存方式來提高查詢效率和效能。

為了保持一致性而建立索引 (UNIQUE、PRIMARY INDEX)

在 Oracle 中,不重複索引可用於防止表格中出現非不重複索引鍵的資料列。如果程序嘗試插入或更新的資料含有已在索引中出現的值,則該作業會因索引違規而失敗。

由於 BigQuery 不會提供明確的索引,因此您可以改用 MERGE 陳述式,只從暫存資料表中插入唯一記錄到目標資料表,並捨棄重複的記錄。不過,我們無法防止具備編輯權限的使用者插入重複的記錄。

如要在 BigQuery 中產生重複記錄錯誤,您可以使用暫存資料表中的 MERGE 陳述式,如以下範例所示:

OracleBigQuery
CREATE [UNIQUE] INDEX name;MERGE `.FIN_MERGE` t \
USING `.FIN_TEMP_IMPORT` m \
ON t.col1 = m.col1 \
  AND t.col2 = m.col2 \
WHEN MATCHED THEN \
  UPDATE SET t.col1 = ERROR(CONCAT('Encountered Error for ', m.col1, ' ', m.col2)) \
WHEN NOT MATCHED THEN \
  INSERT (col1,col2,col3,col4,col5,col6,col7,col8)
VALUES(col1,col2,col3,col4,col5,col6, CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP());

使用者通常會自行移除重複項目,以便找出下游系統中的錯誤。

BigQuery 不支援 DEFAULTIDENTITY (序列) 欄。

鎖定

BigQuery 沒有 Oracle 的鎖定機制,因此可以執行並行查詢 (最多可達配額)。只有 DML 陳述式具有特定的並行限制,且在某些情況下可能需要在執行期間鎖定資料表

程序 SQL 陳述式

本節說明如何將儲存程序、函式和觸發事件中使用的程序 SQL 陳述式,從 Oracle 轉換為 BigQuery。

CREATE PROCEDURE 陳述式

預存程序是 BigQuery 指令碼 Beta 版的一部分。

OracleBigQuery附註
CREATE PROCEDURECREATE PROCEDURE與 Oracle 類似,BigQuery 支援 IN, OUT, INOUT 引數模式。BigQuery 不支援其他語法規格。
CREATE OR REPLACE PROCEDURECREATE OR REPLACE PROCEDURE
CALLCALL

以下各節說明如何將現有的 Oracle 程序陳述式轉換為功能相似的 BigQuery 指令碼陳述式。

CREATE TRIGGER 陳述式

BigQuery 不會使用觸發事件。以資料列為基礎的應用程式邏輯應在應用程式層處理。在擷取期間使用擷取工具、Pub/Sub 和/或 Cloud Run 函式,或使用定期掃描功能,即可觸發功能。

變數宣告和指派

下表列出 Oracle DECLARE 陳述式及其 BigQuery 對應項目。

OracleBigQuery
DECLARE
  L_VAR NUMBER;
BEGIN
  L_VAR := 10 + 20;
END;
DECLARE L_VAR int64;
BEGIN
  SET L_VAR = 10 + 20;
  SELECT L_VAR;
END
SET var = value;SET var = value;

游標宣告和運算

BigQuery 不支援游標,因此在 BigQuery 中不會使用下列陳述式:

動態 SQL 陳述式

以下是 Oracle 動態 SQL 陳述式及其 BigQuery 對等項目:

OracleBigQuery
EXECUTE IMMEDIATE sql_str

[USING IN OUT [, ...]];

EXECUTE IMMEDIATE

sql_expression [INTO variable[, ...]]

[USING identifier[, ...]];

;

控制流程陳述式

下表列出 Oracle 控制流程陳述式及其 BigQuery 等效項目。

OracleBigQuery
IF condition THEN
  [if_statement_list]
[ELSE
  else_statement_list
]
END IF;
IF condition THEN
  [if_statement_list]
[ELSE
  else_statement_list
]
END IF;
SET SERVEROUTPUT ON;
DECLARE
x INTEGER DEFAULT 0;
y INTEGER DEFAULT 0;
BEGIN
LOOP
  IF x>= 10 THEN
    EXIT;
  ELSIF x>= 5 THEN
     y := 5;
  END IF;
  x := x + 1;
END LOOP;
dbms_output.put_line(x||','||y);
END;
/
DECLARE x INT64 DEFAULT 0;
DECLARE y INT64 DEFAULT 0;
LOOP
  IF x>= 10 THEN
     LEAVE;
  ELSE IF x>= 5 THEN
    SET y = 5;
    END IF;
  END IF;
  SET x = x + 1;
END LOOP;
SELECT x,y;
LOOP
  sql_statement_list
END LOOP;
LOOP
  sql_statement_list
END LOOP;
WHILE boolean_expression DO
  sql_statement_list
END WHILE;
WHILE boolean_expression DO
  sql_statement_list
END WHILE;
FOR LOOPFOR LOOP 不會用於 BigQuery。使用其他 LOOP 陳述式。
BREAKBREAK
CONTINUECONTINUE
CONTINUE/EXIT WHEN使用 CONTINUE 搭配 IF 條件。
GOTOGOTO 陳述式不存在於 BigQuery 中。使用 IF 條件。

中繼資料和交易 SQL 陳述式

OracleBigQuery
GATHER_STATS_JOB尚未在 BigQuery 中使用。
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT;尚未在 BigQuery 中使用。
Alter session set isolation_level=serializable; /

SET TRANSACTION ...

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;

SELECT * FROM V$ACTIVE_SESSION_HISTORY;

BigQuery 沒有傳統的會話概念。您可以在 UI 中查看查詢工作,或將 Stackdriver 稽核記錄匯出至 BigQuery,並分析 BigQuery 記錄以分析工作。詳情請參閱「查看工作詳細資料」。
START TRANSACTION;

LOCK TABLE table_A IN EXCLUSIVE MODE NOWAIT;

DELETE FROM table_A;

INSERT INTO table_A SELECT * FROM table_B;

COMMIT;

將表格內容替換為查詢輸出內容,就等同於執行交易。您可以使用查詢複製作業執行此操作。

使用查詢:

bq query --replace --destination_table table_A 'SELECT * FROM table_B';

使用副本:

bq cp -f table_A table_B

多陳述式和多行 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 資料庫的限制。

限制OracleBigQuery
每個資料庫的資料表數無限制無限制
每個資料表的欄數100010,000
資料列大小上限無限制 (視欄類型而定)100 MB
資料欄和資料表名稱長度如果 v12.2 大於等於 128 個位元組

否則 30 個位元組

16,384 個 Unicode 字元
每個資料表的列數無限制無限制
SQL 要求長度上限無限制1 MB (未解析的 GoogleSQL 查詢長度上限)

12 MB (已解析的舊版和 GoogleSQL 查詢長度上限)

串流:

  • 10 MB (HTTP 要求大小上限)
  • 10,000 (每項要求的資料列數量上限)
要求和回應大小上限無限制10 MB (要求) 和 10 GB (回應),或使用分頁或 Cloud Storage API 時的無限大小。
並行工作階段數量上限受會話或程序參數限制100 個並行查詢 (可透過預留位置增加),每位使用者 300 個並行 API 要求。
並行 (快速) 載入數量上限受會話或程序參數限制沒有並行處理限制,工作會排入佇列。每個專案每日 100,000 個載入工作。

其他 Oracle Database 限制包括資料類型限制物理資料庫限制邏輯資料庫限制程序和執行階段限制