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 是一种近似数据类型。对于 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 中存储 |
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
|
间隔值可以作为 STRING 数据类型存储在 BigQuery 中。 |
INTERVAL DAY TO SECOND
|
STRING
|
间隔值可以作为 STRING 数据类型存储在 BigQuery 中。 |
RAW
|
BYTES
|
BYTES 数据类型可用于存储长度可变的二进制数据。如果未查询此字段并在分析中使用此字段,则更好的方法是将二进制数据存储在 Cloud Storage 上。 |
LONG RAW
|
BYTES
|
BYTES 数据类型可用于存储长度可变的二进制数据。如果未查询此字段并在分析中使用此字段,则更好的方法是将二进制数据存储在 Cloud Storage 上。 |
ROWID
|
STRING
|
这些数据类型在 Oracle 内部用于指定表中行的唯一地址。通常,应用不应使用 ROWID 或 UROWID 字段。但是,如果使用了,则您可以使用 STRING 数据类型来保存此数据。 |
类型格式设置
Oracle SQL 使用一组设置为参数的默认格式来显示表达式和列数据,以及数据类型之间的转换。例如,默认情况下,设置为 YYYY/MM/DD
的 NLS_DATE_FORMAT
会将日期格式设置为 YYYY/MM/DD
。您可以在 Oracle 在线文档中找到有关 NLS 设置的更多信息。在 BigQuery 中,没有初始化参数。
默认情况下,BigQuery 会要求所有源数据在加载时采用 UTF-8 编码。如果您的 CSV 文件包含采用 ISO-8859-1 格式编码的数据,您可以在导入数据时视需要明确指定此编码格式,让 BigQuery 可以在导入过程中将数据正确转换为 UTF-8 格式。
只能导入采用 ISO-8859-1 或 UTF-8 编码的数据。BigQuery 会以 UTF-8 编码存储和返回数据。您可以在 DATE
和 TIMESTAMP
函数中设置预期的日期格式或时区。
时间戳和日期类型格式
在将时间戳和日期格式元素从 Oracle 转换为 BigQuery 时,您必须注意 TIMESTAMP
和 DATETIME
之间的时区差异,如下表所述。
请注意,Oracle 格式中没有括号,因为格式 (CURRENT_*
) 是关键字而非函数。
Oracle | BigQuery | 备注 | |
---|---|---|---|
CURRENT_TIMESTAMP
|
Oracle 中的 TIMESTAMP 信息可以具有不同的时区信息(在列定义中使用 WITH TIME ZONE 或设置 TIME_ZONE 变量定义)。
|
如果可能,请使用 ISO 格式的 CURRENT_TIMESTAMP() 函数。但输出格式始终显示 UTC 时区。(BigQuery 在内部没有时区。)请注意以下有关 ISO 格式差异的详细信息:
如果您想使用明确的格式,请使用 |
|
CURRENT_DATE
|
Oracle 使用 2 种日期类型:
SYSDATE or CURRENT_DATE 返回日期时,Oracle 使用类型 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
。
运算符 | 说明 |
---|---|
"="
|
等于 |
<>
|
不等于 |
!=
|
不等于 |
>
|
大于 |
>=
|
大于或等于 |
<
|
小于 |
<=
|
小于或等于 |
IN ( )
|
匹配列表中的值 |
NOT
|
否定条件 |
BETWEEN
|
在某个范围内(包含边界值) |
IS NULL
|
NULL 值
|
IS NOT NULL
|
不是 NULL 值
|
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 定义的其他参数。 |
<codeAPPROX_PERCENTILE_AGG | APPROX_QUANTILES(expression, 100)[
|
APPROX_PERCENTILE_DETAIL
|
APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
|
APPROX_SUM
|
APPROX_TOP_SUM(expression, weight, number)
|
AVG
|
AVG
|
BIT_COMPLEMENT
|
按位非运算符:~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery 不支持 TYPE AS TABLE OF 。
请考虑在 BigQuery 中使用 STRING_AGG() 或 ARRAY_AGG() 。 |
CORR/CORR_K/
CORR_S
|
CORR
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
FIRST
|
在 BigQuery 中并非隐式存在。考虑使用用户定义的函数 (UDF)。 |
GROUP_ID
|
在 BigQuery 中不适用。 |
GROUPING
|
在 BigQuery 中不适用。 |
GROUPING_ID
|
在 BigQuery 中不使用。 |
LAST
|
在 BigQuery 中并非隐式存在。考虑使用 UDF。 |
LISTAGG
|
STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
|
MAX
|
MAX
|
MIN
|
MIN
|
OLAP_CONDITION
|
特定于 Oracle,BigQuery 中不存在。 |
OLAP_EXPRESSION
|
特定于 Oracle,BigQuery 中不存在。 |
OLAP_EXPRESSION_BOOL
|
特定于 Oracle,BigQuery 中不存在。 |
OLAP_EXPRESSION_DATE
|
特定于 Oracle,BigQuery 中不存在。 |
OLAP_EXPRESSION_TEXT
|
特定于 Oracle,BigQuery 中不存在。 |
OLAP_TABLE
|
特定于 Oracle,BigQuery 中不存在。 |
POWERMULTISET
|
特定于 Oracle,BigQuery 中不存在。 |
POWERMULTISET_BY_CARDINALITY
|
特定于 Oracle,BigQuery 中不存在。 |
QUALIFY
|
特定于 Oracle,BigQuery 中不存在。 |
REGR_AVGX
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, ind_var_expr) )
|
REGR_AVGY
|
AVG( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, dep_var_expr) )
|
REGR_COUNT
|
SUM( IF(dep_var_expr is NULL OR ind_var_expr is NULL, NULL, 1) )
|
REGR_INTERCEPT
|
AVG(dep_var_expr)
|
REGR_R2
|
(COUNT(dep_var_expr) *
|
REGR_SLOPE
|
COVAR_SAMP(ind_var_expr,
|
REGR_SXX
|
SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
|
REGR_SXY
|
SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
|
REGR_SYY
|
SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
|
ROLLUP
|
ROLLUP
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
WM_CONCAT
|
STRING_AGG
|
BigQuery 还提供以下其他聚合函数:
分析函数
下表列出了常见的 Oracle 分析和聚合分析函数与其 BigQuery 等效函数之间的对应关系。
Oracle | BigQuery |
---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
按位非运算符:~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
BOOL_TO_INT
|
CAST(X AS INT64)
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
CUBE_TABLE
|
BigQuery 不支持。请考虑使用 BI 工具或自定义 UDF。 |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF 和 BigQuery ML。 |
FEATURE_DETAILS
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF 和 BigQuery ML。 |
FEATURE_ID
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF 和 BigQuery ML。 |
FEATURE_SET
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF 和 BigQuery ML。 |
FEATURE_VALUE
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF 和 BigQuery ML。 |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
BigQuery 不支持分层查询。 |
HIER_CHILD_COUNT
|
BigQuery 不支持分层查询。 |
HIER_COLUMN
|
BigQuery 不支持分层查询。 |
HIER_DEPTH
|
BigQuery 不支持分层查询。 |
HIER_DESCRIPTION
|
BigQuery 不支持分层查询。 |
HIER_HAS_CHILDREN
|
BigQuery 不支持分层查询。 |
HIER_LEVEL
|
BigQuery 不支持分层查询。 |
HIER_MEMBER_NAME
|
BigQuery 不支持分层查询。 |
HIER_ORDER
|
BigQuery 不支持分层查询。 |
HIER_UNIQUE_MEMBER_NAME
|
BigQuery 不支持分层查询。 |
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
LISTAGG
|
ARRAY_AGG
|
MATCH_NUMBER
|
您可以在 BigQuery 中使用正则表达式和 UDF 进行模式识别和计算 |
MATCH_RECOGNIZE
|
您可以在 BigQuery 中使用正则表达式和 UDF 进行模式识别和计算 |
MAX
|
MAX
|
MEDIAN
|
PERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
|
MIN
|
MIN
|
NTH_VALUE
|
NTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
|
NTILE
|
NTILE(constant_integer_expression)
|
PERCENT_RANK
|
PERCENT_RANK
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_CONT
|
PERCENTILE_DISC
|
PRESENTNNV
|
特定于 Oracle,BigQuery 中不存在。 |
PRESENTV
|
特定于 Oracle,BigQuery 中不存在。 |
PREVIOUS
|
特定于 Oracle,BigQuery 中不存在。 |
RANK (ANSI)
|
RANK
|
RATIO_TO_REPORT(expr) OVER (partition clause)
|
expr / SUM(expr) OVER (partition clause)
|
ROW_NUMBER
|
ROW_NUMBER
|
STDDEV_POP
|
STDDEV_POP
|
STDDEV_SAMP
|
STDDEV_SAMP, STDDEV
|
SUM
|
SUM
|
VAR_POP
|
VAR_POP
|
VAR_SAMP
|
VAR_SAMP, VARIANCE
|
VARIANCE
|
VARIANCE()
|
WIDTH_BUCKET
|
可以使用 UDF。 |
日期/时间函数
下表展示了常见的 Oracle 日期/时间函数与其 BigQuery 等效项之间的对应关系。
Oracle | BigQuery |
---|---|
ADD_MONTHS(date, integer)
|
DATE_ADD(date, INTERVAL integer MONTH), 如果日期是 TIMESTAMP ,您可以使用
|
CURRENT_DATE
|
CURRENT_DATE
|
CURRENT_TIME
|
CURRENT_TIME
|
CURRENT_TIMESTAMP
|
CURRENT_TIMESTAMP
|
DATE - k
|
DATE_SUB(date_expression, INTERVAL k DAY)
|
DATE + k
|
DATE_ADD(date_expression, INTERVAL k DAY)
|
DBTIMEZONE
|
BigQuery 不支持数据库时区。 |
EXTRACT
|
EXTRACT(DATE), EXTRACT(TIMESTAMP)
|
LAST_DAY
|
DATE_SUB(
|
LOCALTIMESTAMP
|
BigQuery 不支持时区设置。 |
MONTHS_BETWEEN
|
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEW_TIME
|
DATE(timestamp_expression, time zone)
|
NEXT_DAY
|
DATE_ADD(
|
SYS_AT_TIME_ZONE
|
CURRENT_DATE([time_zone])
|
SYSDATE
|
CURRENT_DATE()
|
SYSTIMESTAMP
|
CURRENT_TIMESTAMP()
|
TO_DATE
|
PARSE_DATE
|
TO_TIMESTAMP
|
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ
|
PARSE_TIMESTAMP
|
TZ_OFFSET
|
BigQuery 不支持。请考虑使用自定义 UDF。 |
WM_CONTAINS WM_EQUALS WM_GREATERTHAN WM_INTERSECTION WM_LDIFF WM_LESSTHAN WM_MEETS WM_OVERLAPS WM_RDIFF |
BigQuery 中不使用时间段。UDF 可用于比较两个时间段。 |
BigQuery 还提供以下日期/时间函数:
CURRENT_DATETIME
DATE_FROM_UNIX_DATE
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
FORMAT_DATE
FORMAT_DATETIME
字符串函数
下表展示了 Oracle 字符串函数与其 BigQuery 等效项之间的对应关系:
Oracle | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
BigQuery 不支持 UTF-16 |
RAWTOHEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING(
|
COLLATION
|
在 BigQuery 中不存在。BigQuery 不支持在 DML 中使用 COLLATE |
COMPOSE
|
自定义用户定义的函数。 |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
自定义用户定义的函数。 |
ESCAPE_REFERENCE (UTL_I18N)
|
BigQuery 不支持。请考虑使用用户定义的函数。 |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
自定义用户定义的函数。 |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
自定义用户定义的函数。 |
NLS_LOWER
|
LOWER
|
NLS_UPPER
|
UPPER
|
NLSSORT
|
特定于 Oracle,BigQuery 中不存在。 |
POSITION
|
STRPOS(string, substring)
|
PRINTBLOBTOCLOB
|
特定于 Oracle,BigQuery 中不存在。 |
REGEXP_COUNT
|
ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
|
REGEXP_INSTR
|
STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))
注意:返回第一个发生实例。 |
REGEXP_REPLACE
|
REGEXP_REPLACE
|
REGEXP_LIKE
|
IF(REGEXP_CONTAINS,1,0)
|
REGEXP_SUBSTR
|
REGEXP_EXTRACT, REGEXP_EXTRACT_ALL
|
REPLACE
|
REPLACE
|
REVERSE
|
REVERSE
|
RIGHT
|
SUBSTR(source_string, -1, length)
|
RPAD
|
RPAD
|
RTRIM
|
RTRIM
|
SOUNDEX
|
BigQuery 不支持。请考虑使用自定义 UDF。 |
STRTOK
|
SPLIT(instring, delimiter)[ORDINAL(tokennum)]
|
SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4
|
SUBSTR
|
TRANSLATE
|
REPLACE
|
TRANSLATE USING
|
REPLACE
|
TRIM
|
TRIM
|
UNISTR
|
CODE_POINTS_TO_STRING
|
UPPER
|
UPPER
|
|| (竖线)
|
CONCAT
|
BigQuery 还提供以下字符串函数:
BYTE_LENGTH
CODE_POINTS_TO_BYTES
ENDS_WITH
FROM_BASE32
FROM_BASE64
FROM_HEX
NORMALIZE
NORMALIZE_AND_CASEFOLD
REPEAT
SAFE_CONVERT_BYTES_TO_STRING
SPLIT
STARTS_WITH
STRPOS
TO_BASE32
TO_BASE64
TO_CODE_POINTS
数学函数
下表展示了 Oracle 数学函数与其 BigQuery 等效项之间的对应关系。
Oracle | BigQuery |
---|---|
ABS
|
ABS
|
ACOS
|
ACOS
|
ACOSH
|
ACOSH
|
ASIN
|
ASIN
|
ASINH
|
ASINH
|
ATAN
|
ATAN
|
ATAN2
|
ATAN2
|
ATANH
|
ATANH
|
CEIL
|
CEIL
|
CEILING
|
CEILING
|
COS
|
COS
|
COSH
|
COSH
|
EXP
|
EXP
|
FLOOR
|
FLOOR
|
GREATEST
|
GREATEST
|
LEAST
|
LEAST
|
LN
|
LN
|
LNNVL
|
与 ISNULL 配合使用 |
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
BigQuery 不支持。请考虑使用自定义 UDF 和 RAND 函数。 |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
BigQuery 不支持。请考虑使用自定义 UDF 和 RAND 函数。 |
REMAINDER
|
MOD
|
ROUND
|
ROUND
|
ROUND_TIES_TO_EVEN
|
ROUND()
|
SIGN
|
SIGN
|
SIN
|
SIN
|
SINH
|
SINH
|
SQRT
|
SQRT
|
STANDARD_HASH
|
FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
|
STDDEV
|
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,不需要。 | |
CONVERT
|
BigQuery 不支持字符集。考虑使用自定义用户定义的函数。 | |
EMPTY_BLOB
|
BigQuery 中未使用 BLOB 。
|
|
EMPTY_CLOB
|
BigQuery 中未使用 CLOB 。
|
|
FROM_TZ
|
BigQuery 不支持带有时区的时间类型。请考虑使用用户定义的函数和 FORMAT_TIMESTAMP。 | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
在 BigQuery 中并非隐式存在。请考虑使用 UDF。 | |
NCHR
|
UDF 可用于获取二进制字符等效值 | |
NUMTODSINTERVAL
|
BigQuery 不支持 INTERVAL 数据类型
|
|
NUMTOHEX
|
BigQuery 不支持。请考虑使用自定义 UDF 和 TO_HEX 函数。 |
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
BigQuery 不支持 INTERVAL 数据类型。
|
|
RAW_TO_CHAR
|
特定于 Oracle,BigQuery 中不存在。 | |
RAW_TO_NCHAR
|
特定于 Oracle,BigQuery 中不存在。 | |
RAW_TO_VARCHAR2
|
特定于 Oracle,BigQuery 中不存在。 | |
RAWTOHEX
|
特定于 Oracle,BigQuery 中不存在。 | |
RAWTONHEX
|
特定于 Oracle,BigQuery 中不存在。 | |
RAWTONUM
|
特定于 Oracle,BigQuery 中不存在。 | |
RAWTONUM2
|
特定于 Oracle,BigQuery 中不存在。 | |
RAWTOREF
|
特定于 Oracle,BigQuery 中不存在。 | |
REFTOHEX
|
特定于 Oracle,BigQuery 中不存在。 | |
REFTORAW
|
特定于 Oracle,BigQuery 中不存在。 | |
ROWIDTOCHAR
|
ROWID 是 Oracle 专属类型,在 BigQuery 中不存在。此值应表示为字符串。 |
|
ROWIDTONCHAR
|
ROWID 是 Oracle 专属类型,在 BigQuery 中不存在。此值应表示为字符串。 |
|
SCN_TO_TIMESTAMP
|
SCN 是 Oracle 专属类型,在 BigQuery 中不存在。此值应表示为时间戳。 |
|
TO_ACLID TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename) PARSE_DATE PARSE_TIMESTAMP 类型转换语法在查询中使用,用于指示表达式的结果类型应转换成其他某种类型。 |
|
TREAT
|
特定于 Oracle,BigQuery 中不存在。 | |
VALIDATE_CONVERSION
|
BigQuery 不支持。请考虑使用自定义 UDF。 | |
VSIZE
|
BigQuery 不支持。请考虑使用自定义 UDF。 |
JSON 函数
下表展示了 Oracle JSON 函数与其 BigQuery 等效项之间的对应关系。
Oracle | BigQuery |
---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
请考虑使用 UDF 和 TO_JSON_STRING 函数 |
JSON_ARRAYAGG
|
请考虑使用 UDF 和 TO_JSON_STRING 函数 |
JSON_DATAGUIDE
|
自定义用户定义的函数。 |
JSON_EQUAL
|
自定义用户定义的函数。 |
JSON_EXIST
|
请考虑使用 UDF 以及 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR |
JSON_MERGEPATCH
|
自定义用户定义的函数。 |
JSON_OBJECT
|
BigQuery 不支持。 |
JSON_OBJECTAGG
|
BigQuery 不支持。 |
JSON_QUERY
|
请考虑使用 UDF 以及 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 。 |
JSON_TABLE
|
自定义用户定义的函数。 |
JSON_TEXTCONTAINS
|
请考虑使用 UDF 以及 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 。 |
JSON_VALUE
|
JSON_EXTRACT_SCALAR
|
XML 函数
BigQuery 不提供隐式 XML 函数。XML 可以作为字符串加载到 BigQuery 中,UDF 可用于解析 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-Text、Text-to-Speech、Dialogflow、Cloud Translation、NLP、Cloud Vision、Timeseries Insights API、AutoML、AutoML Tables 或 AI Platform)等各种 Google AI 产品中进行选择。Google 用户管理的笔记本可用作数据科学家的开发环境,Google AI Platform Training 可用于大规模运行训练和打分工作负载。下表显示了 Oracle ML 函数:
Oracle | BigQuery |
---|---|
CLASSIFIER
|
如需了解机器学习分类器和回归选项,请参阅 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 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 读取操作系统文件,以及向 PL/SQL 写入操作系统文件。Cloud Storage 可用于任何类型的原始文件暂存。应使用外部表以及 BigQuery 加载和导出功能对 Cloud Storage 执行文件读写操作。如需了解详情,请参阅外部数据源简介。
空间函数
您可以使用 BigQuery 地理空间分析来替换空间功能。Oracle 中有 SDO_*
函数和类型,例如 SDO_GEOM_KEY
、SDO_GEOM_MBR
、SDO_GEOM_MMB
。这些函数用于空间分析。您可以使用地理空间分析来进行空间分析。
DML 语法
本部分介绍了 Oracle 和 BigQuery 在数据管理语言语法上的差异。
INSERT
语句
大多数 Oracle INSERT
语句都与 BigQuery 兼容。下表显示了例外情况。
BigQuery 中 DML 脚本的一致性语义与 Oracle 中的等效语句略有不同。如需简要了解快照隔离以及会话和事务处理,请参阅本文档其他位置的 CREATE [UNIQUE] INDEX
section
。
Oracle | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle 为不可为 Null 的列提供 注意:在 BigQuery 中,只有在目标表中所有列的值根据其顺序位置按升序排列添加时,才在 |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
BigQuery 设有 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 中不使用以下限制条件和语法元素:
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 (
|
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 中模拟临时表:
- 数据集 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
|
CREATE MATERIALIZED VIEW
|
CREATE [UNIQUE] INDEX
语句
本部分介绍在 BigQuery 中创建与 Oracle 中的索引类似的功能的方法。
为确保性能而进行索引
由于 BigQuery 是一个面向列的数据库,具有查询和存储优化功能,因此不需要显式索引。BigQuery 提供分区和集群以及嵌套字段等功能,可通过优化数据存储方式提高查询效率和性能。
为确保一致性而进行索引(UNIQUE、PRIMARY INDEX)
在 Oracle 中,可以使用唯一索引来防止表中包含存在非唯一键的行。如果进程尝试插入或更新具有已编入索引的值的数据,则该操作会因索引违规失败。
由于 BigQuery 不提供显式索引,因此可以使用 MERGE
语句仅将暂存表中的唯一记录插入目标表,同时舍弃重复记录。但是,无法阻止具有修改权限的用户插入重复记录。
要在 BigQuery 中生成重复记录错误,您可以使用暂存表中的 MERGE
语句,如以下示例所示:
Oracle | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
通常情况下,用户更愿意单独删除重复项,以发现下游系统中的错误。
BigQuery 不支持 DEFAULT
和 IDENTITY
(序列)列。
锁定
BigQuery 没有 Oracle 这样的锁定机制,可以运行并发查询(不超过您的配额)。只有 DML 语句具有特定的并发限制,在某些情况下可能需要在执行期间进行表锁定。
过程 SQL 语句
本部分介绍如何将存储过程、函数和触发器中使用的过程 SQL 语句从 Oracle 转换为 BigQuery。
CREATE PROCEDURE
语句
存储过程作为 BigQuery 脚本测试版的一部分受支持。
Oracle | BigQuery | 备注 |
---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
与 Oracle 类似,BigQuery 支持 IN, OUT, INOUT 参数模式。BigQuery 不支持其他语法规范。
|
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
以下部分介绍了将现有 Oracle 过程语句转换为具有类似功能的 BigQuery 脚本语句的方法。
CREATE TRIGGER
语句
BigQuery 中不使用触发器。基于行的应用逻辑应在应用层处理。触发器功能可以在注入期间利用注入工具、Pub/Sub 和/或 Cloud Run functions 或者利用定期扫描来实现。
变量声明和赋值
下表显示了 Oracle DECLARE
语句及其 BigQuery 等效项。
Oracle | BigQuery |
---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
游标声明和操作
BigQuery 不支持游标,因此 BigQuery 中不使用以下语句:
DECLARE cursor_name CURSOR [FOR | WITH] ...
OPEN CUR_VAR FOR sql_str;
OPEN cursor_name [USING var, ...];
FETCH cursor_name INTO var, ...;
CLOSE cursor_name;
动态 SQL 语句
以下 Oracle 动态 SQL 语句及其 BigQuery 等效语句:
Oracle | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str
|
EXECUTE IMMEDIATE
|
控制流语句
下表显示了 Oracle 控制流语句及其在 BigQuery 中的等效语句。
Oracle | BigQuery |
---|---|
IF condition THEN
|
IF condition THEN
|
SET SERVEROUTPUT ON;
|
DECLARE x INT64 DEFAULT 0;
|
LOOP
|
LOOP
|
WHILE boolean_expression DO
|
WHILE boolean_expression DO
|
FOR LOOP
|
BigQuery 中未使用 FOR LOOP 。请使用其他 LOOP 语句。 |
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
将 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 网页界面中的查询计划说明和槽分配,以及 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 中没有明确的事务边界,因此 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(请求)和 10 GB(响应),如果您使用分页或 Cloud Storage API,则几乎没有限制。 |
并发会话数量上限 | 受会话或进程参数的限制 | 100 个并发查询(可通过槽预留提高),每位用户 300 次并发 API 请求。 |
并发(快速)加载数量上限 | 受会话或进程参数的限制 | 无并发限制;将任务加入队列。每个项目每天 100,000 项加载作业。 |
其他 Oracle 数据库限制包括数据类型限制、物理数据库限制、逻辑数据库限制,以及进程和运行时限制。