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 会将其向上舍入到整数。对于 BigQuery,尝试将小数存储在定义为 INT64 的列中会导致错误。在这种情况下,应应用 ROUND() 函数。

BigQuery INT64 数据类型最多支持 18 位精度。如果数字字段超过 18 位数字,则应在 BigQuery 中使用 FLOAT64 数据类型。

NUMBER(x) INT64 如果用户尝试存储小数,Oracle 会将其向上舍入到整数。对于 BigQuery,尝试将小数存储在定义为 INT64 的列中会导致错误。在这种情况下,应应用 ROUND() 函数。

BigQuery INT64 数据类型最多支持 18 位精度。如果数字字段超过 18 位数字,则应在 BigQuery 中使用 FLOAT64 数据类型。

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 数据库中使用。

如果需要在 BigQuery 中存储 LONG 数据,可以使用 BigQuery 中的 BYTES 数据类型。更好的方法是将二进制对象放入 Cloud Storage 中,并在 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 WITH LOCAL TIME ZONE 功能。

TIMESTAMP(x) TIMESTAMP BigQuery 支持微秒精度 (10-6),而 Oracle 支持的精度范围为 0 到 9。

BigQuery 支持 TZ 数据库中的时区区域名称和 UTC 时区偏移。

在 BigQuery 中,应手动执行时区转换,以匹配 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能。

TIMESTAMP WITH TIME ZONE TIMESTAMP BigQuery 支持微秒精度 (10-6),而 Oracle 支持的精度范围为 0 到 9。

BigQuery 支持 TZ 数据库中的时区区域名称和 UTC 时区偏移。

在 BigQuery 中,应手动执行时区转换,以匹配 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能。

TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP BigQuery 支持微秒精度 (10-6),而 Oracle 支持的精度范围为 0 到 9。

BigQuery 支持 TZ 数据库中的时区区域名称和 UTC 时区偏移。

在 BigQuery 中,应手动执行时区转换,以匹配 Oracle 的 TIMESTAMP WITH LOCAL TIME ZONE 功能。

INTERVAL YEAR TO MONTH STRING 间隔值可以作为 STRING 数据类型存储在 BigQuery 中。
INTERVAL DAY TO SECOND STRING 间隔值可以作为 STRING 数据类型存储在 BigQuery 中。
RAW BYTES BYTES 数据类型可用于存储长度可变的二进制数据。如果未查询此字段并在分析中使用此字段,则更好的方法是将二进制数据存储在 Cloud Storage 上。
LONG RAW BYTES BYTES 数据类型可用于存储长度可变的二进制数据。如果未查询此字段并在分析中使用此字段,则更好的方法是将二进制数据存储在 Cloud Storage 上。
ROWID STRING 这些数据类型在 Oracle 内部用于指定表中行的唯一地址。通常,应用不应使用 ROWIDUROWID 字段。但是,如果使用了,则您可以使用 STRING 数据类型来保存此数据。

类型格式设置

Oracle SQL 使用一组设置为参数的默认格式来显示表达式和列数据,以及数据类型之间的转换。例如,默认情况下,设置为 YYYY/MM/DDNLS_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 编码存储和返回数据。您可以在 DATETIMESTAMP 函数中设置预期的日期格式或时区。

时间戳和日期类型格式

在将时间戳和日期格式元素从 Oracle 转换为 BigQuery 时,您必须注意 TIMESTAMPDATETIME 之间的时区差异,如下表所述。

请注意,Oracle 格式中没有括号,因为格式 (CURRENT_*) 是关键字而非函数。

Oracle BigQuery 备注
CURRENT_TIMESTAMP Oracle 中的 TIMESTAMP 信息可以具有不同的时区信息(在列定义中使用 WITH TIME ZONE 或设置 TIME_ZONE 变量定义)。 如果可能,请使用 ISO 格式的 CURRENT_TIMESTAMP() 函数。但输出格式始终显示 UTC 时区。(BigQuery 在内部没有时区。)

请注意以下有关 ISO 格式差异的详细信息:

DATETIME 是根据输出渠道惯例设置格式的。在 BigQuery 命令行工具和 BigQuery 控制台中,系统使用符合 RFC 3339 的 T 分隔符设置 DATETIME 格式。但在 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

运算符 说明
"=" 等于
<> 不等于
!= 不等于
> 大于
>= 大于或等于
< 小于
<= 小于或等于
IN ( ) 匹配列表中的值
NOT 否定条件
BETWEEN 在某个范围内(包含边界值)
IS NULL NULL
IS NOT NULL 不是 NULL
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 按位非运算符:~
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)
- 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 按位非运算符:~
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 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_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。或者,您也可以使用 ETL/ELT 工具(例如 Dataflow)进行 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 数据挖矿作业需要重写代码,您可以从 BigQuery ML、AI API(包括 Speech-to-TextText-to-SpeechDialogflowCloud TranslationNLPCloud VisionTimeseries Insights APIAutoMLAutoML TablesAI Platform)等各种 Google AI 产品中进行选择。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 读取操作系统文件,以及向 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

Oracle BigQuery
INSERT INTO table VALUES (...); INSERT INTO table (...) VALUES (...);

Oracle 为不可为 Null 的列提供 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 语句都是在不影响表架构的情况下从表中移除行的方法。BigQuery 中未使用 TRUNCATE。不过,您可以使用 DELETE 语句达到相同的效果。

在 BigQuery 中,DELETE 语句必须具有 WHERE 子句。 如需详细了解 BigQuery 中的 DELETE,请参阅 DML 文档中的 BigQuery DELETE 示例

Oracle BigQuery
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),请参阅以下指南:

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:创建一个存留时间较短的数据集(例如,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 中指定刷新选项(例如,在提交时刷新或按计划刷新)。如需了解详情,请参阅物化视图简介

如果基表仅通过追加不断变化,则使用物化视图的查询(无论视图是由查询优化器显式引用还是选择)会扫描自上次视图刷新以来基表中的所有物化视图和增量。这意味着查询速度更快且费用更低。

相反,如果自上次刷新视图以来,基表中有任何更新操作(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 语句

本部分介绍如何将存储过程、函数和触发器中使用的过程 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
  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 BigQuery 中未使用 FOR LOOP。请使用其他 LOOP 语句。
BREAK BREAK
CONTINUE CONTINUE
CONTINUE/EXIT WHEN CONTINUEIF 条件搭配使用。
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 网页界面中的查询计划说明和槽分配,以及 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 没有传统的会话概念。 您可以在界面中查看查询作业,也可以将 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 字节

否则 30 字节

16384 个 Unicode 字符
每个表的行数 无限制 无限制
SQL 请求长度上限 无限制 1 MB(未解析 GoogleSQL 查询长度上限)

12 MB(已解析旧版和 GoogleSQL 查询长度上限)

流式传输:

  • 10 MB(HTTP 请求大小限制)
  • 10000(每个请求的行数上限)
请求和响应大小上限 无限制 10 MB(请求)和 10 GB(响应),如果您使用分页或 Cloud Storage API,则几乎没有限制。
并发会话数量上限 受会话或进程参数的限制 100 个并发查询(可通过槽预留提高),每位用户 300 次并发 API 请求。
并发(快速)加载数量上限 受会话或进程参数的限制 无并发限制;将任务加入队列。每个项目每天 100,000 项加载作业。

其他 Oracle 数据库限制包括数据类型限制物理数据库限制逻辑数据库限制,以及进程和运行时限制