Oracle SQL 변환 가이드

이 문서에서는 마이그레이션을 계획하는 데 도움이 되도록 Oracle과 BigQuery 간 SQL 문법 유사점과 차이점을 자세히 설명합니다. 일괄 SQL 변환을 사용하여 SQL 스크립트를 일괄적으로 마이그레이션하거나 대화형 SQL 변환을 사용하여 임시 쿼리를 변환합니다.

데이터 유형

이 섹션에서는 Oracle과 BigQuery의 데이터 유형 간의 유사점을 보여줍니다.

Oracle BigQuery 참고
VARCHAR2 STRING
NVARCHAR2 STRING
CHAR STRING
NCHAR STRING
CLOB STRING
NCLOB STRING
INTEGER INT64
SHORTINTEGER INT64
LONGINTEGER INT64
NUMBER NUMERIC BigQuery에서는 정밀도나 규모에 대한 커스텀 값을 사용자가 지정할 수 없습니다. 따라서 Oracle의 열이 정의되어 BigQuery에서 지원하는 것보다 더 큰 규모를 갖게 될 수 있습니다.

또한 10진수를 저장하기 전에 Oracle은 해당 숫자의 소수점 이하 자릿수가 해당 열에 지정된 것보다 많은 경우 반올림합니다. BigQuery에서는 ROUND() 함수를 사용하여 이 기능을 구현할 수 있습니다.

NUMBER(*, x) NUMERIC BigQuery에서는 정밀도나 규모에 대한 커스텀 값을 사용자가 지정할 수 없습니다. 따라서 Oracle의 열이 정의되어 BigQuery에서 지원하는 것보다 더 큰 규모를 갖게 될 수 있습니다.

또한 10진수를 저장하기 전에 Oracle은 해당 숫자의 소수점 이하 자릿수가 해당 열에 지정된 것보다 많은 경우 반올림합니다. BigQuery에서는 ROUND() 함수를 사용하여 이 기능을 구현할 수 있습니다.

NUMBER(x, -y) INT64 사용자가 10진수를 저장하려고 하면 Oracle이 정수로 반올림합니다. BigQuery의 경우 INT64로 정의된 열에 소수점을 저장하려고 하면 오류가 발생합니다. 이 경우 ROUND() 함수를 적용해야 합니다.

BigQuery INT64 데이터 유형은 최대 18자리의 정밀도를 허용합니다. 숫자 필드에 18자리가 넘는 숫자가 있는 경우 BigQuery에서 FLOAT64 데이터 유형을 사용해야 합니다.

NUMBER(x) INT64 사용자가 10진수를 저장하려고 하면 Oracle이 정수로 반올림합니다. BigQuery의 경우 INT64로 정의된 열에 소수점을 저장하려고 하면 오류가 발생합니다. 이 경우 ROUND() 함수를 적용해야 합니다.

BigQuery INT64 데이터 유형은 최대 18자리의 정밀도를 허용합니다. 숫자 필드에 18자리가 넘는 숫자가 있는 경우 BigQuery에서 FLOAT64 데이터 유형을 사용해야 합니다.

FLOAT FLOAT64/NUMERIC FLOAT는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64는 대략적인 데이터 유형입니다. NUMERIC가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
BINARY_DOUBLE FLOAT64/NUMERIC FLOAT는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64는 대략적인 데이터 유형입니다. NUMERIC가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
BINARY_FLOAT FLOAT64/NUMERIC FLOAT는 정확한 데이터 유형이며 Oracle의 NUMBER 하위유형입니다. BigQuery에서 FLOAT64는 대략적인 데이터 유형입니다. NUMERIC가 BigQuery의 FLOAT 유형에 더 적합할 수 있습니다.
LONG BYTES LONG 데이터 유형은 이전 버전에서 사용되며 새 버전의 Oracle Database에서는 권장되지 않습니다.

BigQuery에 LONG 데이터를 보관해야 하는 경우 BigQuery의 BYTES 데이터 유형을 사용할 수 있습니다. 더 나은 방법은 바이너리 객체를 Cloud Storage에 배치하고 BigQuery에 참조를 보관하는 것입니다.

BLOB BYTES BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 쿼리되지 않고 분석에 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
BFILE STRING 바이너리 파일은 Cloud Storage에 저장할 수 있으며 STRING 데이터 유형은 BigQuery 테이블에서 파일을 참조하는 데 사용할 수 있습니다.
DATE DATETIME
TIMESTAMP TIMESTAMP BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.

BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.

BigQuery에서는 Oracle의 TIMESTAMP WITH LOCAL TIME ZONE 기능과 일치하도록 시간대 변환을 수동으로 실행해야 합니다.

TIMESTAMP(x) TIMESTAMP BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.

BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.

BigQuery에서는 Oracle의 TIMESTAMP WITH LOCAL TIME ZONE 기능과 일치하도록 시간대 변환을 수동으로 실행해야 합니다.

TIMESTAMP WITH TIME ZONE TIMESTAMP BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.

BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.

BigQuery에서는 Oracle의 TIMESTAMP WITH LOCAL TIME ZONE 기능과 일치하도록 시간대 변환을 수동으로 실행해야 합니다.

TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMP BigQuery는 0~9 범위의 정밀도를 지원하는 Oracle과 비교하여 마이크로초 정밀도(10-6)를 지원합니다.

BigQuery는 TZ 데이터베이스의 시간대 지역 이름과 UTC의 시간대 오프셋을 지원합니다.

BigQuery에서는 Oracle의 TIMESTAMP WITH LOCAL TIME ZONE 기능과 일치하도록 시간대 변환을 수동으로 실행해야 합니다.

INTERVAL YEAR TO MONTH STRING 간격 값은 BigQuery에 STRING 데이터 유형으로 저장할 수 있습니다.
INTERVAL DAY TO SECOND STRING 간격 값은 BigQuery에 STRING 데이터 유형으로 저장할 수 있습니다.
RAW BYTES BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 분석에서 쿼리되고 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
LONG RAW BYTES BYTES 데이터 유형은 가변 길이 바이너리 데이터를 저장하는 데 사용할 수 있습니다. 이 필드가 분석에서 쿼리되고 사용되지 않는 경우 Cloud Storage에 바이너리 데이터를 저장하는 것이 좋습니다.
ROWID STRING 이러한 데이터 유형은 Oracle 내부에서 테이블의 행에 대한 고유한 주소를 지정하는 데 사용됩니다. 일반적으로 ROWID 또는 UROWID 필드는 애플리케이션에서 사용하면 안 됩니다. 하지만 이 경우 STRING 데이터 유형을 사용하여 이 데이터를 보관할 수 있습니다.

유형 형식 지정

Oracle SQL은 표현식과 열 데이터를 표시하고 데이터 유형 간 변환을 위해 매개변수로 설정된 기본 형식 집합을 사용합니다. 예를 들어 NLS_DATE_FORMATYYYY/MM/DD 형식으로 설정하면 기본적으로 YYYY/MM/DD로 날짜가 지정됩니다. Oracle 온라인 문서에서 NLS 설정에 관해 자세히 알아보세요. BigQuery에는 초기화 매개변수가 없습니다.

기본적으로 BigQuery는 로드할 때 모든 소스 데이터가 UTF-8로 인코딩되는 것으로 예상합니다. CSV 파일에 ISO-8859-1 형식으로 인코딩된 데이터가 있는 경우 데이터를 가져올 때 인코딩을 명시적으로 지정할 수 있습니다. 그래야 BigQuery에서 가져오기 프로세스 중에 데이터를 UTF-8로 올바르게 변환할 수 있습니다.

ISO-8859-1 또는 UTF-8로 인코딩된 데이터만 가져올 수 있습니다. BigQuery는 데이터를 UTF-8로 인코딩하여 저장하고 반환합니다. 원하는 날짜 형식 또는 시간대는 DATETIMESTAMP 함수에서 설정할 수 있습니다.

타임스탬프 및 날짜 유형 형식 지정

타임스탬프 및 날짜 형식 지정 요소를 Oracle에서 BigQuery로 변환할 때는 다음 표에 요약된 것과 같이 TIMESTAMPDATETIME 간의 시간대 차이에 주의해야 합니다.

형식(CURRENT_*)은 함수가 아닌 키워드이므로 Oracle 형식에는 괄호를 사용하지 않습니다.

Oracle BigQuery 참고
CURRENT_TIMESTAMP Oracle의 TIMESTAMP 정보에는 열 정의 또는 설정 TIME_ZONE 변수의 WITH TIME ZONE에 따라 정의되는 여러 시간대 정보가 있을 수 있습니다. 가능한 경우 ISO 형식으로 지정된 CURRENT_TIMESTAMP() 함수를 사용하세요. 그러나 출력 형식은 항상 UTC 시간대로 표시됩니다. 내부적으로 BigQuery에는 시간대가 없습니다.

ISO 형식과의 차이점에 대한 다음 사항에 유의하세요.

DATETIME 형식은 출력 채널 규칙에 따라 지정됩니다. BigQuery 명령줄 도구와 BigQuery 콘솔 DATETIME에서는 RFC 3339에 따라 T 구분 기호를 사용하여 형식이 지정됩니다. 그러나 Python 및 자바 JDBC에서는 공백이 구분 기호로 사용됩니다.

명시적 형식을 사용하려면 문자열을 명시적으로 변환하는 FORMAT_DATETIME() 함수를 사용하세요. 예를 들어 CAST(CURRENT_DATETIME() AS STRING) 표현식은 항상 공백 구분 기호를 반환합니다.

CURRENT_DATE
SYSDATE
Oracle은 날짜에 2가지 유형을 사용합니다.
  • 유형 12
  • 유형 13
Oracle은 날짜를 저장할 때 유형 12를 사용합니다. 내부적으로는 이는 고정 길이의 숫자입니다. Oracle은 SYSDATE or CURRENT_DATE에서 반환할 때 유형 13을 사용합니다.
BigQuery에는 항상 ISO 8601 형식으로 날짜를 반환하는 별도의 DATE 형식이 사용됩니다.

DATE_FROM_UNIX_DATE는 1970 기반이므로 사용할 수 없습니다.

CURRENT_DATE-3 날짜 값은 정수로 표시됩니다. Oracle은 날짜 유형의 산술 연산자를 지원합니다. 날짜 유형의 경우 DATE_ADD() 또는 DATE_SUB()를 사용하세요. BigQuery는 INT64, NUMERIC, FLOAT64 데이터 유형에 산술 연산자를 사용합니다.
NLS_DATE_FORMAT 세션 또는 시스템 날짜 형식을 설정하세여요. BigQuery는 항상 ISO 8601을 사용하므로 Oracle 날짜와 시간을 변환해야 합니다.

쿼리 구문

이 섹션에서는 Oracle과 BigQuery 간 쿼리 문법의 차이점을 설명합니다.

SELECT

대부분의 Oracle SELECT 문은 BigQuery와 호환됩니다.

함수, 연산자, 표현식

다음 섹션에는 Oracle 함수와 그에 해당하는 BigQuery 함수 간의 매핑이 나와 있습니다.

비교 연산자

Oracle 및 BigQuery 비교 연산자는 ANSI SQL:2011을 준수합니다. 아래 표의 비교 연산자는 BigQuery와 Oracle에서 동일합니다. BigQuery에서는 REGEXP_LIKE 대신 REGEXP_CONTAINS를 사용할 수 있습니다.

연산자 설명
"=" 같음
<> 같지 않음
!= 같지 않음
> 보다 큼
>= 이상
< 보다 작음
<= 작거나 같음
IN ( ) 목록의 값과 일치
NOT 조건을 부정함
BETWEEN 범위 내(경계 포함)
IS NULL NULL
IS NOT NULL NULL 값이 아님
LIKE %를 사용한 패턴 일치
EXISTS 서브 쿼리가 하나 이상의 행을 반환하면 조건이 충족됨

테이블의 연산자는 BigQuery와 Oracle에서 동일합니다.

논리 표현식 및 함수

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

집계 함수

다음 표에서는 일반적인 Oracle 집계, 통계 집계, 근사치 집계 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.

Oracle BigQuery
ANY_VALUE
(Oracle 19c부터)
ANY_VALUE
APPROX_COUNT HLL_COUNT set of functions with specified precision
APPROX_COUNT_DISTINCT APPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT_AGG APPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT_DETAIL APPROX_COUNT_DISTINCT
APPROX_PERCENTILE(percentile) WITHIN GROUP (ORDER BY expression) APPROX_QUANTILES(expression, 100)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]

BigQuery는 Oracle이 정의하는 나머지 인수를 지원하지 않습니다.
<codeAPPROX_PERCENTILE_AGG APPROX_QUANTILES(expression, 100)[
OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
APPROX_PERCENTILE_DETAIL APPROX_QUANTILES(expression, 100)[OFFSET(CAST(TRUNC(percentile * 100) as INT64))]
APPROX_SUM APPROX_TOP_SUM(expression, weight, number)
AVG AVG
BIT_COMPLEMENT 비트 NOT 연산자: ~
BIT_OR BIT_OR, X | Y
BIT_XOR BIT_XOR, X ^ Y
BITAND BIT_AND, X & Y
CARDINALITY COUNT
COLLECT BigQuery는 TYPE AS TABLE OF를 지원하지 않습니다. BigQuery에서 STRING_AGG() 또는 ARRAY_AGG()를 사용해 보세요.
CORR/CORR_K/ CORR_S CORR
COUNT COUNT
COVAR_POP COVAR_POP
COVAR_SAMP COVAR_SAMP
FIRST BigQuery에 암시적으로 존재하지 않습니다. 사용자 정의 함수(UDF)를 사용해 보세요.
GROUP_ID BigQuery에는 사용되지 않습니다.
GROUPING BigQuery에는 사용되지 않습니다.
GROUPING_ID BigQuery에는 사용되지 않습니다.
LAST BigQuery에 암시적으로 존재하지 않습니다. UDF를 사용해 보세요.
LISTAGG STRING_AGG, ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC|DESC}] [, ... ]] [LIMIT n])
MAX MAX
MIN MIN
OLAP_CONDITION Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
OLAP_EXPRESSION Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
OLAP_EXPRESSION_BOOL Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
OLAP_EXPRESSION_DATE Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
OLAP_EXPRESSION_TEXT Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
OLAP_TABLE Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
POWERMULTISET Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
POWERMULTISET_BY_CARDINALITY Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
QUALIFY Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
REGR_AVGX AVG(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, ind_var_expr)
)
REGR_AVGY AVG(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, dep_var_expr)
)
REGR_COUNT SUM(
IF(dep_var_expr is NULL
OR ind_var_expr is NULL,
NULL, 1)
)
REGR_INTERCEPT AVG(dep_var_expr)
- AVG(ind_var_expr)
* (COVAR_SAMP(ind_var_expr,dep_var_expr)
/ VARIANCE(ind_var_expr)
)
REGR_R2 (COUNT(dep_var_expr) *
SUM(ind_var_expr * dep_var_expr) -
SUM(dep_var_expr) * SUM(ind_var_expr))
/ SQRT(
(COUNT(ind_var_expr) *
SUM(POWER(ind_var_expr, 2)) *
POWER(SUM(ind_var_expr),2)) *
(COUNT(dep_var_expr) *
SUM(POWER(dep_var_expr, 2)) *
POWER(SUM(dep_var_expr), 2)))
REGR_SLOPE COVAR_SAMP(ind_var_expr,

dep_var_expr)

/ VARIANCE(ind_var_expr)

REGR_SXX SUM(POWER(ind_var_expr, 2)) - COUNT(ind_var_expr) * POWER(AVG(ind_var_expr),2)
REGR_SXY SUM(ind_var_expr*dep_var_expr) - COUNT(ind_var_expr) * AVG(ind) * AVG(dep_var_expr)
REGR_SYY SUM(POWER(dep_var_expr, 2)) - COUNT(dep_var_expr) * POWER(AVG(dep_var_expr),2)
ROLLUP ROLLUP
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP, STDDEV
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP, VARIANCE
WM_CONCAT STRING_AGG

BigQuery는 다음과 같은 집계 함수를 추가로 제공합니다.

분석 함수

다음 표는 일반적인 Oracle 분석 함수와 집계 분석 함수 간의 매핑과 그에 해당하는 BigQuery 항목을 보여줍니다.

Oracle BigQuery
AVG AVG
BIT_COMPLEMENT 비트 NOT 연산자: ~
BIT_OR BIT_OR, X | Y
BIT_XOR BIT_XOR, X ^ Y
BITAND BIT_AND, X & Y
BOOL_TO_INT CAST(X AS INT64)
COUNT COUNT
COVAR_POP COVAR_POP
COVAR_SAMP COVAR_SAMP
CUBE_TABLE BigQuery에서 지원되지 않습니다. BI 도구 또는 커스텀 UDF를 사용해 보세요.
CUME_DIST CUME_DIST
DENSE_RANK(ANSI) DENSE_RANK
FEATURE_COMPARE BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요.
FEATURE_DETAILS BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요.
FEATURE_ID BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요.
FEATURE_SET BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요.
FEATURE_VALUE BigQuery에 암시적으로 존재하지 않습니다. UDF 및 BigQuery ML을 사용해 보세요.
FIRST_VALUE FIRST_VALUE
HIER_CAPTION BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_CHILD_COUNT BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_COLUMN BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_DEPTH BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_DESCRIPTION BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_HAS_CHILDREN BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_LEVEL BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_MEMBER_NAME BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_ORDER BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
HIER_UNIQUE_MEMBER_NAME BigQuery에서는 계층적 쿼리가 지원되지 않습니다.
LAST_VALUE LAST_VALUE
LAG LAG
LEAD LEAD
LISTAGG ARRAY_AGG
STRING_AGG
ARRAY_CONCAT_AGG
MATCH_NUMBER BigQuery에서 정규식과 UDF를 사용하여 패턴 인식 및 계산을 실행할 수 있습니다.
MATCH_RECOGNIZE BigQuery에서 정규식과 UDF를 사용하여 패턴 인식 및 계산을 실행할 수 있습니다.
MAX MAX
MEDIAN PERCENTILE_CONT(x, 0.5 RESPECT NULLS) OVER()
MIN MIN
NTH_VALUE NTH_VALUE (value_expression, constant_integer_expression [{RESPECT | IGNORE} NULLS])
NTILE NTILE(constant_integer_expression)
PERCENT_RANK
PERCENT_RANKM
PERCENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC
PERCENTILE_CONT
PERCENTILE_CONT
PERCENTILE_DISC
PERCENTILE_DISC
PRESENTNNV Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
PRESENTV Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
PREVIOUS Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RANK(ANSI) RANK
RATIO_TO_REPORT(expr) OVER (partition clause) expr / SUM(expr) OVER (partition clause)
ROW_NUMBER ROW_NUMBER
STDDEV_POP STDDEV_POP
STDDEV_SAMP STDDEV_SAMP, STDDEV
SUM SUM
VAR_POP VAR_POP
VAR_SAMP VAR_SAMP, VARIANCE
VARIANCE VARIANCE()
WIDTH_BUCKET UDF를 사용할 수 있습니다.

날짜/시간 함수

다음 표는 일반적인 Oracle 날짜/시간 함수와 그에 해당하는 BigQuery 함수 간의 매핑을 보여줍니다.

Oracle BigQuery
ADD_MONTHS(date, integer) DATE_ADD(date, INTERVAL integer MONTH),
날짜가 TIMESTAMP인 경우 다음을 사용할 수 있습니다.

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

CURRENT_DATE CURRENT_DATE
CURRENT_TIME CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
DATE - k DATE_SUB(date_expression, INTERVAL k DAY)
DATE + k DATE_ADD(date_expression, INTERVAL k DAY)
DBTIMEZONE BigQuery는 데이터베이스 시간대를 지원하지 않습니다.
EXTRACT EXTRACT(DATE), EXTRACT(TIMESTAMP)
LAST_DAY DATE_SUB(
  DATE_TRUNC(
    DATE_ADD(
      date_expression,
      INTERVAL 1 MONTH
    ),
  MONTH
  ),
INTERVAL 1 DAY
)
LOCALTIMESTAMP BigQuery는 시간대 설정을 지원하지 않습니다.
MONTHS_BETWEEN DATE_DIFF(date_expression, date_expression, MONTH)
NEW_TIME DATE(timestamp_expression, time zone)
TIME(timestamp, time zone)
DATETIME(timestamp_expression, time zone)
NEXT_DAY DATE_ADD(
  DATE_TRUNC(
    date_expression,
    WEEK(day_value)
  ),
  INTERVAL 1 WEEK
)
SYS_AT_TIME_ZONE CURRENT_DATE([time_zone])
SYSDATE CURRENT_DATE()
SYSTIMESTAMP CURRENT_TIMESTAMP()
TO_DATE PARSE_DATE
TO_TIMESTAMP PARSE_TIMESTAMP
TO_TIMESTAMP_TZ PARSE_TIMESTAMP
TZ_OFFSET BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요.
WM_CONTAINS
WM_EQUALS
WM_GREATERTHAN
WM_INTERSECTION
WM_LDIFF
WM_LESSTHAN
WM_MEETS
WM_OVERLAPS
WM_RDIFF
BigQuery에서는 마침표가 사용되지 않습니다. UDF를 사용하여 두 기간을 비교할 수 있습니다.

BigQuery는 다음과 같은 날짜/시간 함수를 추가로 제공합니다.

문자열 함수

다음 표에서는 Oracle 문자열 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.

Oracle BigQuery
ASCII TO_CODE_POINTS(string_expr)[OFFSET(0)]
ASCIISTR BigQuery에서 UTF-16을 지원하지 않음
RAWTOHEX TO_HEX
LENGTH CHAR_LENGTH
LENGTH CHARACTER_LENGTH
CHR CODE_POINTS_TO_STRING(
[mod(numeric_expr, 256)]
)
COLLATION BigQuery에 존재하지 않습니다. BigQuery는 DML에서 COLLATE를 지원하지 않음
COMPOSE 커스텀 사용자 정의 함수입니다.
CONCAT, (|| operator) CONCAT
DECOMPOSE 커스텀 사용자 정의 함수입니다.
ESCAPE_REFERENCE (UTL_I18N) BigQuery에서는 지원되지 않습니다. 사용자 정의 함수를 사용해 보세요.
INITCAP INITCAP
INSTR/INSTR2/INSTR4/INSTRB/INSTRC 커스텀 사용자 정의 함수입니다.
LENGTH/LENGTH2/LENGTH4/LENGTHB/LENGTHC LENGTH
LOWER LOWER
LPAD LPAD
LTRIM LTRIM
NLS_INITCAP 커스텀 사용자 정의 함수입니다.
NLS_LOWER LOWER
NLS_UPPER UPPER
NLSSORT Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
POSITION STRPOS(string, substring)
PRINTBLOBTOCLOB Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
REGEXP_COUNT ARRAY_LENGTH(REGEXP_EXTRACT_ALL(value, regex))
REGEXP_INSTR STRPOS(source_string, REGEXP_EXTRACT(source_string, regexp_string))

참고: 첫 번째 어커런스를 반환합니다.

REGEXP_REPLACE REGEXP_REPLACE
REGEXP_LIKE IF(REGEXP_CONTAINS,1,0)
REGEXP_SUBSTR REGEXP_EXTRACT, REGEXP_EXTRACT_ALL
REPLACE REPLACE
REVERSE REVERSE
RIGHT SUBSTR(source_string, -1, length)
RPAD RPAD
RTRIM RTRIM
SOUNDEX BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요.
STRTOK SPLIT(instring, delimiter)[ORDINAL(tokennum)]

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

SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4 SUBSTR
TRANSLATE REPLACE
TRANSLATE USING REPLACE
TRIM TRIM
UNISTR CODE_POINTS_TO_STRING
UPPER UPPER
||(수직 막대) CONCAT

BigQuery는 다음과 같은 문자열 함수를 추가로 제공합니다.

수학 함수

다음 표에서는 Oracle 수학 함수와 이에 상응하는 BigQuery 함수 간의 매핑을 확인할 수 있습니다.

Oracle BigQuery
ABS ABS
ACOS ACOS
ACOSH ACOSH
ASIN ASIN
ASINH ASINH
ATAN ATAN
ATAN2 ATAN2
ATANH ATANH
CEIL CEIL
CEILING CEILING
COS COS
COSH COSH
EXP EXP
FLOOR FLOOR
GREATEST GREATEST
LEAST LEAST
LN LN
LNNVL ISNULL과 함께 사용합니다.
LOG LOG
MOD (% operator) MOD
POWER (** operator) POWER, POW
DBMS_RANDOM.VALUE RAND
RANDOMBYTES BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 RAND 함수를 사용해 보세요.
RANDOMINTEGER CAST(FLOOR(10*RAND()) AS INT64)
RANDOMNUMBER BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 RAND 함수를 사용해 보세요.
REMAINDER MOD
ROUND ROUND
ROUND_TIES_TO_EVEN ROUND()
SIGN SIGN
SIN SIN
SINH SINH
SQRT SQRT
STANDARD_HASH FARM_FINGERPRINT, MD5, SHA1, SHA256, SHA512
STDDEV STDDEV
TAN TAN
TANH TANH
TRUNC TRUNC
NVL IFNULL(expr, 0), COALESCE(exp, 0)

BigQuery는 다음과 같은 수학 함수를 추가로 제공합니다.

유형 변환 함수

다음 표에서는 Oracle 유형 변환 함수와 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.

Oracle BigQuery
BIN_TO_NUM SAFE_CONVERT_BYTES_TO_STRING(value)

CAST(x AS INT64)

BINARY2VARCHAR SAFE_CONVERT_BYTES_TO_STRING(value)
CAST
CAST_FROM_BINARY_DOUBLE
CAST_FROM_BINARY_FLOAT
CAST_FROM_BINARY_INTEGER
CAST_FROM_NUMBER
CAST_TO_BINARY_DOUBLE
CAST_TO_BINARY_FLOAT
CAST_TO_BINARY_INTEGER
CAST_TO_NUMBER
CAST_TO_NVARCHAR2
CAST_TO_RAW
>CAST_TO_VARCHAR
CAST(expr AS typename)
CHARTOROWID Oracle 관련은 필요하지 않습니다.
CONVERT BigQuery는 문자 집합을 지원하지 않습니다. 커스텀 사용자 정의 함수를 사용해 보세요.
EMPTY_BLOB BLOB는 BigQuery에서 사용되지 않습니다.
EMPTY_CLOB CLOB는 BigQuery에서 사용되지 않습니다.
FROM_TZ 시간대가 있는 유형은 BigQuery에서 지원되지 않습니다. 사용자 정의 함수 및 FORMAT_TIMESTAMP를 사용해 보세요.
INT_TO_BOOL CAST
IS_BIT_SET BigQuery에 암시적으로 존재하지 않습니다. UDF를 사용해 보세요.
NCHR UDF를 사용하여 바이너리의 char 등가 항목을 가져올 수 있습니다.
NUMTODSINTERVAL BigQuery에서 INTERVAL 데이터 유형이 지원되지 않음
NUMTOHEX BigQuery에서 지원되지 않습니다. 커스텀 UDF 및 TO_HEX 함수를 사용해 보세요.
NUMTOHEX2
NUMTOYMINTERVAL BigQuery에서는 INTERVAL 데이터 유형이 지원되지 않습니다.
RAW_TO_CHAR Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAW_TO_NCHAR Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAW_TO_VARCHAR2 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAWTOHEX Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAWTONHEX Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAWTONUM Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAWTONUM2 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
RAWTOREF Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
REFTOHEX Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
REFTORAW Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
ROWIDTOCHAR ROWID는 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 문자열로 표시해야 합니다.
ROWIDTONCHAR ROWID는 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 문자열로 표시해야 합니다.
SCN_TO_TIMESTAMP SCN은 Oracle 관련 유형이며 BigQuery에 존재하지 않습니다. 이 값은 타임스탬프로 표시되어야 합니다.
TO_ACLID
TO_ANYLOB
TO_APPROX_COUNT_DISTINCT
TO_APPROX_PERCENTILE
TO_BINARY_DOUBLE
TO_BINARY_FLOAT
TO_BLOB
TO_CHAR
TO_CLOB
TO_DATE
TO_DSINTERVAL
TO_LOB
TO_MULTI_BYTE
TO_NCHAR
TO_NCLOB
TO_NUMBER
TO_RAW
TO_SINGLE_BYTE
TO_TIME

TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_TIME_TZ
TO_UTC_TIMEZONE_TZ
TO_YMINTERVAL
CAST(expr AS typename)
PARSE_DATE
PARSE_TIMESTAMP
쿼리에서 사용되는 Cast 문법은 표현식의 결과 유형이 다른 유형으로 변환되어야 함을 나타냅니다.
TREAT Oracle 관련 유형이며 BigQuery에 존재하지 않습니다.
VALIDATE_CONVERSION BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요.
VSIZE BigQuery에서 지원되지 않습니다. 커스텀 UDF를 사용해 보세요.

JSON 함수

다음 표에서는 Oracle JSON 함수와 그에 상응하는 BigQuery 함수 간의 매핑을 보여줍니다.

Oracle BigQuery
AS_JSON TO_JSON_STRING(value[, pretty_print])
JSON_ARRAY UDF 및 TO_JSON_STRING 함수를 사용해 보세요.
JSON_ARRAYAGG UDF 및 TO_JSON_STRING 함수를 사용해 보세요.
JSON_DATAGUIDE 커스텀 사용자 정의 함수입니다.
JSON_EQUAL 커스텀 사용자 정의 함수입니다.
JSON_EXIST UDF 및 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR를 사용해 보세요.
JSON_MERGEPATCH 커스텀 사용자 정의 함수입니다.
JSON_OBJECT BigQuery에서 지원되지 않습니다.
JSON_OBJECTAGG BigQuery에서 지원되지 않습니다.
JSON_QUERY UDF와 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR를 사용해 보세요.
JSON_TABLE 커스텀 사용자 정의 함수입니다.
JSON_TEXTCONTAINS UDF와 JSON_EXTRACT 또는 JSON_EXTRACT_SCALAR를 사용해 보세요.
JSON_VALUE JSON_EXTRACT_SCALAR

XML 함수

BigQuery는 암시적 XML 함수를 제공하지 않습니다. XML은 문자열로 BigQuery에 로드할 수 있으며 UDF를 사용하여 XML을 파싱할 수 있습니다. 또는 Dataflow와 같은 ETL/ELT 도구로 XML 처리를 실행할 수 있습니다. 다음 목록에는 Oracle XML 함수가 나와 있습니다.

Oracle BigQuery
DELETEXML Dataflow와 같은 BigQuery UDF 또는 ETL 도구를 사용하여 XML을 처리할 수 있습니다.
ENCODE_SQL_XML
EXISTSNODE
EXTRACTCLOBXML
EXTRACTVALUE
INSERTCHILDXML
INSERTCHILDXMLAFTER
INSERTCHILDXMLBEFORE
INSERTXMLAFTER
INSERTXMLBEFORE
SYS_XMLAGG
SYS_XMLANALYZE
SYS_XMLCONTAINS
SYS_XMLCONV
SYS_XMLEXNSURI
SYS_XMLGEN
SYS_XMLI_LOC_ISNODE
SYS_XMLI_LOC_ISTEXT
SYS_XMLINSTR
SYS_XMLLOCATOR_GETSVAL
SYS_XMLNODEID
SYS_XMLNODEID_GETLOCATOR
SYS_XMLNODEID_GETOKEY
SYS_XMLNODEID_GETPATHID
SYS_XMLNODEID_GETPTRID
SYS_XMLNODEID_GETRID
SYS_XMLNODEID_GETSVAL
SYS_XMLT_2_SC
SYS_XMLTRANSLATE
SYS_XMLTYPE2SQL
UPDATEXML
XML2OBJECT
XMLCAST
XMLCDATA
XMLCOLLATVAL
XMLCOMMENT
XMLCONCAT
XMLDIFF
XMLELEMENT
XMLEXISTS
XMLEXISTS2
XMLFOREST
XMLISNODE
XMLISVALID
XMLPARSE
XMLPATCH
XMLPI
XMLQUERY
XMLQUERYVAL
XMLSERIALIZE
XMLTABLE
XMLTOJSON
XMLTRANSFORM
XMLTRANSFORMBLOB
XMLTYPE

머신러닝 함수

Oracle과 BigQuery의 머신러닝(ML) 함수는 서로 다릅니다. Oracle에서는 데이터베이스에서 ML을 실행하려면 고급 분석 팩과 라이선스가 필요합니다. Oracle은 ML에 DBMS_DATA_MINING 패키지를 사용합니다. Oracle 데이터 마이너 작업을 변환하려면 코드를 다시 작성해야 하며 BigQuery ML, AI API(Speech-to-Text, Text-to-Speech 포함), Dialogflow, Cloud Translation, NLP, Cloud Vision, Timeseries Insights API, AutoML, AutoML Tables 또는 AI Platform 등의 포괄적인 Google AI 제품군에서 선택할 수 있습니다. Google 사용자 관리 노트북을 데이터 과학자의 개발 환경으로 사용할 수 있으며 Google AI Platform Training을 사용하여 대규모로 워크로드 학습 및 스코어링을 실행할 수 있습니다. 다음 표에는 Oracle ML 함수가 나와 있습니다.

Oracle BigQuery
CLASSIFIER 머신러닝 분류기 및 회귀 옵션은 BigQuery ML을 참고하세요.
CLUSTER_DETAILS
CLUSTER_DISTANCE
CLUSTER_ID
CLUSTER_PROBABILITY
CLUSTER_SET
PREDICTION
PREDICTION_BOUNDS
PREDICTION_COST
PREDICTION_DETAILS
PREDICTION_PROBABILITY
PREDICTION_SET

보안 함수

다음 표에는 Oracle과 BigQuery에서 사용자를 식별하는 함수가 나와 있습니다.

Oracle BigQuery
UID SESSION_USER
USER/SESSION_USER/CURRENT_USER SESSION_USER()

설정 또는 배열 함수

다음 표에서는 Oracle의 설정 또는 배열 함수와 BigQuery의 해당 함수를 보여줍니다.

Oracle BigQuery
MULTISET ARRAY_AGG
MULTISET EXCEPT ARRAY_AGG([DISTINCT] expression)
MULTISET INTERSECT ARRAY_AGG([DISTINCT])
MULTISET UNION ARRAY_AGG

윈도우 함수

다음 표에서는 Oracle의 윈도우 함수와 BigQuery의 해당 함수를 보여줍니다.

Oracle BigQuery
LAG LAG (value_expression[, offset [, default_expression]])
LEAD LEAD (value_expression[, offset [, default_expression]])

계층적 또는 재귀 쿼리

계층적 또는 재귀 쿼리는 BigQuery에 사용되지 않습니다. 계층의 깊이가 알려진 경우 다음 예시에서 설명하는 것처럼 조인을 사용하면 비슷한 기능을 구현할 수 있습니다. BigQueryStorage APISpark를 활용하는 것도 또 다른 해결 방법입니다.

select
  array(
    select e.update.element
    union all
    select c1 from e.update.element.child as c1
    union all
    select c2 from e.update.element.child as c1, c1.child as c2
    union all
    select c3 from e.update.element.child as c1, c1.child as c2, c2.child as c3
    union all
    select c4 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4
    union all
    select c5 from e.update.element.child as c1, c1.child as c2, c2.child as c3, c3.child as c4, c4.child as c5
  ) as flattened,
  e as event
from t, t.events as e

다음 표에서는 Oracle의 계층적 함수를 보여줍니다.

Oracle BigQuery
DEPTH 계층적 쿼리는 BigQuery에 사용되지 않습니다.
PATH
SYS_CONNECT_BY_PATH (hierarchical)

UTL 함수

UTL_File 패키지는 주로 PL/SQL에서 운영체제 파일을 읽고 쓰는 데 사용됩니다. Cloud Storage는 모든 종류의 원시 파일 스테이징에 사용할 수 있습니다. Cloud Storage에서 파일을 읽고 쓰려면 외부 테이블과 BigQuery 로드내보내기를 사용해야 합니다. 자세한 내용은 외부 데이터 소스 소개를 참조하세요.

공간 함수

BigQuery 지리정보 분석을 사용하여 공간 함수를 대체할 수 있습니다. Oracle에는 SDO_GEOM_KEY, SDO_GEOM_MBR, SDO_GEOM_MMB와 같은 SDO_* 함수 및 유형이 있습니다. 이러한 함수는 공간 분석에 사용됩니다. 지리정보 분석을 사용하여 공간 분석을 실행할 수 있습니다.

DML 구문

이 섹션에서는 Oracle과 BigQuery 간 데이터 관리 언어 문법의 차이점을 설명합니다.

INSERT

대부분의 Oracle INSERT 문은 BigQuery와 호환됩니다. 다음 표에는 예외 사항이 나와 있습니다.

BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다. 스냅샷 격리와 세션 및 트랙잭션 처리에 관한 개요는 이 문서의 CREATE [UNIQUE] INDEX section을 참조하세요.

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

Oracle은 null 비허용 열에 DEFAULT 키워드를 제공합니다.

참고: BigQuery에서는 대상 테이블의 모든 열 값이 서수 위치에 따라 오름차순으로 포함된 경우에만 INSERT 문의 열 이름을 생략할 수 있습니다.

INSERT INTO table VALUES (1,2,3);
INSERT INTO table VALUES (4,5,6);
INSERT INTO table VALUES (7,8,9);
INSERT ALL
INTO table (col1, col2) VALUES ('val1_1', 'val1_2')
INTO table (col1, col2) VALUES ('val2_1', 'val2_2')
INTO table (col1, col2) VALUES ('val3_1', 'val3_2')
.
.
.
SELECT 1 FROM DUAL;
INSERT INTO table VALUES (1,2,3), (4,5,6),
(7,8,9);

BigQuery에는 매일 실행 가능한 DML 문 수를 제한하는 DML 할당량이 적용됩니다. 할당량을 최대한 활용하려면 다음 방법을 사용해 보세요.

  • INSERT 작업당 한 개의 행 대신 하나의 INSERT 문에서 여러 행을 결합합니다.
  • MERGE 문을 사용하여 여러 DML 문(INSERT 포함)을 결합합니다.
  • CREATE TABLE ... AS SELECT를 사용하여 새 테이블을 만들고 값을 채웁니다.

UPDATE

Oracle UPDATE 문은 대부분 BigQuery와 호환되지만 BigQuery에서는 UPDATE 문에 WHERE 절이 있어야 합니다.

가능하다면 UPDATEINSERT 문을 여러 개 사용하기 보다 일괄 DML 문을 사용하는 것이 좋습니다. BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다. 스냅샷 격리와 세션 및 트랙잭션 처리에 관한 개요는 이 문서의 CREATE INDEX 섹션을 참조하세요.

다음 표에서는 동일한 작업을 수행하는 Oracle UPDATE 문과 BigQuery 문을 보여줍니다.

BigQuery의 UPDATE 문에는 WHERE 절이 있어야 합니다. BigQuery의 UPDATE에 대한 자세한 내용은 DML 문서에서 BigQuery UPDATE 예시를 참고하세요.

DELETETRUNCATE

테이블 스키마에 영향을 주지 않고 테이블에서 행을 삭제하려면 DELETETRUNCATE 문을 사용합니다. TRUNCATE는 BigQuery에서 사용되지 않습니다. 하지만 DELETE 문을 사용하면 동일한 효과를 얻을 수 있습니다.

BigQuery의 DELETE 문에는 WHERE 절이 있어야 합니다. BigQuery의 DELETE에 대한 자세한 내용은 DML 문서에서 BigQuery DELETE 예시를 참조하세요.

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

MERGE

MERGE 문은 INSERT, UPDATE, DELETE 작업을 단일 UPSERT 문으로 결합하여 원자적으로 작업을 수행할 수 있습니다. MERGE 작업은 각 대상 행에 대해 최대 1개의 소스 행과 일치해야 합니다. BigQuery와 Oracle은 모두 ANSI 문법을 따릅니다.

그러나 BigQuery의 DML 스크립트와 그에 해당하는 Oracle의 문 간에는 시맨틱스의 일관성 측면에 약간의 차이점이 있습니다.

DDL 구문

이 섹션에서는 Oracle과 BigQuery 간 데이터 정의 언어 문법의 차이점을 설명합니다.

CREATE TABLE

대부분의 Oracle CREATE TABLE 문은 BigQuery에서 사용되지 않는 다음 제약 조건과 문법 요소를 제외하고 BigQuery와 호환됩니다.

  • STORAGE
  • TABLESPACE
  • DEFAULT
  • GENERATED ALWAYS AS
  • ENCRYPT
  • PRIMARY KEY (col, ...). 자세한 내용은 CREATE INDEX를 참조하세요.
  • UNIQUE INDEX. 자세한 내용은 CREATE INDEX를 참조하세요.
  • CONSTRAINT..REFERENCES
  • DEFAULT
  • PARALLEL
  • COMPRESS

BigQuery의 CREATE TABLE에 대한 자세한 내용은 BigQuery CREATE TABLE 예시를 참고하세요.

열 옵션 및 속성

ID 열은 열에 자동 증가를 사용 설정하는 Oracle 12c 버전과 함께 도입되었습니다. BigQuery에서는 이를 사용하지 않으며 다음과 같은 일괄 처리 방식으로 수행할 수 있습니다. 서로게이트 키 및 지연 변경 측정기준(SCD)에 대한 자세한 내용은 다음 가이드를 참조하세요.

Oracle BigQuery
CREATE TABLE table (
  id NUMBER GENERATED ALWAYS AS IDENTITY,
  description VARCHAR2(30)
);
INSERT INTO dataset.table SELECT
  *,
  ROW_NUMBER() OVER () AS id
FROM dataset.table

열 주석

Oracle은 Comment 문법을 사용하여 열에 주석을 추가합니다. 다음 표와 같이 이 기능은 열 설명을 사용하여 BigQuery에서 유사하게 구현할 수 있습니다.

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

임시 테이블

Oracle은 스크립트에 중간 결과를 저장하는 데 종종 사용되는 임시 테이블을 지원합니다. BigQuery에서는 임시 테이블이 지원됩니다.

Oracle BigQuery
CREATE GLOBAL TEMPORARY TABLE
temp_tab
    (x INTEGER,
    y VARCHAR2(50))
  ON COMMIT DELETE ROWS;
COMMIT;
CREATE TEMP TABLE temp_tab
(
  x INT64,
  y STRING
);
DELETE FROM temp_tab WHERE TRUE;

다음 Oracle 요소는 BigQuery에서 사용되지 않습니다.

  • ON COMMIT DELETE ROWS;
  • ON COMMIT PRESERVE ROWS;

BigQuery에서 임시 테이블을 에뮬레이션하는 다른 방법도 있습니다.

  • 데이터 세트 TTL: 데이터 세트에서 생성된 모든 테이블의 수명이 데이터 세트의 수명보다 오래 지속되지 않으므로 테이블을 임시로 사용할 수 있도록 수명이 짧은(예: 1시간) 데이터 세트를 만듭니다. 이 데이터 세트의 모든 테이블 이름 앞에 temp를 추가하여 임시 테이블임을 명확하게 나타낼 수 있습니다.
  • 테이블 TTL: 다음과 유사한 DDL 문을 사용하여 테이블별로 단기 테이블을 만듭니다.

    CREATE TABLE temp.name (col1, col2, ...)
    OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
  • WITH 절: WITH 문 또는 서브 쿼리를 사용하여 임시 결과를 사용합니다.

CREATE SEQUENCE

BigQuery에서는 시퀀스를 사용하지 않으며 다음과 같은 일괄 처리 방식으로 수행할 수 있습니다. 서로게이트 키 및 지연 변경 측정기준(SCD)에 대한 자세한 내용은 다음 가이드를 참조하세요.

INSERT INTO dataset.table
    SELECT *,
      ROW_NUMBER() OVER () AS id
      FROM dataset.table

CREATE VIEW

다음 표에서는 CREATE VIEW 문에 대해 Oracle과 BigQuery 간 유사점을 보여줍니다.

Oracle BigQuery 참고
CREATE VIEW view_name AS SELECT ... CREATE VIEW view_name AS SELECT ...
CREATE OR REPLACE VIEW view_name AS SELECT ... CREATE OR REPLACE VIEW view_name AS SELECT ...
지원되지 않음 CREATE VIEW IF NOT EXISTS view_name OPTIONS(view_option_list) AS SELECT ... 지정된 데이터 세트에 현재 뷰가 없는 경우에만 새 뷰를 만듭니다.

CREATE MATERIALIZED VIEW

BigQuery에서는 구체화된 뷰 새로고침 작업이 자동으로 실행됩니다. BigQuery에서는 새로고침 옵션(예: 커밋 또는 일정)을 지정할 필요가 없습니다. 자세한 내용은 구체화된 뷰 소개를 참고하세요.

기본 테이블이 추가만으로 계속 변경되는 경우 구체화된 뷰를 사용하는 쿼리(뷰가 명시적으로 참조되거나 쿼리 최적화 도구에서 선택되었는지 여부)는 마지막 뷰가 새로고침된 이후 모든 구체화된 뷰와 기본 테이블의 델타를 스캔합니다. 즉, 쿼리를 더 빠르고 합리적인 비용으로 처리할 수 있습니다.

반대로 마지막 뷰가 새로고침된 이후 기본 테이블에 업데이트(DML UPDATE / MERGE) 또는 삭제(DML DELETE, 자르기, 파티션 만료 시간)가 있으면 구체화된 뷰는 스캔되지 않고 따라서 쿼리가 다음 뷰를 새로고침할 때까지 비용이 절약되지 않습니다. 기본적으로 기본 테이블에서 업데이트 또는 삭제가 발생하면 구체화된 뷰 상태가 무효화됩니다.

또한 기본 테이블의 스트리밍 버퍼의 데이터는 구체화된 뷰에 저장되지 않습니다. 스트리밍 버퍼는 구체화된 뷰의 사용 여부와 관계없이 계속 철저히 스캔됩니다.

다음 표에서는 CREATE MATERIALIZED VIEW 문에 대해 Oracle과 BigQuery 간 유사점을 보여줍니다.

Oracle BigQuery 참고
CREATE MATERIALIZED VIEW view_name
REFRESH FAST NEXT sysdate + 7
AS SELECT … FROM TABLE_1
CREATE MATERIALIZED VIEW
view_name AS SELECT ...

CREATE [UNIQUE] INDEX

이 섹션에서는 Oracle의 색인과 유사한 기능을 만드는 방법에 대한 BigQuery 접근 방법을 설명합니다.

성능 색인 생성

BigQuery는 쿼리 및 스토리지 최적화를 사용하는 열 중심 데이터베이스이므로 명시적 색인이 필요하지 않습니다. BigQuery는 파티션 나누기 및 클러스터링과 같은 기능 외에 중첩된 필드도 제공하므로 데이터 저장 방식을 최적화하여 쿼리 효율성과 성능을 높일 수 있습니다.

일관성 색인 생성(UNIQUE, PRIMARY INDEX)

Oracle에서 고유 색인은 테이블에 고유하지 않은 키가 있는 행을 차단하는 데 사용할 수 있습니다. 프로세스에서 이미 색인에 포함된 값이 있는 데이터를 삽입하거나 업데이트하려고 하면 작업이 색인 위반 오류와 함께 실패합니다.

BigQuery는 명시적 색인을 제공하지 않으므로, 중복 레코드를 삭제하는 동안 MERGE 문을 사용하여 스테이징 테이블의 대상 테이블에만 고유 레코드를 삽입할 수 있습니다. 하지만 수정 권한이 있는 사용자가 중복 레코드를 삽입하는 것을 방지할 방법은 없습니다.

BigQuery에서 중복 레코드에 대한 오류를 생성하려면 다음 예시와 같이 스테이징 테이블에서 MERGE 문을 사용하면 됩니다.

Oracle BigQuery
CREATE [UNIQUE] INDEX name; MERGE `prototype.FIN_MERGE` t \
USING `prototype.FIN_TEMP_IMPORT` m \
ON t.col1 = m.col1 \
  AND t.col2 = m.col2 \
WHEN MATCHED THEN \
  UPDATE SET t.col1 = ERROR(CONCAT('Encountered Error for ', m.col1, ' ', m.col2)) \
WHEN NOT MATCHED THEN \
  INSERT (col1,col2,col3,col4,col5,col6,col7,col8)
VALUES(col1,col2,col3,col4,col5,col6, CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP());

사용자는 다운스트림 시스템에서 오류를 찾기 위해 중복 항목을 독립적으로 제거하는 것을 선호하는 경우가 더 많습니다.

BigQuery는 DEFAULTIDENTITY(시퀀스) 열을 지원하지 않습니다.

잠금

BigQuery에는 Oracle과 같은 잠금 메커니즘이 없으며 동시 쿼리(최대 할당량)를 실행할 수 있습니다. DML 문에만 특정 동시 제한이 있으며 경우에 따라 실행 중에 테이블 잠금이 필요할 수 있습니다.

절차적 SQL 문

이 섹션에서는 저장 프로시져, 함수, 트리거에 사용된 절차적 SQL 문을 Oracle에서 BigQuery로 변환하는 방법을 설명합니다.

CREATE PROCEDURE

저장 프로시저는 BigQuery 스크립팅 베타의 일부로 지원됩니다.

Oracle BigQuery 참고
CREATE PROCEDURE CREATE PROCEDURE Oracle과 마찬가지로 BigQuery는 IN, OUT, INOUT 인수 모드를 지원합니다. 다른 문법 사양은 BigQuery에서 지원되지 않습니다.
CREATE OR REPLACE PROCEDURE CREATE OR REPLACE PROCEDURE
CALL CALL

다음 섹션에서는 기존의 Oracle의 절차적 문을 기능이 유사한 BigQuery 스크립팅 문으로 변환하는 방법을 설명합니다.

CREATE TRIGGER

트리거는 BigQuery에서 사용되지 않습니다. 행 기반 애플리케이션 로직은 애플리케이션 계층에서 처리해야 합니다. 트리거 기능은 수집 기간 중 수집 도구, Pub/Sub 또는 Cloud Run Functions를 활용하거나 일반 스캔을 활용하여 수행할 수 있습니다.

변수 선언 및 할당

다음 표에서는 Oracle DECLARE 문과 그에 해당하는 BigQuery 문을 보여줍니다.

Oracle BigQuery
DECLARE
  L_VAR NUMBER;
BEGIN
  L_VAR := 10 + 20;
END;
DECLARE L_VAR int64;
BEGIN
  SET L_VAR = 10 + 20;
  SELECT L_VAR;
END
SET var = value; SET var = value;

커서 선언 및 작업

BigQuery는 커서를 지원하지 않으므로 다음 문은 BigQuery에서 사용되지 않습니다.

동적 SQL 문

다음 Oracle 동적 SQL 문과 그에 해당하는 BigQuery 문

Oracle BigQuery
EXECUTE IMMEDIATE sql_str

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

EXECUTE IMMEDIATE

sql_expression [INTO variable[, ...]]

[USING identifier[, ...]];

;

제어 흐름 문

다음 표에서는 Oracle 제어 흐름 문이 BigQuery에 어떻게 매핑되는지 보여줍니다.

Oracle BigQuery
IF condition THEN
  [if_statement_list]
[ELSE
  else_statement_list
]
END IF;
IF condition THEN
  [if_statement_list]
[ELSE
  else_statement_list
]
END IF;
SET SERVEROUTPUT ON;
DECLARE
x INTEGER DEFAULT 0;
y INTEGER DEFAULT 0;
BEGIN
LOOP
  IF x>= 10 THEN
    EXIT;
  ELSIF x>= 5 THEN
     y := 5;
  END IF;
  x := x + 1;
END LOOP;
dbms_output.put_line(x||','||y);
END;
/
DECLARE x INT64 DEFAULT 0;
DECLARE y INT64 DEFAULT 0;
LOOP
  IF x>= 10 THEN
     LEAVE;
  ELSE IF x>= 5 THEN
    SET y = 5;
    END IF;
  END IF;
  SET x = x + 1;
END LOOP;
SELECT x,y;
LOOP
  sql_statement_list
END LOOP;
LOOP
  sql_statement_list
END LOOP;
WHILE boolean_expression DO
  sql_statement_list
END WHILE;
WHILE boolean_expression DO
  sql_statement_list
END WHILE;
FOR LOOP FOR LOOP는 BigQuery에서 사용되지 않습니다. 다른 LOOP 문을 사용하세요.
BREAK BREAK
CONTINUE CONTINUE
CONTINUE/EXIT WHEN IF 조건과 함께 CONTINUE를 사용하세요.
GOTO BigQuery에는 GOTO 문이 없습니다. IF 조건을 사용하세요.

메타데이터 및 트랜잭션 SQL 문

Oracle BigQuery
GATHER_STATS_JOB 아직 BigQuery에서는 사용되지 않습니다.
LOCK TABLE table_name IN [SHARE/EXCLUSIVE] MODE NOWAIT; 아직 BigQuery에서는 사용되지 않습니다.
Alter session set isolation_level=serializable; /

SET TRANSACTION ...

BigQuery는 항상 스냅샷 격리를 사용합니다. 자세한 내용은 이 문서의 일관성 보장 및 트랜잭션 격리를 참고하세요.
EXPLAIN PLAN ... BigQuery에는 사용되지 않습니다.

유사한 기능으로는 BigQuery 웹 UI에서의 쿼리 계획 설명 및 슬롯 할당, 그리고 Stackdriver의 감사 로깅이 있습니다.

SELECT * FROM DBA_[*];

(Oracle DBA_/ALL_/V$ 뷰)

SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLES;

자세한 내용은 BigQuery INFORMATION_SCHEMA 소개를 참조하세요.

SELECT * FROM GV$SESSION;

SELECT * FROM V$ACTIVE_SESSION_HISTORY;

BigQuery에는 기존 세션 개념이 없습니다. UI에서 쿼리 작업을 보거나 Stackdriver 감사 로그를 BigQuery로 내보내고 BigQuery 로그를 분석하여 작업을 분석할 수 있습니다. 자세한 내용은 작업 세부정보 보기를 참조하세요.
START TRANSACTION;

LOCK TABLE table_A IN EXCLUSIVE MODE NOWAIT;

DELETE FROM table_A;

INSERT INTO table_A SELECT * FROM table_B;

COMMIT;

테이블의 콘텐츠를 쿼리 출력으로 바꾸는 것은 트랜잭션과 같은 개념입니다. 이 작업은 쿼리 작업 또는 복사 작업으로도 수행할 수 있습니다.

쿼리 사용:

bq query --replace --destination_table table_A 'SELECT * FROM table_B';

복사 사용:

bq cp -f table_A table_B

다중 문 및 여러 줄로 구성된 SQL 문

Oracle과 BigQuery는 모두 트랜잭션(세션)을 지원하므로 일관되게 함께 실행되는 세미콜론으로 구분된 문을 지원합니다. 자세한 내용은 멀티 문 트랜잭션을 참조하세요.

오류 코드 및 메시지

Oracle 오류 코드BigQuery 오류 코드는 서로 다릅니다. 애플리케이션 로직이 현재 오류를 포착한다면 BigQuery가 동일한 오류 코드를 반환하지 않으므로 오류의 원인 제거를 시도해 보세요.

일관성 보장 및 트랜잭션 격리

Oracle 및 BigQuery 모두 원자적인 특성을 갖습니다. 즉, 여러 행에 걸쳐 변형당 수준에서 ACID와 호환됩니다. 예를 들어 MERGE 작업은 여러 개의 삽입 및 업데이트된 값이 있는 경우에도 원자적인 특성을 갖습니다.

거래

Oracle은 커밋된 읽기 또는 직렬화 가능한 트랜잭션 격리 수준을 제공합니다. 교착 상태가 발생할 수 있습니다. Oracle 삽입 추가 작업은 독립적으로 실행됩니다.

BigQuery는 트랜잭션도 지원합니다. BigQuery는 쿼리가 시작되기 전에 마지막으로 커밋된 데이터를 쿼리가 읽는 스냅샷 격리를 사용하여 최적의 동시 실행 제어(첫 번째 성공 커밋)를 실행할 수 있습니다. 이 접근 방법은 행 및 변형 기준으로 그리고 동일한 DML 문 내의 여러 행에서 동일한 수준의 일관성을 보장하고 교착 상태도 방지합니다. 동일한 테이블에 대해 여러 UPDATE 문이 있으면 BigQuery는 비관적 동시 실행 제어로 전환하여 다중 UPDATE 문을 에 넣고 충돌이 일어나는 경우 자동으로 재시도합니다. INSERT DML 문과 로드 작업이 동시에 독립적으로 실행되어 테이블에 추가될 수 있습니다.

롤백

Oracle은 롤백을 지원합니다. BigQuery에는 명시적 트랜잭션 경계가 없으므로 명시적 롤백 개념도 없습니다. 해결 방법은 테이블 데코레이터를 사용하거나 FOR SYSTEM_TIME AS OF를 사용하는 것입니다.

데이터베이스 한도

BigQuery 최신 할당량 및 한도를 확인하세요. 대규모 사용자를 위한 대량의 할당량은 Cloud Customer Care에 문의하여 늘릴 수 있습니다. 다음 표에서는 Oracle과 BigQuery의 데이터베이스 한도를 비교합니다.

한도 Oracle BigQuery
데이터베이스당 테이블 무제한 무제한
테이블당 열 1000 10,000
최대 행 크기 무제한(열 유형에 따라 다름) 100MB
열 및 테이블 이름 길이 v12.2가 128바이트 이상인 경우

그 외 30바이트

16,384개의 유니코드 문자
테이블당 행 무제한 무제한
최대 SQL 요청 길이 무제한 1MB(해결되지 않은 GoogleSQL 쿼리 최대 길이)

12MB(해결된 기존 쿼리 및 GoogleSQL 쿼리 최대 길이)

스트리밍:

  • 10MB(HTTP 요청 크기 한도)
  • 10,000행(요청당 최대 행:)
최대 요청 및 응답 크기 무제한 10MB(요청) 및 10GB(응답), 페이지 나누기 또는 Cloud Storage API를 사용하는 경우에는 거의 무제한입니다.
최대 동시 실행 세션 수 세션 또는 프로세스 매개변수로 제한됨 동시 실행 쿼리 100개(슬롯 예약 사용 시 늘어날 수 있음), 사용자당 300개의 동시 실행 API 요청
최대 동시 실행(고속) 로드 수 세션 또는 프로세스 매개변수로 제한됨 동시 실행 한도 없음, 작업이 큐에 추가됨. 일일 프로젝트당 100,000개 로드 작업

다른 Oracle 데이터베이스 한도에는 데이터 유형 한도, 물리적 데이터베이스 한도, 논리적 데이터베이스 한도, 프로세스 및 런타임 한도가 포함됩니다.