Guía de traducción de SQL de Oracle
En este documento se detallan las similitudes y las diferencias entre las sintaxis SQL de Oracle y BigQuery para ayudarte a planificar tu migración. Usa la traducción de SQL por lotes para migrar tus secuencias de comandos de SQL en bloque o la traducción de SQL interactiva para traducir consultas puntuales.
Tipos de datos
En esta sección se muestran las equivalencias entre los tipos de datos de Oracle y BigQuery.
Oracle | BigQuery | Notas |
---|---|---|
VARCHAR2
|
STRING
|
|
NVARCHAR2
|
STRING
|
|
CHAR
|
STRING
|
|
NCHAR
|
STRING
|
|
CLOB
|
STRING
|
|
NCLOB
|
STRING
|
|
INTEGER
|
INT64
|
|
SHORTINTEGER
|
INT64
|
|
LONGINTEGER
|
INT64
|
|
NUMBER
|
NUMERIC
|
BigQuery no permite que los usuarios especifiquen valores personalizados para la precisión o la escala. Por lo tanto, una columna de Oracle puede definirse de forma que tenga una escala mayor de la que admite BigQuery.
Además, antes de almacenar un número decimal, Oracle lo redondea si tiene más dígitos después del decimal de los que se han especificado en la columna correspondiente. En BigQuery, esta función se puede implementar con la función |
NUMBER(*, x)
|
NUMERIC
|
BigQuery no permite que los usuarios especifiquen valores personalizados para la precisión o la escala. Por lo tanto, una columna de Oracle puede definirse de forma que tenga una escala mayor de la que admite BigQuery.
Además, antes de almacenar un número decimal, Oracle lo redondea si tiene más dígitos después del decimal de los que se han especificado en la columna correspondiente. En BigQuery, esta función se puede implementar con la función |
NUMBER(x, -y)
|
INT64
|
Si un usuario intenta almacenar un número decimal, Oracle lo redondea al número entero más próximo. En BigQuery, si se intenta almacenar un número decimal en una columna definida como INT64 , se produce un error. En este caso, se debe aplicar la función ROUND() .
Los tipos de datos |
NUMBER(x)
|
INT64
|
Si un usuario intenta almacenar un número decimal, Oracle lo redondea al número entero más próximo. En BigQuery, si se intenta almacenar un número decimal en una columna definida como INT64 , se produce un error. En este caso, se debe aplicar la función ROUND() .
Los tipos de datos |
FLOAT
|
FLOAT64 /NUMERIC
|
FLOAT es un tipo de datos exacto y un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser más adecuado para el tipo FLOAT en BigQuery.
|
BINARY_DOUBLE
|
FLOAT64 /NUMERIC
|
FLOAT es un tipo de datos exacto y un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser más adecuado para el tipo FLOAT en BigQuery.
|
BINARY_FLOAT
|
FLOAT64 /NUMERIC
|
FLOAT es un tipo de datos exacto y un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser más adecuado para el tipo FLOAT en BigQuery.
|
LONG
|
BYTES
|
El tipo de datos LONG se usa en versiones anteriores y no se recomienda en las nuevas versiones de Oracle Database.
El tipo de datos |
BLOB
|
BYTES
|
El tipo de datos BYTES se puede usar para almacenar datos binarios de longitud variable. Si este campo no se consulta ni se usa en las analíticas, es mejor almacenar los datos binarios en Cloud Storage.
|
BFILE
|
STRING
|
Los archivos binarios se pueden almacenar en Cloud Storage y se puede usar el tipo de datos STRING para hacer referencia a los archivos de una tabla de BigQuery.
|
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
BigQuery admite una precisión de microsegundos (10-6), mientras que Oracle admite una precisión que va de 0 a 9.
BigQuery admite el nombre de una región de zona horaria de una base de datos TZ y el desfase de zona horaria con respecto a UTC.
En BigQuery, la conversión de la zona horaria debe realizarse manualmente para que coincida con la función |
TIMESTAMP(x)
|
TIMESTAMP
|
BigQuery admite una precisión de microsegundos (10-6), mientras que Oracle admite una precisión que va de 0 a 9.
BigQuery admite el nombre de una región de zona horaria de una base de datos TZ y el desfase de zona horaria con respecto a UTC.
En BigQuery, la conversión de la zona horaria debe realizarse manualmente para que coincida con la función |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
BigQuery admite una precisión de microsegundos (10-6), mientras que Oracle admite una precisión que va de 0 a 9.
BigQuery admite el nombre de una región de zona horaria de una base de datos TZ y el desfase de zona horaria con respecto a UTC.
En BigQuery, la conversión de la zona horaria debe realizarse manualmente para que coincida con la función |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
BigQuery admite una precisión de microsegundos (10-6), mientras que Oracle admite una precisión que va de 0 a 9.
BigQuery admite el nombre de una región de zona horaria de una base de datos TZ y el desfase de zona horaria con respecto a UTC.
En BigQuery, la conversión de la zona horaria debe realizarse manualmente para que coincida con la función |
INTERVAL YEAR TO MONTH
|
STRING
|
Los valores de intervalo se pueden almacenar como tipo de datos STRING en BigQuery.
|
INTERVAL DAY TO SECOND
|
STRING
|
Los valores de intervalo se pueden almacenar como tipo de datos STRING en BigQuery.
|
RAW
|
BYTES
|
El tipo de datos BYTES se puede usar para almacenar datos binarios de longitud variable. Si este campo no se consulta ni se usa en las analíticas, es mejor almacenar los datos binarios en Cloud Storage.
|
LONG RAW
|
BYTES
|
El tipo de datos BYTES se puede usar para almacenar datos binarios de longitud variable. Si este campo no se consulta ni se usa en las analíticas, es mejor almacenar los datos binarios en Cloud Storage.
|
ROWID
|
STRING
|
Oracle usa estos tipos de datos internamente para especificar direcciones únicas a las filas de una tabla. Por lo general, no se deben usar los campos ROWID ni UROWID en las aplicaciones. Sin embargo, si es así, se puede usar el tipo de datos STRING para almacenar estos datos.
|
Formato de tipo
Oracle SQL usa un conjunto de formatos predeterminados definidos como parámetros para mostrar expresiones y datos de columnas, así como para realizar conversiones entre tipos de datos. Por ejemplo, NLS_DATE_FORMAT
se define como YYYY/MM/DD
, que da formato a las fechas como YYYY/MM/DD
de forma predeterminada. Puede consultar más información sobre los ajustes de NLS en la documentación online de Oracle.
En BigQuery, no hay parámetros de inicialización.
De forma predeterminada, BigQuery espera que todos los datos de origen estén codificados en UTF-8 al cargarlos. Si tiene archivos CSV con datos codificados en formato ISO-8859-1, puede especificar explícitamente la codificación al importar los datos para que BigQuery pueda convertirlos correctamente a UTF-8 durante el proceso de importación.
Solo se pueden importar datos codificados en ISO-8859-1 o UTF-8. BigQuery almacena y devuelve los datos codificados en UTF-8.
El formato de fecha o la zona horaria que se quiera usar se pueden definir en las funciones DATE
y TIMESTAMP
.
Formato de tipo de fecha y hora
Cuando convierta elementos de formato de marca de tiempo y de fecha de Oracle a BigQuery, debe tener en cuenta las diferencias de zona horaria entre TIMESTAMP
y DATETIME
, tal como se resume en la siguiente tabla.
Ten en cuenta que no hay paréntesis en los formatos de Oracle porque los formatos (CURRENT_*
) son palabras clave, no funciones.
Oracle | BigQuery | Notas | |
---|---|---|---|
CURRENT_TIMESTAMP
|
La información de TIMESTAMP en Oracle puede tener información de zona horaria diferente, que se define mediante WITH TIME ZONE en la definición de columna o en la variable TIME_ZONE .
|
Si es posible, usa la función CURRENT_TIMESTAMP() , que tiene el formato ISO. Sin embargo, el formato de salida siempre muestra la zona horaria UTC. (Internamente, BigQuery no tiene una zona horaria).
Ten en cuenta los siguientes detalles sobre las diferencias en el formato ISO:
Si quieres usar un formato explícito, usa la función |
|
CURRENT_DATE
|
Oracle usa dos tipos de datos para las fechas:
SYSDATE or CURRENT_DATE devuelve a.
|
BigQuery tiene un formato DATE independiente que siempre devuelve una fecha en formato ISO 8601.
No se puede usar |
|
CURRENT_DATE-3
|
Los valores de fecha se representan como números enteros. Oracle admite operadores aritméticos para los tipos de fecha. | En el caso de los tipos de fecha, usa DATE_ADD () o DATE_SUB ().
BigQuery usa operadores aritméticos para los tipos de datos: INT64 , NUMERIC y FLOAT64 .
|
|
NLS_DATE_FORMAT
|
Define el formato de fecha de la sesión o del sistema. | BigQuery siempre usa ISO 8601, así que asegúrate de convertir las fechas y horas de Oracle. |
Sintaxis de consulta
En esta sección se abordan las diferencias en la sintaxis de las consultas entre Oracle y BigQuery.
SELECT
extractos
La mayoría de las instrucciones de Oracle SELECT
son compatibles con BigQuery.
Funciones, operadores y expresiones
En las siguientes secciones se enumeran las asignaciones entre las funciones de Oracle y sus equivalentes en BigQuery.
Operadores de comparación
Los operadores de comparación de Oracle y BigQuery cumplen el estándar ANSI SQL:2011. Los operadores de comparación de la tabla siguiente son los mismos en BigQuery y en Oracle. Puedes usar
REGEXP_CONTAINS
en lugar de REGEXP_LIKE
en BigQuery.
Operador | Descripción |
---|---|
"="
|
Igual |
<>
|
No es igual |
!=
|
No es igual |
>
|
Mayor que |
>=
|
Igual o mayor |
<
|
Menos de |
<=
|
Menor o igual |
IN ( )
|
Coincide con un valor de una lista |
NOT
|
Niega una condición |
BETWEEN
|
Dentro de un intervalo (incluido) |
IS NULL
|
NULL value
|
IS NOT NULL
|
No NULL value
|
LIKE
|
Coincidencia de patrones con % |
EXISTS
|
La condición se cumple si la subconsulta devuelve al menos una fila |
Los operadores de la tabla son los mismos tanto en BigQuery como en Oracle.
Expresiones y funciones lógicas
Funciones de agregación
En la siguiente tabla se muestran las asignaciones entre las funciones de agregación comunes, de agregación estadística y de agregación aproximada de Oracle con sus equivalentes en BigQuery:
Oracle | BigQuery |
---|---|
ANY_VALUE (desde 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 no admite el resto de los argumentos que define 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
|
Operador NOT bit a bit: ~ |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery no admite TYPE AS TABLE OF .
Considera la posibilidad de usar STRING_AGG() o ARRAY_AGG() en BigQuery
|
CORR/CORR_K/
CORR_S
|
CORR
|
COUNT
|
COUNT
|
COVAR_POP
|
COVAR_POP
|
COVAR_SAMP
|
COVAR_SAMP
|
FIRST
|
No existe de forma implícita en BigQuery. Te recomendamos que uses funciones definidas por el usuario (UDF). |
GROUP_ID
|
No se usa en BigQuery. |
GROUPING
|
GROUPING
|
GROUPING_ID
|
No se usa en BigQuery. |
LAST
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar funciones definidas por el usuario (UDF). |
LISTAGG
|
STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
|
MAX
|
MAX
|
MIN
|
MIN
|
OLAP_CONDITION
|
Específico de Oracle, no existe en BigQuery. |
OLAP_EXPRESSION
|
Específico de Oracle, no existe en BigQuery. |
OLAP_EXPRESSION_BOOL
|
Específico de Oracle, no existe en BigQuery. |
OLAP_EXPRESSION_DATE
|
Específico de Oracle, no existe en BigQuery. |
OLAP_EXPRESSION_TEXT
|
Específico de Oracle, no existe en BigQuery. |
OLAP_TABLE
|
Específico de Oracle, no existe en BigQuery. |
POWERMULTISET
|
Específico de Oracle, no existe en BigQuery. |
POWERMULTISET_BY_CARDINALITY
|
Específico de Oracle, no existe en BigQuery. |
QUALIFY
|
Específico de Oracle, no existe en 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 ofrece las siguientes funciones de agregación adicionales:
Funciones analíticas
En la siguiente tabla se muestran las asignaciones entre las funciones analíticas y de agregación analíticas de Oracle más habituales y sus equivalentes en BigQuery.
Oracle | BigQuery |
---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
Operador NOT bit a bit: ~ |
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
|
No se admite en BigQuery. Usar una herramienta de BI o una función definida por el usuario personalizada |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar UDFs y BigQuery ML |
FEATURE_DETAILS
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar UDFs y BigQuery ML |
FEATURE_ID
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar UDFs y BigQuery ML |
FEATURE_SET
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar UDFs y BigQuery ML |
FEATURE_VALUE
|
No existe de forma implícita en BigQuery. Considera la posibilidad de usar UDFs y BigQuery ML |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
BigQuery no admite consultas jerárquicas. |
HIER_CHILD_COUNT
|
BigQuery no admite consultas jerárquicas. |
HIER_COLUMN
|
BigQuery no admite consultas jerárquicas. |
HIER_DEPTH
|
BigQuery no admite consultas jerárquicas. |
HIER_DESCRIPTION
|
BigQuery no admite consultas jerárquicas. |
HIER_HAS_CHILDREN
|
BigQuery no admite consultas jerárquicas. |
HIER_LEVEL
|
BigQuery no admite consultas jerárquicas. |
HIER_MEMBER_NAME
|
BigQuery no admite consultas jerárquicas. |
HIER_ORDER
|
BigQuery no admite consultas jerárquicas. |
HIER_UNIQUE_MEMBER_NAME
|
BigQuery no admite consultas jerárquicas. |
LAST_VALUE
|
LAST_VALUE
|
LAG
|
LAG
|
LEAD
|
LEAD
|
LISTAGG
|
ARRAY_AGG
|
MATCH_NUMBER
|
El reconocimiento y el cálculo de patrones se pueden realizar con expresiones regulares y FDU en BigQuery |
MATCH_RECOGNIZE
|
El reconocimiento y el cálculo de patrones se pueden realizar con expresiones regulares y FDU en BigQuery |
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
|
Específico de Oracle, no existe en BigQuery. |
PRESENTV
|
Específico de Oracle, no existe en BigQuery. |
PREVIOUS
|
Específico de Oracle, no existe en 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
|
Se puede usar una función definida por el usuario. |
Funciones de fecha y hora
En la siguiente tabla se muestran las asignaciones entre las funciones de fecha y hora de Oracle más habituales y sus equivalentes en BigQuery.
Oracle | BigQuery |
---|---|
ADD_MONTHS(date, integer)
|
DATE_ADD(date, INTERVAL integer MONTH), Si la fecha es un TIMESTAMP , puedes usar
|
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 no admite la zona horaria de la base de datos. |
EXTRACT
|
EXTRACT(DATE), EXTRACT(TIMESTAMP)
|
LAST_DAY
|
DATE_SUB(
|
LOCALTIMESTAMP
|
BigQuery no admite la configuración de zonas horarias. |
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
|
No se admite en BigQuery. Considera la posibilidad de usar una función definida por el usuario personalizada. |
WM_CONTAINS WM_EQUALS WM_GREATERTHAN WM_INTERSECTION WM_LDIFF WM_LESSTHAN WM_MEETS WM_OVERLAPS WM_RDIFF |
En BigQuery no se usan puntos. Las funciones definidas por el usuario se pueden usar para comparar dos periodos. |
BigQuery ofrece las siguientes funciones de fecha y hora adicionales:
CURRENT_DATETIME
DATE_FROM_UNIX_DATE
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
FORMAT_DATE
FORMAT_DATETIME
Funciones de cadena
En la siguiente tabla se muestran las asignaciones entre las funciones de cadena de Oracle y sus equivalentes en BigQuery:
Oracle | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
BigQuery no admite UTF-16 |
RAWTOHEX
|
TO_HEX
|
LENGTH
|
CHAR_LENGTH
|
LENGTH
|
CHARACTER_LENGTH
|
CHR
|
CODE_POINTS_TO_STRING(
|
COLLATION
|
No existe en BigQuery. BigQuery no admite COLLATE en DML |
COMPOSE
|
Función personalizada definida por el usuario. |
CONCAT, (|| operator)
|
CONCAT
|
DECOMPOSE
|
Función personalizada definida por el usuario. |
ESCAPE_REFERENCE (UTL_I18N)
|
No se admite en BigQuery. Considera la posibilidad de usar una función definida por el usuario. |
INITCAP
|
INITCAP
|
INSTR/INSTR2/INSTR4/INSTRB/INSTRC
|
Función personalizada definida por el usuario. |
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC
|
LENGTH
|
LOWER
|
LOWER
|
LPAD
|
LPAD
|
LTRIM
|
LTRIM
|
NLS_INITCAP
|
Función personalizada definida por el usuario. |
NLS_LOWER
|
LOWER
|
NLS_UPPER
|
UPPER
|
NLSSORT
|
Específico de Oracle, no existe en BigQuery. |
POSITION
|
STRPOS(string, substring)
|
PRINTBLOBTOCLOB
|
Específico de Oracle, no existe en BigQuery. |
REGEXP_COUNT
|
ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
|
REGEXP_INSTR
|
STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))
Nota: Devuelve la primera coincidencia. |
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
|
No se admite en BigQuery. Considera la posibilidad de usar una UDF personalizada |
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
|
|| (BARRAS VERTICALES)
|
CONCAT
|
BigQuery ofrece las siguientes funciones de cadena adicionales:
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
Funciones matemáticas
En la siguiente tabla se muestran las asignaciones entre las funciones matemáticas de Oracle y sus equivalentes en 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
|
Usar con ISNULL
|
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
No se admite en BigQuery. Considera la posibilidad de usar una función definida por el usuario personalizada y la función RAND |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
No se admite en BigQuery. Considera la posibilidad de usar una función definida por el usuario personalizada y la función 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 ofrece las siguientes funciones matemáticas adicionales:
Funciones de conversión de tipos
En la siguiente tabla se muestran las asignaciones entre las funciones de conversión de tipos de Oracle y sus equivalentes en 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
|
No es necesario que sea específico de Oracle. | |
CONVERT
|
BigQuery no admite conjuntos de caracteres. Considera la opción de usar una función definida por el usuario personalizada. | |
EMPTY_BLOB
|
BLOB no se usa en BigQuery.
|
|
EMPTY_CLOB
|
CLOB no se usa en BigQuery.
|
|
FROM_TZ
|
BigQuery no admite los tipos con zonas horarias. Considera la posibilidad de usar una función definida por el usuario y FORMAT_TIMESTAMP | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
No existe de forma implícita en BigQuery. Considera usar funciones definidas por el usuario | |
NCHR
|
Se puede usar una función definida por el usuario para obtener el equivalente de carácter de un valor binario. | |
NUMTODSINTERVAL
|
El tipo de datos INTERVAL no se admite en BigQuery
|
|
NUMTOHEX
|
No se admite en BigQuery. Usa una función definida por el usuario (UDF) personalizada y una función TO_HEX
|
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
El tipo de datos INTERVAL no se admite en BigQuery.
|
|
RAW_TO_CHAR
|
Específico de Oracle, no existe en BigQuery. | |
RAW_TO_NCHAR
|
Específico de Oracle, no existe en BigQuery. | |
RAW_TO_VARCHAR2
|
Específico de Oracle, no existe en BigQuery. | |
RAWTOHEX
|
Específico de Oracle, no existe en BigQuery. | |
RAWTONHEX
|
Específico de Oracle, no existe en BigQuery. | |
RAWTONUM
|
Específico de Oracle, no existe en BigQuery. | |
RAWTONUM2
|
Específico de Oracle, no existe en BigQuery. | |
RAWTOREF
|
Específico de Oracle, no existe en BigQuery. | |
REFTOHEX
|
Específico de Oracle, no existe en BigQuery. | |
REFTORAW
|
Específico de Oracle, no existe en BigQuery. | |
ROWIDTOCHAR
|
ROWID es un tipo específico de Oracle y no existe en BigQuery. Este valor debe representarse como una cadena.
|
|
ROWIDTONCHAR
|
ROWID es un tipo específico de Oracle y no existe en BigQuery. Este valor debe representarse como una cadena.
|
|
SCN_TO_TIMESTAMP
|
SCN es un tipo específico de Oracle y no existe en BigQuery. Este valor debe representarse como una marca de tiempo.
|
|
TO_ACLID TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ TO_UTC_TIMEZONE_TZ TO_YMINTERVAL |
CAST(expr AS typename) PARSE_DATE PARSE_TIMESTAMP La sintaxis de conversión se usa en una consulta para indicar que el tipo de resultado de una expresión debe convertirse en otro tipo. |
|
TREAT
|
Específico de Oracle, no existe en BigQuery. | |
VALIDATE_CONVERSION
|
No se admite en BigQuery. Considera la posibilidad de usar una UDF personalizada | |
VSIZE
|
No se admite en BigQuery. Considera la posibilidad de usar una UDF personalizada |
Funciones JSON
En la siguiente tabla se muestran las asignaciones entre las funciones JSON de Oracle y sus equivalentes en BigQuery.
Oracle | BigQuery |
---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
Considera la posibilidad de usar UDFs y la función TO_JSON_STRING
|
JSON_ARRAYAGG
|
Considera la posibilidad de usar UDFs y la función TO_JSON_STRING
|
JSON_DATAGUIDE
|
Función personalizada definida por el usuario. |
JSON_EQUAL
|
Función personalizada definida por el usuario. |
JSON_EXIST
|
Considera usar UDFs y JSON_EXTRACT o JSON_EXTRACT_SCALAR
|
JSON_MERGEPATCH
|
Función personalizada definida por el usuario. |
JSON_OBJECT
|
No es compatible con BigQuery. |
JSON_OBJECTAGG
|
No es compatible con BigQuery. |
JSON_QUERY
|
Te recomendamos que uses funciones definidas por el usuario y JSON_EXTRACT o JSON_EXTRACT_SCALAR .
|
JSON_TABLE
|
Función personalizada definida por el usuario. |
JSON_TEXTCONTAINS
|
Te recomendamos que uses funciones definidas por el usuario y JSON_EXTRACT o JSON_EXTRACT_SCALAR .
|
JSON_VALUE
|
JSON_EXTRACT_SCALAR
|
Funciones XML
BigQuery no proporciona funciones XML implícitas. El XML se puede cargar en BigQuery como cadena y se pueden usar funciones definidas por el usuario para analizar XML. También se puede procesar XML con una herramienta de extracción, transformación y carga (ETL) o de extracción, carga y transformación (ELT), como Dataflow. En la siguiente lista se muestran las funciones XML de Oracle:
Oracle | BigQuery |
---|---|
DELETEXML
|
Se pueden usar UDFs de BigQuery o una herramienta de ETL como Dataflow para procesar 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 |
Funciones de aprendizaje automático
Las funciones de aprendizaje automático (ML) de Oracle y BigQuery son diferentes.
Oracle requiere un paquete de analíticas avanzadas y licencias para aplicar el aprendizaje automático en la base de datos.
Oracle usa el paquete DBMS_DATA_MINING
para el aprendizaje automático. Para convertir trabajos de minería de datos de Oracle, es necesario reescribir el código. Puedes elegir entre las completas ofertas de productos de IA de Google, como BigQuery ML, las APIs de IA (incluidas Speech-to-Text, Text-to-Speech, Dialogflow, Cloud Translation, NLP, Cloud Vision y Timeseries Insights API), AutoML, AutoML Tables o AI Platform. Los cuadernos gestionados por el usuario de Google se pueden usar como entorno de desarrollo para los científicos de datos, y AI Platform Training de Google se puede usar para ejecutar cargas de trabajo de entrenamiento y puntuación a gran escala. En la siguiente tabla se muestran las funciones de Oracle ML:
Oracle | BigQuery |
---|---|
CLASSIFIER
|
Consulta BigQuery ML para ver las opciones de clasificación y regresión del aprendizaje automático. |
CLUSTER_DETAILS
|
|
CLUSTER_DISTANCE
|
|
CLUSTER_ID
|
|
CLUSTER_PROBABILITY
|
|
CLUSTER_SET
|
|
PREDICTION
|
|
PREDICTION_BOUNDS
|
|
PREDICTION_COST
|
|
PREDICTION_DETAILS
|
|
PREDICTION_PROBABILITY
|
|
PREDICTION_SET
|
Funciones de seguridad
En la siguiente tabla se muestran las funciones para identificar al usuario en Oracle y BigQuery:
Oracle | BigQuery |
---|---|
UID
|
SESSION_USER
|
USER/SESSION_USER/CURRENT_USER
|
SESSION_USER()
|
Funciones de conjunto o de matriz
En la siguiente tabla se muestran las funciones de conjuntos o arrays de Oracle y sus equivalentes en BigQuery:
Oracle | BigQuery |
---|---|
MULTISET
|
ARRAY_AGG
|
MULTISET EXCEPT
|
ARRAY_AGG([DISTINCT] expression)
|
MULTISET INTERSECT
|
ARRAY_AGG([DISTINCT])
|
MULTISET UNION
|
ARRAY_AGG
|
Funciones de ventana
En la siguiente tabla se muestran las funciones de ventana de Oracle y sus equivalentes en BigQuery.
Oracle | BigQuery |
---|---|
LAG
|
LAG (value_expression[, offset [, default_expression]])
|
LEAD
|
LEAD (value_expression[, offset [, default_expression]])
|
Consultas jerárquicas o recursivas
En BigQuery no se usan consultas jerárquicas ni recursivas. Si se conoce la profundidad de la jerarquía, se puede conseguir una función similar con las combinaciones, como se muestra en el siguiente ejemplo. Otra solución sería utilizar la API Storage de BigQuery y 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
En la siguiente tabla se muestran las funciones jerárquicas de Oracle.
Oracle | BigQuery |
---|---|
DEPTH
|
Las consultas jerárquicas no se usan en BigQuery. |
PATH
|
|
SYS_CONNECT_BY_PATH (hierarchical)
|
Funciones UTL
UTL_File
El paquete se usa principalmente para leer y escribir los archivos del sistema operativo desde
PL/SQL. Cloud Storage se puede usar para cualquier tipo de archivo sin procesar.
Las tablas externas y las operaciones de carga y exportación de BigQuery se deben usar para leer y escribir archivos desde y hacia Cloud Storage. Para obtener más información, consulta la introducción a las fuentes de datos externas.
Funciones espaciales
Puedes usar las analíticas geoespaciales de BigQuery para sustituir las funciones espaciales. En Oracle, hay SDO_*
funciones y tipos, como SDO_GEOM_KEY
, SDO_GEOM_MBR
y SDO_GEOM_MMB
. Estas funciones se usan para el análisis espacial. Puedes usar las analíticas geoespaciales
para hacer análisis espaciales.
Sintaxis de DML
En esta sección se abordan las diferencias en la sintaxis del lenguaje de gestión de datos entre Oracle y BigQuery.
INSERT
declaración
La mayoría de las instrucciones de Oracle INSERT
son compatibles con BigQuery. En la tabla siguiente se muestran las excepciones.
Los scripts de DML de BigQuery tienen una semántica de coherencia ligeramente diferente a las instrucciones equivalentes de Oracle. Para obtener una descripción general del aislamiento de las copias de un momento dado y de la gestión de sesiones y transacciones, consulta la sección CREATE [UNIQUE] INDEX
section
de este documento.
Oracle | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle ofrece la palabra clave
Nota: En BigQuery, omitir los nombres de las columnas en la instrucción |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO table VALUES (1,2,3),
(4,5,6),
BigQuery impone cuotas de DML, que restringen el número de declaraciones de DML que puedes ejecutar al día. Para sacar el máximo partido de tu cuota, puedes seguir estos enfoques:
|
UPDATE
declaración
Las instrucciones UPDATE
de Oracle son compatibles en su mayoría con BigQuery. Sin embargo, en BigQuery, la instrucción UPDATE
debe tener una cláusula WHERE
.
Como práctica recomendada, debes usar las instrucciones DML por lotes en lugar de varias instrucciones UPDATE
y INSERT
. Los scripts DML de BigQuery tienen una semántica de coherencia ligeramente diferente a las instrucciones equivalentes de Oracle.
Para obtener una descripción general del aislamiento de las copias de seguridad y de la gestión de sesiones y transacciones, consulta la sección CREATE INDEX
de este documento.
En la siguiente tabla se muestran las instrucciones de Oracle UPDATE
y las instrucciones de BigQuery que realizan las mismas tareas.
En BigQuery, la instrucción UPDATE
debe tener una cláusula WHERE
.
Para obtener más información sobre UPDATE
en BigQuery, consulta los ejemplos de UPDATE de BigQuery en la documentación de DML.
DELETE
y TRUNCATE
Las instrucciones DELETE
y TRUNCATE
son dos formas de eliminar filas de una tabla sin afectar al esquema de la tabla. TRUNCATE
no se usa en BigQuery.
Sin embargo, puede usar las instrucciones DELETE
para conseguir el mismo efecto.
En BigQuery, la instrucción DELETE
debe tener una cláusula WHERE
.
Para obtener más información sobre DELETE
en BigQuery, consulta los ejemplos de DELETE
de BigQuery en la documentación de DML.
Oracle | BigQuery |
---|---|
DELETE database.table;
|
DELETE FROM table WHERE TRUE;
|
MERGE
declaración
La instrucción MERGE
puede combinar operaciones INSERT
, UPDATE
y DELETE
en una sola instrucción UPSERT
y realizar las operaciones de forma atómica. La operación MERGE
debe coincidir con una fila de origen como máximo por cada fila de destino.
Tanto BigQuery como Oracle siguen la sintaxis ANSI.
Sin embargo, las secuencias de comandos DML de BigQuery tienen una semántica de coherencia ligeramente diferente a las instrucciones equivalentes de Oracle.
Sintaxis de DDL
En esta sección se abordan las diferencias en la sintaxis del lenguaje de definición de datos entre Oracle y BigQuery.
CREATE TABLE
declaración
La mayoría de las instrucciones de CREATE TABLE
de Oracle son compatibles con BigQuery, excepto las siguientes restricciones y elementos de sintaxis, que no se usan en BigQuery:
STORAGE
TABLESPACE
DEFAULT
GENERATED ALWAYS AS
ENCRYPT
PRIMARY KEY (col, ...)
. Para obtener más información, consultaCREATE INDEX
.UNIQUE INDEX
. Para obtener más información, consultaCREATE INDEX
.CONSTRAINT..REFERENCES
DEFAULT
PARALLEL
COMPRESS
Para obtener más información sobre CREATE TABLE
en BigQuery, consulta los ejemplos de CREATE TABLE
de BigQuery.
Opciones y atributos de columna
Las columnas de identidad se introdujeron en la versión Oracle 12c, que permite el incremento automático de una columna. No se usa en BigQuery, sino que se puede conseguir con el siguiente método por lotes. Para obtener más información sobre las claves subrogadas y las dimensiones que cambian lentamente (SCD), consulta las siguientes guías:
Oracle | BigQuery |
---|---|
CREATE TABLE table (
|
INSERT INTO dataset.table SELECT
|
Comentarios de columna
Oracle usa la sintaxis Comment
para añadir comentarios en las columnas. Esta función se puede implementar de forma similar en BigQuery usando la descripción de la columna, tal como se muestra en la siguiente tabla:
Oracle | BigQuery |
---|---|
Comment on column table is 'column desc';
|
CREATE TABLE dataset.table (
|
Tablas temporales
Oracle admite tablas temporales, que se suelen usar para almacenar resultados intermedios en secuencias de comandos. BigQuery admite tablas temporales.
Oracle | BigQuery |
---|---|
CREATE GLOBAL TEMPORARY TABLE
|
CREATE TEMP TABLE temp_tab
|
Los siguientes elementos de Oracle no se usan en BigQuery:
ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;
También hay otras formas de emular tablas temporales en BigQuery:
- Tiempo de vida del conjunto de datos: crea un conjunto de datos que tenga un tiempo de vida breve (por ejemplo, una hora) para que las tablas que se creen en él sean temporales (ya que no se conservarán más tiempo que el tiempo de vida del conjunto de datos). Puedes añadir el prefijo
temp
a todos los nombres de las tablas de este conjunto de datos para indicar claramente que las tablas son temporales. TTL de tabla: crea una tabla que tenga un tiempo de vida breve específico de la tabla mediante declaraciones de DDL similares a las siguientes:
CREATE TABLE temp.name (col1, col2, ...)
OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));Cláusula
WITH
: si solo se necesita una tabla temporal en el mismo bloque, usa un resultado temporal con una instrucciónWITH
o una subconsulta.
CREATE SEQUENCE
declaración
Las secuencias no se usan en BigQuery. Esto se puede conseguir de la siguiente forma por lotes. Para obtener más información sobre las claves subrogadas y las dimensiones que cambian lentamente (SCD), consulte las siguientes guías:
INSERT INTO dataset.table
SELECT *,
ROW_NUMBER() OVER () AS id
FROM dataset.table
CREATE VIEW
declaración
En la siguiente tabla se muestran los equivalentes entre Oracle y BigQuery para la instrucción CREATE VIEW
.
Oracle | BigQuery | Notas |
---|---|---|
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 ...
|
|
No compatible | CREATE VIEW IF NOT EXISTS
view_name
OPTIONS(view_option_list)
AS SELECT ...
|
Crea una vista solo si no existe en el conjunto de datos especificado. |
CREATE MATERIALIZED VIEW
declaración
En BigQuery, las operaciones de actualización de vistas materializadas se realizan automáticamente. No es necesario especificar opciones de actualización (por ejemplo, al confirmar o según una programación) en BigQuery. Para obtener más información, consulta la introducción a las vistas materializadas.
Si la tabla base solo se modifica añadiendo datos, la consulta que usa la vista materializada (tanto si se hace referencia a la vista de forma explícita como si la selecciona el optimizador de consultas) analiza toda la vista materializada más un delta de la tabla base desde la última actualización de la vista. Esto significa que las consultas son más rápidas y económicas.
Por el contrario, si se han producido actualizaciones (DML UPDATE o MERGE) o eliminaciones (DML DELETE, truncamiento o vencimiento de particiones) en la tabla base desde la última actualización de la vista, la vista materializada no se analizará y, por lo tanto, la consulta no obtendrá ningún ahorro hasta la próxima actualización de la vista. Básicamente, cualquier actualización o eliminación en la tabla base invalida el estado de la vista materializada.
Además, los datos del búfer de streaming de la tabla base no se guardan en la vista materializada. El búfer de streaming se sigue analizando por completo, independientemente de si se usa la vista materializada.
En la siguiente tabla se muestran los equivalentes entre Oracle y BigQuery para la instrucción CREATE MATERIALIZED VIEW
.
Oracle | BigQuery | Notas |
---|---|---|
CREATE MATERIALIZED VIEW view_name
|
CREATE MATERIALIZED VIEW
|
CREATE [UNIQUE] INDEX
declaración
En esta sección se describen los enfoques de BigQuery para crear funciones similares a los índices de Oracle.
Indexación para mejorar el rendimiento
BigQuery no necesita índices explícitos, ya que es una base de datos orientada a columnas con optimización de consultas y almacenamiento. BigQuery ofrece funciones como particiones y clústeres, así como campos anidados, que pueden aumentar la eficiencia y el rendimiento de las consultas optimizando la forma en que se almacenan los datos.
Indexación para la coherencia (UNIQUE, PRIMARY INDEX)
En Oracle, se puede usar un índice único para evitar filas con claves no únicas en una tabla. Si un proceso intenta insertar o actualizar datos que tienen un valor que ya está en el índice, la operación falla con una infracción del índice.
Como BigQuery no proporciona índices explícitos, se puede usar una instrucción MERGE
para insertar solo registros únicos en una tabla de destino desde una tabla de almacenamiento provisional y descartar los registros duplicados. Sin embargo, no hay forma de evitar que un usuario con permisos de edición inserte un registro duplicado.
Para generar un error de registros duplicados en BigQuery, puedes usar una instrucción MERGE
de la tabla de almacenamiento provisional, como se muestra en el siguiente ejemplo:
Oracle | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
En la mayoría de los casos, los usuarios prefieren eliminar los duplicados por su cuenta para encontrar errores en los sistemas posteriores.
BigQuery no admite columnas DEFAULT
y IDENTITY
(secuencias).
Bloqueo
BigQuery no tiene un mecanismo de bloqueo como Oracle y puede ejecutar consultas simultáneas (hasta tu cuota). Solo las instrucciones DML tienen ciertos límites de simultaneidad y, en algunos casos, pueden requerir un bloqueo de tabla durante la ejecución.
Declaraciones SQL procedimentales
En esta sección se describe cómo convertir las instrucciones de SQL procedimentales que se usan en procedimientos almacenados, funciones y activadores de Oracle a BigQuery.
CREATE PROCEDURE
declaración
El procedimiento almacenado se admite como parte de la versión beta de secuencias de comandos de BigQuery.
Oracle | BigQuery | Notas |
---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
Al igual que Oracle, BigQuery admite IN, OUT, INOUT modos de argumentos. BigQuery no admite otras especificaciones de sintaxis.
|
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
En las siguientes secciones se describen formas de convertir instrucciones de procedimiento de Oracle en instrucciones de secuencias de comandos de BigQuery que tengan una funcionalidad similar.
CREATE TRIGGER
declaración
Los activadores no se usan en BigQuery. La lógica de aplicación basada en filas debe gestionarse en la capa de aplicación. La función de activación se puede conseguir mediante la herramienta de ingestión, las funciones de Pub/Sub o Cloud Run durante el tiempo de ingestión, o bien mediante análisis periódicos.
Declaración y asignación de variables
En la siguiente tabla se muestran las instrucciones de Oracle DECLARE
y sus equivalentes en BigQuery.
Oracle | BigQuery |
---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
Declaraciones y operaciones de cursores
BigQuery no admite cursores, por lo que las siguientes instrucciones no se utilizan en 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;
Instrucciones SQL dinámicas
La siguiente instrucción de SQL dinámico de Oracle y su equivalente en BigQuery:
Oracle | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str
|
EXECUTE IMMEDIATE
|
Instrucciones de flujo de control
En la siguiente tabla se muestran las instrucciones de flujo de control de Oracle y sus equivalentes en 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
|
FOR LOOP no se usa en BigQuery. Usa otras
instrucciones LOOP .
|
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
Usa la condición CONTINUE con IF .
|
GOTO
|
La instrucción GOTO no existe en BigQuery. Usa la condición IF .
|
Declaraciones SQL de metadatos y transacciones
Oracle | BigQuery |
---|---|
GATHER_STATS_JOB
|
Aún no se usa en BigQuery. |
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT;
|
Aún no se usa en BigQuery. |
Alter session set isolation_level=serializable; /
|
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta el artículo Garantías de coherencia y aislamiento de transacciones de este documento. |
EXPLAIN PLAN ...
|
No se usa en BigQuery.
Las funciones similares son la explicación del plan de consulta en la interfaz web de BigQuery y la asignación de ranuras, así como el registro de auditoría en Stackdriver. |
SELECT * FROM DBA_[*];
(Vistas DBA_/ALL_/V$ de Oracle) |
SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;
Para obtener más información, consulta Introducción a INFORMATION_SCHEMA de BigQuery. |
SELECT * FROM GV$SESSION;
|
BigQuery no tiene el concepto tradicional de sesión. Puedes ver las tareas de consulta en la interfaz de usuario o exportar los registros de auditoría de Stackdriver a BigQuery y analizar los registros de BigQuery para analizar las tareas. Para obtener más información, consulta Ver los detalles de un trabajo. |
START TRANSACTION;
|
Sustituir el contenido de una tabla por el resultado de una consulta equivale a una transacción. Puedes hacerlo con una consulta o una operación de copia.
Usar una consulta:
Usar una copia:
|
Instrucciones SQL de varias líneas y con varias instrucciones
Tanto Oracle como BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten instrucciones separadas por puntos y comas que se ejecutan de forma coherente. Para obtener más información, consulta el artículo sobre las transacciones con varias declaraciones.
Códigos y mensajes de error
Los códigos de error de Oracle y los códigos de error de BigQuery son diferentes. Si la lógica de tu aplicación detecta los errores, intenta eliminar el origen del error, ya que BigQuery no devuelve los mismos códigos de error.
Garantías de coherencia y aislamiento de transacciones
Tanto Oracle como BigQuery son atómicos, es decir, cumplen los requisitos de ACID a nivel de mutación en muchas filas. Por ejemplo, una operación MERGE
es atómica, incluso con varios valores insertados y actualizados.
Transacciones
Oracle proporciona niveles de aislamiento de transacciones de lectura confirmada o serializable. Es posible que se produzcan interbloqueos. Los trabajos de inserción de anexión de Oracle se ejecutan de forma independiente.
BigQuery también admite transacciones.
BigQuery ayuda a garantizar el control de simultaneidad optimista (el primero en confirmar gana) con el aislamiento de instantáneas, en el que una consulta lee los últimos datos confirmados antes de que empiece. Este enfoque garantiza el mismo nivel de coherencia por fila y por mutación, así como entre las filas de la misma instrucción DML, pero evita los interbloqueos. En el caso de que haya varias instrucciones UPDATE
en la misma tabla, BigQuery cambia al control de simultaneidad pesimista y pone en cola varias instrucciones UPDATE
, y vuelve a intentarlo automáticamente en caso de conflicto. INSERT
Las instrucciones DML y las tareas de carga se pueden ejecutar de forma simultánea e independiente para añadir datos a las tablas.
Restauración
Oracle admite reversiones. Como no hay ningún límite de transacción explícito en BigQuery, no existe el concepto de reversión explícita en BigQuery. Las soluciones alternativas son los decoradores de tabla o el uso de FOR SYSTEM_TIME AS OF
.
Límites de las bases de datos
Consulta las cuotas y los límites más recientes de BigQuery. Muchas cuotas para usuarios con grandes volúmenes se pueden aumentar poniéndose en contacto con Cloud Customer Care. En la siguiente tabla se comparan los límites de las bases de datos de Oracle y BigQuery.
Límite | Oracle | BigQuery |
---|---|---|
Tablas por base de datos | Sin restricción | Sin restricción |
Columnas por tabla | 1000 | 10.000 |
Tamaño máximo de las filas | Ilimitado (depende del tipo de columna) | 100 MB |
Longitud del nombre de la columna y de la tabla | Si v12.2>= 128 bytes
De lo contrario, 30 bytes |
16.384 caracteres Unicode |
Filas por tabla | Ilimitado | Ilimitado |
Longitud máxima de las solicitudes de SQL | Ilimitado | 1 MB (longitud máxima de las consultas de GoogleSQL sin resolver)
12 MB (longitud máxima de las consultas de SQL antiguo y de Google resueltas) Streaming:
|
Tamaño máximo de solicitud y respuesta | Ilimitado | 10 MB (solicitud) y 10 GB (respuesta), o prácticamente ilimitado si usas la paginación o la API de Cloud Storage. |
Número máximo de sesiones simultáneas | Limitada por los parámetros de sesiones o procesos | 100 consultas simultáneas (se puede aumentar con la reserva de espacios) y 300 solicitudes a la API simultáneas por usuario. |
Número máximo de cargas (rápidas) simultáneas | Limitada por los parámetros de sesiones o procesos | No hay límite de simultaneidad; los trabajos se ponen en cola. 100.000 tareas de carga por proyecto y día. |
Otros límites de Oracle Database incluyen los límites de tipos de datos, los límites de bases de datos físicas, los límites de bases de datos lógicas y los límites de procesos y de tiempo de ejecución.