Guía de traducción de SQL de Oracle
En este documento, se detallan las similitudes y diferencias que existen en la sintaxis de 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 de forma masiva o la traducción de SQL interactiva a fin de traducir consultas ad hoc.
Tipos de datos
En esta sección, se muestran los equivalentes entre los tipos de datos en Oracle y en 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 la especificación de usuarios para valores personalizados de precisión o escalamiento. Como resultado, se puede definir una columna en Oracle para que tenga una escala mayor que la compatible con BigQuery.
Además, antes de almacenar un número decimal, Oracle se redondea hacia arriba si ese número tiene más dígitos después del punto decimal que el especificado para la columna correspondiente. En BigQuery, esta función se puede implementar con la función |
NUMBER(*, x)
|
NUMERIC
|
BigQuery no permite la especificación de usuarios para valores personalizados de precisión o escalamiento. Como resultado, se puede definir una columna en Oracle para que tenga una escala mayor que la compatible con BigQuery.
Además, antes de almacenar un número decimal, Oracle se redondea hacia arriba si ese número tiene más dígitos después del punto decimal que el especificado para 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 a un número entero. Para BigQuery, un intento de almacenar un número decimal en una columna definida como INT64 genera 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 a un número entero. Para BigQuery, un intento de almacenar un número decimal en una columna definida como INT64 genera 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 es un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser una mejor coincidencia para el tipo FLOAT en BigQuery.
|
BINARY_DOUBLE
|
FLOAT64 /NUMERIC
|
FLOAT es un tipo de datos exacto y es un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser una mejor coincidencia para el tipo FLOAT en BigQuery.
|
BINARY_FLOAT
|
FLOAT64 /NUMERIC
|
FLOAT es un tipo de datos exacto y es un subtipo de NUMBER en Oracle. En BigQuery, FLOAT64 es un tipo de datos aproximado. NUMERIC puede ser una mejor coincidencia para el tipo FLOAT en BigQuery.
|
LONG
|
BYTES
|
El tipo de datos LONG se usa en versiones anteriores y no se sugiere en versiones nuevas de la base de datos de Oracle.
Se puede usar el tipo de datos |
BLOB
|
BYTES
|
Se puede usar el tipo de datos BYTES para almacenar datos binarios de longitud variable. Si este campo no se consulta y no se usa en las estadísticas, una mejor opción es almacenar los datos binarios en Cloud Storage.
|
BFILE
|
STRING
|
Los archivos binarios se pueden almacenar en Cloud Storage y el tipo de datos STRING se puede usar para hacer referencia a archivos en una tabla de BigQuery.
|
DATE
|
DATETIME
|
|
TIMESTAMP
|
TIMESTAMP
|
BigQuery admite la precisión de microsegundos (10-6) en comparación con Oracle, que admite una precisión de 0 a 9.
BigQuery admite un nombre de región de zona horaria a partir de una base de datos TZ y un desplazamiento de zona horaria de UTC.
En BigQuery, se debe realizar una conversión de zona horaria de forma manual para que coincida con la función |
TIMESTAMP(x)
|
TIMESTAMP
|
BigQuery admite la precisión de microsegundos (10-6) en comparación con Oracle, que admite una precisión de 0 a 9.
BigQuery admite un nombre de región de zona horaria a partir de una base de datos TZ y un desplazamiento de zona horaria de UTC.
En BigQuery, se debe realizar una conversión de zona horaria de forma manual para que coincida con la función |
TIMESTAMP WITH TIME ZONE
|
TIMESTAMP
|
BigQuery admite la precisión de microsegundos (10-6) en comparación con Oracle, que admite una precisión de 0 a 9.
BigQuery admite un nombre de región de zona horaria a partir de una base de datos TZ y un desplazamiento de zona horaria de UTC.
En BigQuery, se debe realizar una conversión de zona horaria de forma manual para que coincida con la función |
TIMESTAMP WITH LOCAL TIME ZONE
|
TIMESTAMP
|
BigQuery admite la precisión de microsegundos (10-6) en comparación con Oracle, que admite una precisión de 0 a 9.
BigQuery admite un nombre de región de zona horaria a partir de una base de datos TZ y un desplazamiento de zona horaria de UTC.
En BigQuery, se debe realizar una conversión de zona horaria de forma manual para que coincida con la función |
INTERVAL YEAR TO MONTH
|
STRING
|
Los valores de intervalo se pueden almacenar como el tipo de datos STRING en BigQuery.
|
INTERVAL DAY TO SECOND
|
STRING
|
Los valores de intervalo se pueden almacenar como el tipo de datos STRING en BigQuery.
|
RAW
|
BYTES
|
Se puede usar el tipo de datos BYTES para almacenar datos binarios de longitud variable. Si este campo no se consulta ni se usa en las estadísticas, una mejor opción es almacenar los datos binarios en Cloud Storage.
|
LONG RAW
|
BYTES
|
Se puede usar el tipo de datos BYTES para almacenar datos binarios de longitud variable. Si este campo no se consulta ni se usa en las estadísticas, una mejor opción es almacenar los datos binarios en Cloud Storage.
|
ROWID
|
STRING
|
Estos tipos de datos se usan en Oracle de forma interna para especificar direcciones únicas para las filas de una tabla. Por lo general, los campos ROWID o UROWID no deben usarse en aplicaciones. Sin embargo, si este es el caso, se puede usar el tipo de datos STRING para conservar estos datos.
|
Formateo de tipos
SQL de Oracle usa un conjunto de formatos predeterminados establecidos como parámetros para mostrar expresiones y datos de columnas y para conversiones entre tipos de datos. Por ejemplo, NLS_DATE_FORMAT
configurado como YYYY/MM/DD
formatea fechas como YYYY/MM/DD
de forma predeterminada. Puedes encontrar más información sobre la configuración de NLS en la documentación en línea de Oracle.
En BigQuery, no hay parámetros de inicialización.
De manera predeterminada, BigQuery espera que todos los datos de origen estén codificados en UTF-8 durante la carga. Por otro lado, si tienes archivos CSV con datos codificados en formato ISO-8859-1, puedes especificar de forma explícita la codificación cuando importes tus datos a fin de que BigQuery pueda convertirlos correctamente en UTF-8 durante el proceso de importación.
Solo es posible importar datos codificados como ISO-8859-1 o como UTF-8. BigQuery almacena y muestra los datos como codificados en UTF-8.
El formato de fecha o la zona horaria deseados se pueden configurar en las funciones DATE
y TIMESTAMP
.
Tipos de formato de marca de tiempo y fecha
Cuando conviertes los elementos de formato de fecha y marca de tiempo de Oracle en BigQuery, debes prestar atención a las diferencias de zona horaria entre TIMESTAMP
y DATETIME
, como se resume en la siguiente tabla.
Ten en cuenta que no hay paréntesis en los formatos de Oracle, ya que 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 columnas o la variable de configuración TIME_ZONE .
|
Si es posible, usa la función CURRENT_TIMESTAMP() , que tiene formato ISO. Sin embargo, el formato de salida siempre muestra la zona horaria UTC. (A nivel interno, BigQuery no tiene una zona horaria).
Ten en cuenta los siguientes detalles sobre las diferencias en el formato ISO.
El formato de
Si quieres usar un formato explícito, usa la función |
|
CURRENT_DATE
|
Oracle usa 2 tipos para la fecha:
SYSDATE or CURRENT_DATE muestra uno.
|
BigQuery tiene un formato DATE independiente que siempre muestra 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 tipos de fecha. | Para los tipos de fecha, usa DATE_ADD () o DATE_SUB (). BigQuery usa operadores aritméticos a tipos de datos: INT64 , NUMERIC y FLOAT64 .
|
|
NLS_DATE_FORMAT
|
Establece 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 las consultas
En esta sección, se abordan las diferencias que existen en la sintaxis de consultas en Oracle y en BigQuery.
Declaraciones SELECT
La mayoría de las declaraciones SELECT
de Oracle son compatibles con BigQuery.
Funciones, operadores y expresiones
En las siguientes secciones, se muestra una lista de las funciones de Oracle junto con las funciones equivalentes de BigQuery.
Operadores de comparación
Los operadores de comparación de Oracle y BigQuery cumplen con el ANSI SQL:2011. Los operadores de comparación en la siguiente tabla son los mismos en BigQuery y Oracle. Puedes usar REGEXP_CONTAINS
en lugar de REGEXP_LIKE
en BigQuery.
Operador | Descripción |
---|---|
"="
|
Igual |
<>
|
No igual |
!=
|
No igual |
>
|
Mayor que |
>=
|
Mayor que o igual |
<
|
Menor que |
<=
|
Menor que o igual |
IN ( )
|
Coincide con un valor de una lista |
NOT
|
Niega una condición |
BETWEEN
|
Dentro de un rango (inclusivo) |
IS NULL
|
valor NULL
|
IS NOT NULL
|
No es un valor NULL
|
LIKE
|
Coincidencia de patrones con % |
EXISTS
|
La condición se cumple si la subconsulta muestra al menos una fila. |
Los operadores de la tabla son los mismos en BigQuery y Oracle.
Expresiones y funciones lógicas
Funciones de agregación
En la siguiente tabla, se muestran las asignaciones entre las funciones comunes de agregación de Oracle, de agregación estadística y de agregación aproximada con sus equivalentes de BigQuery:
Oracle | BigQuery |
---|---|
ANY_VALUE (de 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 a nivel de bits: |
BIT_OR
|
BIT_OR, X | Y
|
BIT_XOR
|
BIT_XOR, X ^ Y
|
BITAND
|
BIT_AND, X & Y
|
CARDINALITY
|
COUNT
|
COLLECT
|
BigQuery no es compatible con TYPE AS TABLE OF .
Considera 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 implícitamente en BigQuery. Considera usar funciones definidas por el usuario (UDF). |
GROUP_ID
|
No se usa en BigQuery. |
GROUPING
|
No se usa en BigQuery. |
GROUPING_ID
|
No se usa en BigQuery. |
LAST
|
No existe implícitamente en BigQuery. Considera usar las UDFs |
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 comunes de Oracle con sus equivalentes de BigQuery.
Oracle | BigQuery |
---|---|
AVG
|
AVG
|
BIT_COMPLEMENT
|
Operador NOT a nivel de bits: |
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 es compatible con BigQuery. Considera usar una herramienta de IE o una UDF personalizada |
CUME_DIST
|
CUME_DIST
|
DENSE_RANK(ANSI)
|
DENSE_RANK
|
FEATURE_COMPARE
|
No existe implícitamente en BigQuery. Considera usar UDF y BigQuery ML |
FEATURE_DETAILS
|
No existe implícitamente en BigQuery. Considera usar UDF y BigQuery ML |
FEATURE_ID
|
No existe implícitamente en BigQuery. Considera usar UDF y BigQuery ML |
FEATURE_SET
|
No existe implícitamente en BigQuery. Considera usar UDF y BigQuery ML |
FEATURE_VALUE
|
No existe implícitamente en BigQuery. Considera usar UDF y BigQuery ML |
FIRST_VALUE
|
FIRST_VALUE
|
HIER_CAPTION
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_CHILD_COUNT
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_COLUMN
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_DEPTH
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_DESCRIPTION
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_HAS_CHILDREN
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_LEVEL
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_MEMBER_NAME
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_ORDER
|
Las consultas jerárquicas no son compatibles con BigQuery. |
HIER_UNIQUE_MEMBER_NAME
|
Las consultas jerárquicas no son compatibles con BigQuery. |
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 UDF en BigQuery |
MATCH_RECOGNIZE
|
El reconocimiento y el cálculo de patrones se pueden realizar con expresiones regulares y UDF 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 UDF. |
Funciones de fecha y hora
En la siguiente tabla, se muestran las asignaciones entre las funciones comunes de fecha y hora de Oracle y sus equivalentes de 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 zona horaria. |
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 es compatible con BigQuery. Considera usar una UDF personalizada. |
WM_CONTAINS WM_EQUALS WM_GREATERTHAN WM_INTERSECTION WM_LDIFF WM_LESSTHAN WM_MEETS WM_OVERLAPS WM_RDIFF |
Los períodos no se usan en BigQuery. Las UDFs se pueden usar para comparar dos períodos. |
BigQuery ofrece las siguientes funciones adicionales de fecha y hora:
CURRENT_DATETIME
DATE_FROM_UNIX_DATE
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
FORMAT_DATE
FORMAT_DATETIME
Funciones de string
En la siguiente tabla, se muestran las asignaciones entre las funciones de cadenas de Oracle y sus equivalentes de BigQuery:
Oracle | BigQuery |
---|---|
ASCII
|
TO_CODE_POINTS(string_expr)[OFFSET(0)]
|
ASCIISTR
|
BigQuery no es compatible con 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 es compatible con BigQuery. Considera 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: Muestra el primer caso. |
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 es compatible con BigQuery. Considera 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 string 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 de 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
|
úsalo con ISNULL . |
LOG
|
LOG
|
MOD (% operator)
|
MOD
|
POWER (** operator)
|
POWER, POW
|
DBMS_RANDOM.VALUE
|
RAND
|
RANDOMBYTES
|
No es compatible con BigQuery. Considera usar una función UDF y RAND personalizada |
RANDOMINTEGER
|
CAST(FLOOR(10*RAND()) AS INT64)
|
RANDOMNUMBER
|
No es compatible con BigQuery. Considera usar una función UDF y RAND personalizada |
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 tipo
En la siguiente tabla, se muestran las asignaciones entre las funciones de conversión de tipo de Oracle y sus equivalentes de 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 se necesita la información específica de Oracle. | |
CONVERT
|
BigQuery no admite grupos de caracteres. Considera usar una función personalizada definida por el usuario. | |
EMPTY_BLOB
|
BLOB no se usa en BigQuery.
|
|
EMPTY_CLOB
|
CLOB no se usa en BigQuery.
|
|
FROM_TZ
|
Los tipos con zonas horarias no son compatibles con BigQuery. Considera usar una función definida por el usuario y FORMAT_TIMESTAMP. | |
INT_TO_BOOL
|
CAST
|
|
IS_BIT_SET
|
No existe implícitamente en BigQuery. Considera usar las UDFs | |
NCHR
|
La UDF se puede usar para obtener el equivalente de caracteres del objeto binario | |
NUMTODSINTERVAL
|
BigQuery no admite el tipo de datos INTERVAL
|
|
NUMTOHEX
|
No es compatible con BigQuery. Considera usar una UDF personalizada y una función TO_HEX
|
|
NUMTOHEX2
|
||
NUMTOYMINTERVAL
|
El tipo de datos INTERVAL no es compatible con 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 se debe representar como una string.
|
|
ROWIDTONCHAR
|
ROWID es un tipo específico de Oracle y no existe en BigQuery. Este valor se debe representar como una string.
|
|
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 de tipos se usa en una consulta para indicar que el tipo de resultado de una expresión debe convertirse en algún otro tipo. |
|
TREAT
|
Específico de Oracle, no existe en BigQuery. | |
VALIDATE_CONVERSION
|
No es compatible con BigQuery. Considera usar una UDF personalizada | |
VSIZE
|
No es compatible con BigQuery. Considera usar una UDF personalizada |
Funciones JSON
En la siguiente tabla, se muestran las asignaciones entre las funciones JSON de Oracle y sus equivalentes de BigQuery.
Oracle | BigQuery |
---|---|
AS_JSON
|
TO_JSON_STRING(value[, pretty_print])
|
JSON_ARRAY
|
Considera usar UDFs y la función TO_JSON_STRING
|
JSON_ARRAYAGG
|
Considera 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
|
Considera usar UDF y JSON_EXTRACT o JSON_EXTRACT_SCALAR .
|
JSON_TABLE
|
Función personalizada definida por el usuario. |
JSON_TEXTCONTAINS
|
Considera usar UDF 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 una string y las UDFs se pueden usar para analizar XML. Como alternativa, el procesamiento XML lo realiza una herramienta de ETL/ELT, como Dataflow. En la siguiente lista, se muestran las funciones de XML de Oracle:
Oracle | BigQuery |
---|---|
DELETEXML
|
Las UDFs de BigQuery o la herramienta ETL como Dataflow se pueden usar 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 (AA) en Oracle y BigQuery son diferentes.
Oracle requiere un paquete de estadísticas avanzadas y licencias para realizar el AA en la base de datos.
Oracle usa el paquete DBMS_DATA_MINING
para el AA. La conversión de trabajos de minería de datos de Oracle requiere volver a escribir el código; puedes elegir entre ofertas completas de productos de IA de Google, como BigQuery ML o las APIs de IA (incluidas Speech‐to‐Text, Text‐to‐Speech, Dialogflow, Cloud Translation y PLN, Cloud Vision y la API de Timeseries Insights, AutoML, AutoML Tables o AI Platform. Los notebooks administrados por el usuario de Google se pueden usar como un entorno de desarrollo para científicos de datos, y Google AI Platform Training se puede usar para ejecutar el entrenamiento y puntuación de las cargas de trabajo a gran escala. En la siguiente tabla, se muestran las funciones del AA de Oracle:
Oracle | BigQuery |
---|---|
CLASSIFIER
|
Consulta BigQuery ML para ver las opciones de clasificación y regresión de 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 conjuntos o arrays
En la siguiente tabla, se muestran las funciones de conjuntos o arrays en 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 analíticas
En la siguiente tabla, se muestran las funciones analíticas en 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 recurrentes
No se usan consultas jerárquicas o recurrentes en BigQuery. Si la profundidad de la jerarquía se conoce, se puede lograr una funcionalidad similar con uniones, como se ilustra en el siguiente ejemplo. Otra solución sería usar la API de BigQuery Storage 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 en Oracle.
Oracle | BigQuery |
---|---|
DEPTH
|
Las consultas jerárquicas no se usan en BigQuery. |
PATH
|
|
SYS_CONNECT_BY_PATH (hierarchical)
|
Funciones UTL
El paquete UTL_File
se usa principalmente para leer y escribir los archivos del sistema operativo desde PL/SQL. Cloud Storage se puede usar para cualquier tipo de etapa de pruebas de archivos sin procesar.
Las tablas externas y las cargas y exportaciones de BigQuery deben usarse para leer y escribir archivos desde y hacia Cloud Storage. Para obtener más información, consulta Introducción a las fuentes de datos externas.
Funciones espaciales
Puedes usar las estadísticas geoespaciales de BigQuery para reemplazar la funcionalidad espacial. Hay funciones y tipos SDO_*
en Oracle, como SDO_GEOM_KEY
, SDO_GEOM_MBR
, SDO_GEOM_MMB
. Estas funciones se usan para el análisis espacial. Puedes usar estadísticas geoespaciales para realizar análisis espaciales.
Sintaxis de DML
En esta sección, se abordan las diferencias que existen entre la sintaxis del lenguaje de administración de datos de Oracle y de BigQuery.
Declaración INSERT
La mayoría de las declaraciones INSERT
de Oracle son compatibles con BigQuery. En la siguiente tabla, se muestran las excepciones.
Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Oracle. Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta la sección CREATE [UNIQUE] INDEX
section
en este documento.
Oracle | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO table (...) VALUES (...);
Oracle ofrece una palabra clave Nota: En BigQuery, omitir los nombres de columna en la declaració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 la cantidad de declaraciones DML que puedes ejecutar a diario. Para aprovechar al máximo tu cuota, considera los siguientes enfoques:
|
Declaración UPDATE
Las declaraciones UPDATE
de Oracle son, en su mayoría, compatibles con BigQuery. Sin embargo, en BigQuery, la declaración UPDATE
debe tener una cláusula WHERE
.
Como práctica recomendada, debes preferir las declaraciones DML por lotes en lugar de varias declaraciones UPDATE
y INSERT
. Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Oracle.
Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta la sección CREATE INDEX
de este documento.
En la siguiente tabla, se muestran las declaraciones UPDATE
de Oracle y las declaraciones de BigQuery que realizan las mismas tareas.
En BigQuery, la declaració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 del DML.
Declaraciones DELETE
y TRUNCATE
Las declaraciones DELETE
y TRUNCATE
son alternativas para quitar filas de una tabla sin afectar el esquema de esta. TRUNCATE
no se usa en BigQuery.
Sin embargo, puedes usar declaraciones DELETE
para obtener el mismo resultado.
En BigQuery, la declaració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 del DML.
Oracle | BigQuery |
---|---|
DELETE database.table;
|
DELETE FROM table WHERE TRUE;
|
Declaración MERGE
La declaración MERGE
puede combinar operaciones INSERT
, UPDATE
y DELETE
en una sola declaración de UPSERT
y realizar las operaciones de forma atómica. La operación MERGE
debe vincular como máximo una fila de origen con cada fila de destino.
BigQuery y Oracle siguen la sintaxis ANSI.
Sin embargo, las secuencias de comandos de DML en BigQuery tienen una semántica de coherencia apenas diferente a las declaraciones equivalentes de Oracle.
Sintaxis del DDL
En esta sección, se abordan las diferencias que existen entre la sintaxis del lenguaje de definición de datos en Snowflake y en Oracle.
Declaración CREATE TABLE
La mayoría de las declaraciones 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.
Atributos y opciones de columnas
Las columnas de identidad se ingresan con la versión de Oracle 12c, que habilita el incremento automático en una columna. Esto no se usa en BigQuery; esto se puede lograr con el siguiente método por lotes. Para obtener más información sobre las claves sustitutas y el cambio lento de las dimensiones (SCD), consulta las siguientes guías:
Oracle | BigQuery |
---|---|
CREATE TABLE table (
|
INSERT INTO dataset.table SELECT
|
Comentarios de la columna
Oracle usa la sintaxis Comment
para agregar comentarios en las columnas. Esta función se puede implementar de manera similar en BigQuery mediante la descripción de la columna, 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 a menudo se usan para almacenar resultados intermedios en secuencias de comandos. Las tablas temporales son compatibles con BigQuery.
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 existen otras formas de emular tablas temporales en BigQuery, como las que se describen a continuación:
- TTL del conjunto de datos: Crea un conjunto de datos con un tiempo de actividad corto (por ejemplo, 1 hora) para que las tablas creadas en el conjunto de datos sean temporales, ya que no durarán más que el tiempo de actividad del conjunto de datos. Puedes poner prefijos en todos los nombres de las tablas de este conjunto de datos mediante
temp
para indicar con claridad que las tablas son temporales. TTL de la tabla: Crea una tabla que tenga un tiempo de actividad específico para la tabla mediante declaraciones del 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 se necesita una tabla temporal solo dentro del mismo bloque, usa un resultado temporal mediante una declaración o subconsultaWITH
.
Declaración CREATE SEQUENCE
Las secuencias no se usan en BigQuery; esto se puede lograr de la siguiente manera por lotes. Para obtener más información sobre las claves sustitutas y el cambio lento de las dimensiones (SCD), consulta las siguientes guías:
INSERT INTO dataset.table
SELECT *,
ROW_NUMBER() OVER () AS id
FROM dataset.table
Declaración CREATE VIEW
En la siguiente tabla, se muestran equivalencias de la declaración CREATE VIEW
entre Oracle y BigQuery.
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 nueva vista solo si la vista no existe actualmente en el conjunto de datos especificado. |
Declaración CREATE MATERIALIZED VIEW
En BigQuery, las operaciones de actualización de vistas materializadas se realizan de forma automática. No es necesario especificar opciones de actualización (por ejemplo, en la confirmación o según la programación) en BigQuery. Para obtener más información, consulta Introducción a las vistas materializadas.
En caso de que la tabla base cambie solo mediante anexos, la consulta que usa la vista materializada (ya sea que el optimizador de consultas haga referencia a ella o la seleccione de forma explícita) analiza toda la vista materializada más un delta en 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 hubo alguna actualización (DML UPDATE/MERGE) o eliminación (DML DELETE, t, truncamiento, vencimiento de la partición) en la tabla base desde la última actualización de la vista, la vista materializada no se analiza y, por lo tanto, la consulta no obtiene ningún ahorro hasta la próxima actualización de la vista. En esencia, 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 transmisión de la tabla base no se guardan en la vista materializada. El búfer de transmisión aún se está analizando por completo, independientemente de si se usa la vista materializada.
En la siguiente tabla, se muestran equivalencias de la declaración CREATE MATERIALIZED VIEW
entre Oracle y BigQuery.
Oracle | BigQuery | Notas |
---|---|---|
CREATE MATERIALIZED VIEW view_name
|
CREATE MATERIALIZED VIEW
|
Declaración CREATE [UNIQUE] INDEX
En esta sección, se describen los enfoques en BigQuery para crear una funcionalidad similar a los índices en Oracle.
Indexa en favor del 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 proporciona funciones como la partición y el agrupamiento en clústeres, además de los campos anidados, que pueden aumentar la eficiencia y el rendimiento de las consultas mediante la optimización de la forma en que se almacenan los datos.
Indexa en favor de la coherencia (UNIQUE, PRIMARY INDEX)
En Oracle, se puede usar un índice único para evitar filas con claves que no sean ú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 y se muestra una infracción del índice.
Debido a que BigQuery no proporciona índices explícitos, se puede usar una declaración MERGE
en su lugar para insertar solo registros únicos en una tabla de destino desde una tabla de etapa de pruebas 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 en los registros duplicados de BigQuery, puedes usar una declaración MERGE
de la tabla de etapa de pruebas, como se muestra en el siguiente ejemplo.
Oracle | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t \
|
Por lo general, los usuarios prefieren quitar los duplicados de forma independiente para encontrar errores en los sistemas posteriores.
BigQuery no admite las columnas DEFAULT
ni IDENTITY
(secuencias).
Bloqueo
BigQuery no tiene un mecanismo de bloqueo como Oracle y puede ejecutar consultas simultáneas (hasta completar tu cuota). Solo las declaraciones DML tienen ciertos límites de simultaneidad y pueden requerir un bloqueo de la tabla durante la ejecución en algunos casos.
Instrucciones de SQL de procedimiento
En esta sección, se describe cómo convertir las instrucciones de SQL de procedimiento que se usan en procedimientos, funciones y activadores almacenados de Oracle a BigQuery.
Declaración CREATE PROCEDURE
El procedimiento almacenado es compatible con la fase Beta de la secuencia de comandos de BigQuery.
Oracle | BigQuery | Notas |
---|---|---|
CREATE PROCEDURE
|
CREATE PROCEDURE
|
Al igual que en Oracle, BigQuery admite modos de argumento IN, OUT, INOUT . BigQuery no admite otras especificaciones de sintaxis.
|
CREATE OR REPLACE PROCEDURE
|
CREATE OR REPLACE PROCEDURE
|
|
CALL
|
CALL
|
En las siguientes secciones, se describen las maneras de convertir las declaraciones de procedimiento de Oracle existentes en declaraciones de scripting de BigQuery que funcionan de manera similar.
Declaración CREATE TRIGGER
No se usan activadores en BigQuery. La lógica de aplicación basada en filas debe manejarse en la capa de aplicación. La funcionalidad del activador se puede lograr mediante la herramienta de transferencia, Pub/Sub o Cloud Run Functions durante el tiempo de transferencia o mediante análisis regulares.
Declaración y asignación de variables
En la siguiente tabla, se muestran las declaraciones DECLARE
de Oracle y sus equivalentes de BigQuery.
Oracle | BigQuery |
---|---|
DECLARE
|
DECLARE L_VAR int64;
|
SET var = value;
|
SET var = value;
|
Declaraciones y operaciones del cursor
BigQuery no admite cursores, por lo que las siguientes declaraciones no se usan 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 de SQL dinámicas
La siguiente instrucción de SQL dinámica de Oracle y su equivalente de 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 de 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 declaraciones LOOP .
|
BREAK
|
BREAK
|
CONTINUE
|
CONTINUE
|
CONTINUE/EXIT WHEN
|
Usa CONTINUE con la condición IF .
|
GOTO
|
La declaración GOTO no existe en BigQuery. Usa la condición IF .
|
Instrucciones de SQL de transacciones y metadatos
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 Garantías de coherencia y aislamiento de transacción en este documento. |
EXPLAIN PLAN ...
|
No se usa en BigQuery.
Funciones similares a este elemento son la explicación del plan de consulta en la IU web de BigQuery y la asignación de ranuras, en el registro de auditoría de 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 de sesión tradicional. Puedes ver los trabajos de consulta en la IU o exportar los registros de auditoría de Stackdriver a BigQuery y analizar los registros de BigQuery para analizar trabajos. Para obtener más información, consulta Visualiza los detalles del trabajo. |
START TRANSACTION;
|
El equivalente a una transacción es reemplazar el contenido de una tabla por el resultado de la consulta. Puedes hacerlo con una operación de consulta o una operación de copiado.
Mediante una consulta:
Mediante una copia:
|
Instrucciones de SQL de varias instrucciones y varias líneas
Oracle y BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten declaraciones separadas por punto y coma que se ejecutan juntas de manera coherente. Para obtener más información, consulta Transacciones de varias declaraciones.
Mensajes y códigos de error
Los códigos de error de Oracle y los de BigQuery son diferentes. Si la lógica de tu aplicación detecta los errores, intenta quitar la fuente del error, ya que BigQuery no muestra los mismos códigos de error.
Garantías de coherencia y aislamiento de transacción
Tanto Oracle como BigQuery son atómicos, es decir, cumplen con el estándar ACID en un nivel por transformació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 transacción confirmados o serializables. Los interbloqueos son posibles. Los trabajos de anexo de inserción de Oracle se ejecutan de forma independiente.
BigQuery también admite transacciones.
BigQuery ayuda a garantizar el control de simultaneidad optimista (gana el primero en confirmarse) con el aislamiento de instantáneas, de modo que una consulta lea los últimos datos que se confirmaron antes de comenzar la consulta. Este enfoque garantiza el mismo nivel de coherencia por fila, por transformación y entre filas dentro de la misma declaración DML y evita los interbloqueos. En el caso de varias declaraciones UPDATE
en la misma tabla, BigQuery cambia al control de simultaneidad pesimista y pone en cola varias declaraciones UPDATE
; además se realizan reintentos de forma automática en caso de conflictos. Las declaraciones DML INSERT
y los trabajos de carga se pueden ejecutar de forma independiente y simultánea para agregar contenido a las tablas.
Revertir
Oracle admite reversiones. En BigQuery no hay un límite de transacciones explícito, por lo que no hay un concepto de reversión explícita. Las soluciones alternativas son los decoradores de tablas o el uso de FOR SYSTEM_TIME AS OF
.
Límites de bases de datos
Verifica las cuotas y los límites más recientes de BigQuery. Para aumentar las cuotas de los usuarios de gran volumen, comunícate con el servicio de Atención al cliente de Cloud. En la siguiente tabla, se muestra una comparación de los límites de bases de datos de Oracle y BigQuery.
Límite | Oracle | BigQuery |
---|---|---|
Tablas por base de datos | Sin restricciones | Sin restricciones |
Columnas por tabla | 1000 | 10,000 |
Tamaño máximo de fila | Ilimitado (depende del tipo de columna) | 100 MB |
Longitud del nombre de la columna y la tabla | Si v12.2>= 128 bytes
De los demás 30 bytes |
16,384 caracteres Unicode |
Filas por tabla | Ilimitado | Ilimitado |
Longitud máxima de la solicitud de SQL | Ilimitado | 1 MB (extensión máxima de la consulta de GoogleSQL sin resolver)
12 MB (extensión máxima de la consulta de GoogleSQL resuelta) Transmisión:
|
Tamaño máximo de solicitudes y respuestas | Ilimitado | 10 MB (solicitud) y 10 GB (respuesta) o casi sin límite si usas la paginación o la API de Cloud Storage |
Cantidad máxima de sesiones simultáneas | Limitado por las sesiones o los parámetros de procesos | 100 consultas simultáneas (se pueden generar con una reserva de ranura) y 300 solicitudes a la API simultáneas por usuario. |
Cantidad máxima de cargas (rápidas) simultáneas | Limitado por las sesiones o los parámetros de procesos | Sin límite de simultaneidad; los trabajos se ponen en cola. 100,000 trabajos de carga por proyecto por día |
Otros límites de Oracle Database incluyen los límites de tipos de datos, límites de bases de datos físicas, límites lógicos de bases de datos y límites de procesos y entornos de ejecución.