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 中,這項功能可使用 ROUND() 函式實作。

NUMBER(*, x) NUMERIC BigQuery 不允許使用者指定精確度或比例的自訂值。因此,Oracle 中的資料欄定義可能超出 BigQuery 支援的範圍。

此外,如果小數點後的位數超過對應資料欄的指定位數,Oracle 會先將小數向上進位,再儲存該小數。在 BigQuery 中,這項功能可使用 ROUND() 函式實作。

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

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

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

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

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 資料庫。

如果需要在 BigQuery 中保留 LONG 資料,可以使用 BigQuery 中的 BYTES 資料型別。較好的做法是將二進位物件放在 Cloud Storage 中,並在 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 WITH LOCAL TIME ZONE 功能。

TIMESTAMP(x) TIMESTAMP 相較於 Oracle 支援 0 到 9 的精確度,BigQuery 支援微秒精確度 (10-6)。

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

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

TIMESTAMP WITH TIME ZONE TIMESTAMP 相較於 Oracle 支援 0 到 9 的精確度,BigQuery 支援微秒精確度 (10-6)。

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

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

TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP 相較於 Oracle 支援 0 到 9 的精確度,BigQuery 支援微秒精確度 (10-6)。

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

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

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 會在內部使用這些資料型別,為資料表中的資料列指定專屬位址。一般來說,應用程式不應使用 ROWIDUROWID 欄位。但如果是這種情況,可以使用 STRING 資料型別來保存這項資料。

輸入格式

Oracle SQL 會使用一組預設格式做為參數,顯示運算式和資料欄資料,並在資料類型之間進行轉換。舉例來說,NLS_DATE_FORMAT 預設會將日期格式設為 YYYY/MM/DDYYYY/MM/DD如要進一步瞭解 Oracle 線上說明文件中的 NLS 設定,請參閱該文件。 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_*) 是關鍵字,而非函式。

Oracle BigQuery 附註
CURRENT_TIMESTAMP Oracle 中的 TIMESTAMP 資訊可能具有不同的時區資訊,這些資訊是使用資料欄定義中的 WITH TIME ZONE 或設定 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 傳回時,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

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

BigQuery 和 Oracle 中的資料表運算子相同。

邏輯運算式和函式

Oracle BigQuery
CASE CASE
COALESCE COALESCE(expr1, ..., exprN)
DECODE CASE.. WHEN.. END
NANVL IFNULL
FETCH NEXT> LIMIT
NULLIF NULLIF(expression, expression_to_match)
NVL IFNULL(expr, 0), COALESCE(exp, 0)
NVL2 IF(expr, true_result, else_result)

匯總函式

下表顯示常見的 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)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]

BigQuery 不支援 Oracle 定義的其餘引數。
<codeAPPROX_PERCENTILE_AGG APPROX_QUANTILES(expression, 100)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
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 GROUPING
GROUPING_ID BigQuery 未使用。
LAST 不會隱含於 BigQuery 中。建議使用使用者定義函式
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)
- 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_SLOPE COVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(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
STRING_AGG
ARRAY_CONCAT_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_RANKM
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
PERCENTILE_CONT
PERCENTILE_CONT
PERCENTILE_DISC
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,可以使用

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

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(
  DATE_TRUNC(
    DATE_ADD(
      date_expression,
      INTERVAL 1 MONTH
    ),
  MONTH
  ),
INTERVAL 1 DAY
)
LOCALTIMESTAMP BigQuery 不支援時區設定。
MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEW_TIME DATE(timestamp_expression, time zone)
TIME(timestamp, time zone)
DATETIME(timestamp_expression, time zone)
NEXT_DAY DATE_ADD(
  DATE_TRUNC(
    date_expression,
    WEEK(day_value)
  ),
  INTERVAL 1 WEEK
)
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 可用於比較兩個週期。

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

字串函式

下表顯示 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(
[mod(numeric_expr, 256)]
)
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)]

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

SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4 SUBSTR
TRANSLATE REPLACE
TRANSLATE USING REPLACE
TRIM TRIM
UNISTR CODE_POINTS_TO_STRING
UPPER UPPER
|| (直向長條) CONCAT

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

數學函式

下表列出 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)

CAST(x AS INT64)

BINARY2VARCHAR SAFE_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 專屬的設定。
CONVERT BigQuery 不支援字元集。考慮使用自訂使用者定義函式。
EMPTY_BLOB BLOB 不會用於 BigQuery。
EMPTY_CLOB CLOB 不會用於 BigQuery。
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_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
層級轉換語法可在查詢中用來指示運算式的結果類型應轉換為其他某一類型。
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_EXTRACTJSON_EXTRACT_SCALAR
JSON_MERGEPATCH 自訂使用者定義函式。
JSON_OBJECT BigQuery 不支援。
JSON_OBJECTAGG BigQuery 不支援。
JSON_QUERY 建議使用 UDF 和 JSON_EXTRACTJSON_EXTRACT_SCALAR
JSON_TABLE 自訂使用者定義函式。
JSON_TEXTCONTAINS 建議使用 UDF 和 JSON_EXTRACTJSON_EXTRACT_SCALAR
JSON_VALUE JSON_EXTRACT_SCALAR

XML 函式

BigQuery 不提供隱含 XML 函式。XML 可以字串形式載入 BigQuery,並使用 UDF 剖析 XML。或者,您也可以使用 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 工作需要重寫程式碼,您可以從全面的 Google AI 產品中選擇,例如 BigQuery ML、AI API (包括 Speech-to-TextText-to-SpeechDialogflowCloud TranslationNLPCloud VisionTimeseries Insights API)、AutoMLAutoML TablesAI Platform。資料科學家可以使用 Google 使用者管理的筆記本做為開發環境,並使用 Google AI Platform Training 大規模執行訓練和評分工作負載。下表列出 Oracle ML 函式:

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 不會使用階層式或遞迴查詢。如果階層的深度已知,則可使用聯結達成類似功能,如下例所示。另一個解決方案是使用 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 中的階層式函式。

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_KEYSDO_GEOM_MBRSDO_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 為不可為空值的資料欄提供 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 範例

Oracle BigQuery
DELETE database.table; DELETE FROM table WHERE TRUE;

MERGE 陳述式

MERGE 陳述式可將 INSERTUPDATEDELETE 作業結合成單一 UPSERT 陳述式,並以不可分割的形式執行這些作業。每個目標資料列最多只能對應一個來源資料列。MERGEBigQuery 和 Oracle 都遵循 ANSI 語法。

不過,BigQuery 中的 DML 指令碼與 Oracle 中的對等陳述式相比,一致性語意略有不同。

DDL 語法

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

CREATE TABLE 陳述式

除了下列 BigQuery 未使用的限制和語法元素外,大多數 Oracle CREATE TABLE 陳述式都與 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),請參閱下列指南:

Oracle BigQuery
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 中使用資料欄說明,以類似方式實作這項功能,如下表所示:

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

臨時資料表

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

Oracle BigQuery
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;

BigQuery 不會使用下列 Oracle 元素:

  • 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 陳述式

下表列出 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 中指定重新整理選項 (例如在提交時或排定時間)。詳情請參閱「具體化檢視表簡介」。

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

反之,如果自上次檢視畫面重新整理後,基底資料表有任何更新 (DML UPDATE / MERGE) 或刪除 (DML DELETE、截斷、分割區到期),系統就不會掃描具體化檢視畫面,因此查詢不會節省任何費用,直到下次重新整理檢視畫面為止。基本上,只要基底資料表有任何更新或刪除作業,都會導致具體化檢視區塊狀態失效。

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

下表列出 Oracle 和 BigQuery CREATE MATERIALIZED VIEW 陳述式的對應項目。

Oracle BigQuery 附註
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 陳述式,如下列範例所示:

Oracle BigQuery
CREATE [UNIQUE] INDEX name; MERGE `prototype.FIN_MERGE` t \
USING `prototype.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 陳述式

本節說明如何將 Oracle 儲存程序、函式和觸發程序中使用的程序式 SQL 陳述式轉換為 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 函式,或使用定期掃描功能,觸發相關功能。

變數宣告和指派

下表列出 Oracle DECLARE 陳述式和對應的 BigQuery 陳述式。

Oracle BigQuery
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 對等項目:

Oracle BigQuery
EXECUTE IMMEDIATE sql_str

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

EXECUTE IMMEDIATE

sql_expression [INTO variable[, ...]]

[USING identifier[, ...]];

;

控制流程陳述式

下表列出 Oracle 的流程控制陳述式,以及對應的 BigQuery 陳述式。

Oracle BigQuery
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 LOOP FOR LOOP 不會用於 BigQuery。使用其他 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; /

SET TRANSACTION ...

BigQuery 一律使用快照隔離。詳情請參閱本文的「一致性保證和交易隔離」。
EXPLAIN PLAN ... BigQuery 未使用。

類似功能包括 BigQuery 網頁版 UI 中的查詢計畫說明、時段分配,以及 Stackdriver 中的稽核記錄

SELECT * FROM DBA_[*];

(Oracle DBA_/ALL_/V$ views)

SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;

詳情請參閱「BigQuery INFORMATION_SCHEMA 簡介」。

SELECT * FROM GV$SESSION;

SELECT * FROM V$ACTIVE_SESSION_HISTORY;

BigQuery 沒有傳統的會期概念。您可以在使用者介面中查看查詢工作,也可以將 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 中沒有明確的交易界線,因此 BigQuery 中沒有明確回溯的概念。解決方法是使用資料表修飾符FOR SYSTEM_TIME AS OF

資料庫限制

請查看 BigQuery 的最新配額與限制。如要提高大量使用者的配額,請與 Cloud Customer Care 聯絡。下表比較 Oracle 和 BigQuery 的資料庫限制。

限制 Oracle BigQuery
每個資料庫的資料表數 未限制 未限制
每個資料表的欄數 1000 10,000
資料列大小上限 無上限 (視欄類型而定) 100 MB
資料欄和資料表名稱長度 如果 v12.2>= 128 Bytes

否則為 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 資料庫限制包括資料類型限制實體資料庫限制邏輯資料庫限制,以及程序和執行階段限制