Oracle 커넥터

Oracle 커넥터 (Oracle connector)

Oracle 커넥터는 Trino 쿼리에서 외부 Oracle 데이터베이스의 데이터를 조회하고 테이블을 만들 수 있게 해줍니다. 커넥터를 활용하면 Oracle과 Hive처럼 서로 다른 데이터베이스, 또는 여러 Oracle 데이터베이스 인스턴스의 데이터를 조인할 수 있어요.

출처: 문서

본문

요구 사항 (Requirements)

Oracle에 연결하려면 다음이 필요합니다:

  • Oracle 23 이상.
  • Trino 코디네이터와 워커에서 Oracle로의 네트워크 접근. 기본 포트는 1521.

설정 (Configuration)

Oracle 커넥터를 example 카탈로그로 설정하려면 etc/catalogexample.properties라는 파일을 만들고 다음 연결 속성을 넣어주세요:

connector.name=oracle
# connection-url의 정확한 문법은 Oracle 버전과 설정에 따라 다릅니다. 다음 예제 URL은
# "orcl"이라는 Oracle SID에 연결합니다.
connection-url=jdbc:oracle:thin:@example.net:1521:orcl
connection-user=root
connection-password=secret

connection-url은 JDBC 드라이버에 전달할 연결 정보와 파라미터를 정의합니다. Oracle 커넥터는 Oracle JDBC Thin 드라이버를 사용하며, URL 문법은 Oracle 설정에 따라 다를 수 있습니다. 예를 들어 Oracle SID에 연결하는지 서비스 이름에 연결하는지에 따라 연결 URL이 다릅니다. 자세한 내용은 Oracle Database JDBC driver 문서를 참고하세요.

connection-userconnection-password는 일반적으로 필수이며 연결 자격 증명(보통 서비스 사용자)을 결정합니다. 시크릿 (secrets)을 사용하면 카탈로그 속성 파일에 실제 값을 넣지 않고도 관리할 수 있습니다.

Oracle은 기본적으로 JDBC 드라이버의 REMARKS 컬럼으로 메타데이터 주석을 노출하지 않습니다. oracle.remarks-reporting.enabled 설정 옵션으로 활성화할 수 있습니다.

기본적으로 Oracle 커넥터는 성능 향상을 위해 연결 풀링을 사용합니다. 아래 설정은 전형적인 기본값을 보여줍니다:

oracle.connection-pool.max-size=30
oracle.connection-pool.min-size=1
oracle.connection-pool.inactive-timeout=20m
oracle.connection-pool.wait-duration=3s

연결 풀링을 비활성화하려면 속성을 다음처럼 설정하세요:

oracle.connection-pool.enabled=false

데이터 소스 인증 (Data source authentication)

커넥터는 데이터 소스 연결용 자격 증명을 여러 방법으로 제공할 수 있습니다:

  • 커넥터 설정 파일에 inline으로
  • 별도의 properties 파일로
  • 키 스토어 파일로
  • Trino에 연결할 때 추가 자격 증명 (extra credentials)으로

시크릿 (secrets)을 활용하면 카탈로그 속성 파일에 민감한 값을 저장하지 않을 수 있어요.

다음 표는 연결 자격 증명 설정 속성을 설명합니다:

속성 이름 설명
credential-provider.type 자격 증명 공급자 유형. INLINE, FILE, KEYSTORE 중 하나여야 하며 기본값은 INLINE.
connection-user 연결 사용자 이름.
connection-password 연결 비밀번호.
user-credential-name 사용자 이름으로 사용할 추가 자격 증명 속성 이름.
password-credential-name 비밀번호로 사용할 추가 자격 증명 속성 이름.
connection-credential-file 자격 증명이 있는 properties 파일 위치. connection-userconnection-password 속성을 포함해야 합니다.
keystore-file-path 자격 증명을 읽을 Java Keystore 파일 위치.
keystore-type 키 스토어 파일 형식(예: JKS 또는 PEM).
keystore-password 키 스토어 비밀번호.
keystore-user-credential-name 사용자 이름으로 사용할 키 스토어 엔티티 이름.
keystore-user-credential-password 사용자 이름 키 스토어 엔티티의 비밀번호.
keystore-password-credential-name 비밀번호로 사용할 키 스토어 엔티티 이름.
keystore-password-credential-password 비밀번호 키 스토어 엔티티의 비밀번호.

여러 Oracle 서버 (Multiple Oracle servers)

여러 Oracle 서버에 연결하려면 커넥터를 별도의 카탈로그로 또 설정하세요. 예를 들어 sales.properties라는 파일을 만들면 Trino가 sales라는 카탈로그를 생성합니다.

일반 설정 속성 (General configuration properties)

다음 표는 커넥터의 일반적인 카탈로그 설정 속성을 설명합니다:

속성 이름 설명 기본값
case-insensitive-name-matching 대소문자 구분 없는 스키마/테이블 이름 지원 여부. false
case-insensitive-name-matching.cache-ttl 대소문자 구분 없는 이름이 캐시되는 기간. 1m
case-insensitive-name-matching.config-file 이름 매핑 설정 파일(JSON) 경로. null
case-insensitive-name-matching.config-file.refresh-period 이름 매핑 파일 변경 확인 주기. 0s
metadata.cache-ttl 테이블/컬럼 통계를 포함한 메타데이터 캐시 기간. 0s
metadata.cache-missing 메타데이터가 없음을 캐시할지 여부. false
metadata.schemas.cache-ttl 스키마 메타데이터 캐시 기간. metadata.cache-ttl
metadata.tables.cache-ttl 테이블 메타데이터 캐시 기간. metadata.cache-ttl
metadata.statistics.cache-ttl 테이블 통계 캐시 기간. metadata.cache-ttl
metadata.cache-maximum-size 메타데이터 캐시에 저장되는 최대 객체 수. 10000
write.batch-size 배치 실행에서의 최대 명령문 수. 기본값에서 바꾸지 마세요. 1000
dynamic-filtering.enabled 동적 필터를 JDBC 쿼리로 푸시다운. true
dynamic-filtering.wait-timeout JDBC 쿼리 시작 전에 조인의 빌드 측에서 동적 필터가 모이기를 기다리는 최대 시간. 큰 타임아웃은 더 상세한 동적 필터를 만들 수 있지만 일부 쿼리 대기 시간을 늘릴 수 있습니다. 20s

쿼리 메타데이터 추가 (Appending query metadata)

query.comment-format 선택 파라미터로 각 쿼리와 함께 데이터 소스에 전송되는 SQL 주석을 설정할 수 있습니다. 이 주석의 형식은 어떤 문자든 포함할 수 있으며 다음 메타데이터를 지원합니다:

  • $QUERY_ID: 쿼리 식별자.
  • $USER: 쿼리를 Trino에 제출한 사용자 이름.
  • $SOURCE: 쿼리를 제출하는 데 사용된 클라이언트 도구 식별자 (예: trino-cli).
  • $TRACE_TOKEN: 클라이언트 도구로 설정된 추적 토큰.

주석은 쿼리에 더 많은 맥락을 제공할 수 있으며, 이 정보는 데이터 소스의 로그에서 확인할 수 있습니다. Trino 클러스터의 환경 변수를 주석에 포함하려면 ${ENV:VARIABLE-NAME} 문법을 사용하세요.

다음 예제는 Trino가 보내는 각 쿼리를 식별하는 간단한 주석을 설정합니다:

query.comment-format=Query sent by Trino.

이 설정에서 SELECT * FROM example_table; 같은 쿼리는 주석이 덧붙여져 데이터 소스로 전송됩니다:

SELECT * FROM example_table; /*Query sent by Trino.*/

다음 예제는 메타데이터를 사용해 앞선 예제를 개선합니다:

query.comment-format=Query $QUERY_ID sent by user $USER from Trino.

Jane이 쿼리 식별자 20230622_180528_00000_bkizg로 쿼리를 보냈다면 다음 주석 문자열이 데이터 소스로 전송됩니다:

SELECT * FROM example_table; /*Query 20230622_180528_00000_bkizg sent by user Jane from Trino.*/

일부 JDBC 드라이버 설정과 로깅 구성은 주석이 제거되게 할 수 있습니다.

도메인 압축 임계값 (Domain compaction threshold)

큰 조건 목록을 데이터 소스로 푸시다운하면 성능이 저하될 수 있습니다. Trino는 기본적으로 큰 조건을 더 단순한 범위 조건으로 압축해 성능과 조건 푸시다운 사이의 균형을 맞춥니다. domain-compaction-threshold 카탈로그 설정 속성 또는 domain_compaction_threshold 카탈로그 세션 속성으로 이 임계값의 기본값인 256을 조정할 수 있습니다.

대소문자 구분 없는 매칭 (Case insensitive matching)

case-insensitive-name-matchingtrue로 설정하면 Trino는 소문자 이름을 원격 시스템의 실제 이름에 매핑해 비소문자 스키마와 테이블을 조회할 수 있습니다. 다만 이름이 대소문자만 다른 두 스키마/테이블("customers"와 "Customers")이 있으면 모호성 때문에 조회가 실패합니다.

이런 경우 case-insensitive-name-matching.config-file 카탈로그 설정 속성으로 원격 스키마/테이블을 각각의 Trino 스키마/테이블에 매핑하는 설정 파일을 지정하세요. JSON 파일은 빈 배열이라도 schemastables 속성을 모두 포함해야 합니다.

{
  "schemas": [
    {
      "remoteSchema": "CaseSensitiveName",
      "mapping": "case_insensitive_1"
    },
    {
      "remoteSchema": "cASEsENSITIVEnAME",
      "mapping": "case_insensitive_2"
    }],
  "tables": [
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "tablex",
      "mapping": "table_1"
    },
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "TABLEX",
      "mapping": "table_2"
    }]
}

mapping 속성에 정의된 테이블/스키마 중 하나를 대상으로 한 쿼리는 해당 원격 엔티티에 대해 실행됩니다. 매핑 설정 파일이 변경되면 기본적으로 Trino를 재시작해야 변경 사항이 로드됩니다. case-insensitive-name-matching.config-file.refresh-period를 설정하면 재시작 없이 속성을 갱신할 수 있습니다:

case-insensitive-name-matching.config-file.refresh-period=30s

장애 허용 실행 지원 (Fault-tolerant execution support)

커넥터는 쿼리 처리의 장애 허용 실행을 지원합니다. 어떤 재시도 정책으로든 읽기와 쓰기 연산 모두 지원됩니다.

Oracle 조회 (Querying Oracle)

Oracle 커넥터는 각 Oracle 데이터베이스에 대해 스키마를 제공합니다. SHOW SCHEMAS로 사용 가능한 Oracle 데이터베이스를 확인할 수 있습니다:

SHOW SCHEMAS FROM example;

Trino에서 테이블에 접근하려면 Oracle 사용자가 해당 테이블에 접근 권한이 있어야 합니다.

예제 (Examples)

web이라는 Oracle 데이터베이스가 있으면 SHOW TABLES로 이 데이터베이스의 테이블을 볼 수 있습니다:

SHOW TABLES FROM example.web;

web 데이터베이스의 clicks 테이블 컬럼 목록은 다음 중 하나로 확인할 수 있습니다:

DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;

web 데이터베이스의 clicks 테이블에 접근하려면 다음을 실행하세요:

SELECT * FROM example.web.clicks;

데이터 유형 매핑 (Type mapping)

Trino와 Oracle은 서로 지원하지 않는 유형이 있으므로, 이 커넥터는 데이터를 읽거나 쓸 때 일부 유형을 변환합니다. 각 방향의 매핑은 아래 표를 참고하세요.

Oracle에서 Trino로의 유형 매핑:

Oracle 데이터베이스 유형 Trino 유형 비고
NUMBER(p, s) DECIMAL(pʹ, sʹ) 또는 NUMBER 입력 데이터를 손실 없이 Trino DECIMAL로 표현할 수 있으면 DECIMAL로 매핑. 1 ≤ p ≤ 38이고 0 ≤ s ≤ p이면 pʹ = p, sʹ = s, 아니면 더 넓은 유형 사용. 손실 없이 표현할 수 없으면 NUMBER로 매핑.
NUMBER NUMBER
FLOAT[(p)] DOUBLE p가 53을 넘으면 정밀도 손실이 있을 수 있음. Oracle FLOAT의 기본 정밀도는 53.
BINARY_FLOAT REAL
BINARY_DOUBLE DOUBLE
VARCHAR2(n CHAR) VARCHAR(n)
VARCHAR2(n BYTE) VARCHAR(n)
NVARCHAR2(n) VARCHAR(n)
CHAR(n) CHAR(n)
NCHAR(n) CHAR(n)
CLOB VARCHAR
NCLOB VARCHAR
RAW(n) VARBINARY
BLOB VARBINARY
DATE TIMESTAMP(0) datetime 유형 매핑 참고
TIMESTAMP(p) TIMESTAMP(p) datetime 유형 매핑 참고
TIMESTAMP(p) WITH TIME ZONE TIMESTAMP WITH TIME ZONE datetime 유형 매핑 참고

그 외 유형은 지원되지 않습니다.

Trino에서 Oracle로의 유형 매핑:

Trino 유형 Oracle 데이터베이스 유형 비고
TINYINT NUMBER(3)
SMALLINT NUMBER(5)
INTEGER NUMBER(10)
BIGINT NUMBER(19)
DECIMAL(p, s) NUMBER(p, s)
NUMBER NUMBER
REAL BINARY_FLOAT
DOUBLE BINARY_DOUBLE
VARCHAR NCLOB
VARCHAR(n) VARCHAR2(n CHAR) 또는 NCLOB character 유형 매핑 참고
CHAR(n) CHAR(n CHAR) 또는 NCLOB character 유형 매핑 참고
VARBINARY BLOB
DATE DATE datetime 유형 매핑 참고
TIMESTAMP TIMESTAMP(3) datetime 유형 매핑 참고
TIMESTAMP WITH TIME ZONE TIMESTAMP(3) WITH TIME ZONE datetime 유형 매핑 참고

그 외 유형은 지원되지 않습니다. 아래 표에 없는 유형은 Trino가 CREATE TABLE AS SELECT 연산을 수행할 수 없으며, 기존 테이블에 데이터를 삽입할 때는 Oracle to Trino 유형 매핑이 사용됩니다.

datetime 유형 매핑 (Mapping datetime types)

소수 초 정밀도(p)가 9보다 큰 타임스탬프를 쓰면 소수 초가 9자리로 반올림됩니다.

Oracle DATE 유형은 시/분/초를 저장하므로 Trino TIMESTAMP(0)으로 매핑됩니다.

Trino와 Oracle JDBC 드라이버가 사용하는 라이브러리의 날짜/시간 차이 때문에 1582-10-15보다 이른 datetime 값을 삽입하거나 선택하면 잘못된 날짜가 삽입될 수 있습니다.

character 유형 매핑 (Mapping character types)

Trino의 VARCHAR(n)n이 4000 이하이면 VARCHAR2(n CHAR)로, 더 크거나 무제한이면 NCLOB로 매핑됩니다.

Trino의 CHAR(n)n이 2000 이하이면 CHAR(n CHAR)로, 더 크면 NCLOB로 매핑됩니다.

CREATE TABLE ASCHAR 값에서 NCLOB 컬럼을 만들면 컬럼의 초기 값에서 끝 공백이 제거됩니다. 기존 NCLOB 컬럼에 CHAR 값을 삽입하면 끝 공백이 유지됩니다:

CREATE TABLE vals AS SELECT CAST('A' as CHAR(2001)) col;
INSERT INTO vals (col) VALUES (CAST('BB' as CHAR(2001)));
SELECT LENGTH(col) FROM vals;
 _col0
-------
  2001
     1
(2 rows)

컬럼의 실제 크기에 맞지 않는 CHAR를 쓰려고 하면 실패합니다. 이는 동등한 VARCHAR 유형에도 해당됩니다.

유형 매핑 설정 속성 (Type mapping configuration properties)

속성 이름 설명 기본값
unsupported-type-handling 지원되지 않는 컬럼 유형 처리 방식: IGNORE(컬럼 접근 불가) 또는 CONVERT_TO_VARCHAR(무제한 VARCHAR로 변환). 해당 카탈로그 세션 속성은 unsupported_type_handling. IGNORE
jdbc-types-mapped-to-varchar 무제한 VARCHAR로 변환할 유형의 쉼표 구분 목록을 강제 매핑.

숫자를 decimal로 변환하는 설정 속성 (Number to decimal configuration properties)

설정 속성 이름 세션 속성 이름 설명 기본값
oracle.number.default-scale number_default_scale 정밀도와 스케일이 없는 Oracle NUMBER 유형의 기본 Trino DECIMAL 스케일. 설정하지 않으면 해당 컬럼은 지원되지 않는 것으로 취급. 미설정
oracle.number.rounding-mode number_rounding_mode Oracle NUMBER 유형의 반올림 모드. Oracle NUMBER가 Trino가 지원하는 것보다 높은 스케일을 지정할 때 유용. 가능한 값: UNNECESSARY, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP, UP, DOWN. UNNECESSARY

SQL 지원 (SQL support)

커넥터는 Oracle의 데이터와 메타데이터에 대해 읽기/쓰기 접근을 제공합니다. 전역 사용 가능 명령문과 읽기 연산 명령문에 더해 다음 기능을 지원합니다:

  • INSERT — 비트랜잭션 INSERT 참고
  • UPDATE — UPDATE 제한 참고
  • DELETE — DELETE 제한 참고
  • TRUNCATE
  • CREATE TABLE
  • CREATE TABLE AS
  • DROP TABLE
  • ALTER TABLE — ALTER TABLE RENAME TO 제한 참고
  • COMMENT
  • 프로시저
  • 테이블 함수

비트랜잭션 INSERT (Non-transactional INSERT)

커넥터는 INSERT 문으로 행 추가를 지원합니다. 기본적으로 데이터는 임시 테이블에 먼저 기록됩니다. insert.non-transactional-insert.enabled 카탈로그 속성 또는 해당 non_transactional_insert 카탈로그 세션 속성을 true로 설정하면 이 단계를 건너뛰고 대상 테이블에 직접 기록해 성능을 높일 수 있습니다.

이 속성을 켜면 드물게 insert 작업 중 예외가 발생할 때 데이터가 손상될 수 있습니다. 트랜잭션이 비활성화되므로 롤백이 불가능합니다.

UPDATE 제한 (UPDATE limitation)

상수 할당과 상수 조건을 가진 UPDATE 문만 지원합니다. 산술 표현식, 함수 호출 등 비상수 UPDATE 문은 지원되지 않습니다. 한 행의 모든 컬럼 값을 동시에 갱신할 수는 없습니다.

DELETE 제한 (DELETE limitation)

WHERE 절이 지정되면 해당 절의 조건을 데이터 소스에 완전히 푸시다운할 수 있을 때만 DELETE가 동작합니다.

ALTER TABLE RENAME TO 제한 (ALTER TABLE RENAME TO limitation)

여러 스키마에 걸친 테이블 이름 변경은 지원하지 않습니다. 예를 들어 다음 문은 지원됩니다:

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_one.table_two

다음 문은 스키마를 넘어 이름을 바꾸려 하므로 지원되지 않습니다:

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_two.table_two

프로시저 (Procedures)

system.flush_metadata_cache()

JDBC 메타데이터 캐시를 비웁니다:

USE example.example_schema;
CALL system.flush_metadata_cache();

system.execute('query')

execute 프로시저는 연결된 데이터 소스에서 쿼리를 직접 실행하게 해줍니다. 쿼리는 연결된 데이터 소스의 지원 문법을 사용해야 합니다. Trino에 없는 기능에 접근하거나, 결과 집합을 반환하지 않아 queryraw_query 패스스루 테이블 함수로 사용할 수 없는 쿼리를 실행할 때 유용합니다.

쿼리 텍스트는 Trino가 파싱하지 않고 그대로 전달하므로, 연결된 데이터 소스의 보안/접근 제어만 적용됩니다.

USE example.example_schema;
CALL system.execute(query => 'ALTER TABLE your_table ALTER COLUMN your_column DROP DEFAULT');

테이블 함수 (Table functions)

커넥터는 Oracle에 접근하기 위한 특정 테이블 함수를 제공합니다.

query(varchar) -> table

query 함수는 연결된 데이터베이스를 직접 조회하게 해줍니다. 전체 쿼리가 푸시다운되어 Oracle에서 처리되므로 Oracle 고유 문법이 필요합니다.

연결된 데이터 소스에 전달되는 네이티브 쿼리는 결과 집합으로 테이블을 반환해야 합니다. 검증과 보안 검사는 오직 데이터 소스가 자체 설정으로 수행합니다. 패스스루 쿼리는 데이터 읽기에만 사용하세요.

간단한 예로, example 카탈로그를 조회해 전체 테이블을 선택합니다:

SELECT
  *
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        *
      FROM
        tpch.nation'
    )
  );

실용적인 예로, Oracle SQL의 MODEL 절을 사용할 수 있습니다:

SELECT
  SUBSTR(country, 1, 20) country,
  SUBSTR(product, 1, 15) product,
  year,
  sales
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        *
      FROM
        sales_view
      MODEL
        RETURN UPDATED ROWS
        MAIN
          simple_model
        PARTITION BY
          country
        MEASURES
          sales
        RULES
          (sales['Bounce', 2001] = 1000,
          sales['Bounce', 2002] = sales['Bounce', 2001] + sales['Bounce', 2000],
          sales['Y Box', 2002] = sales['Y Box', 2001])
      ORDER BY
        country'
    )
  );

쿼리 엔진은 이 함수의 결과 순서를 보존하지 않습니다. 전달한 쿼리에 ORDER BY 절이 있으면 함수 결과 순서가 예상과 다를 수 있습니다.

성능 (Performance)

커넥터는 다음 섹션에 설명된 여러 성능 개선을 포함합니다.

시노님 (Synonyms)

성능상 이유로 Trino는 Oracle SYNONYM 지원을 기본적으로 비활성화합니다. SYNONYM을 포함하려면 다음 설정 속성을 추가하세요:

oracle.synonyms.enabled=true

푸시다운 (Pushdown)

커넥터는 다음 연산에 대해 푸시다운을 지원합니다:

  • 조인 푸시다운
  • LIMIT 푸시다운

또한 다음 함수에 대한 집계 푸시다운을 지원합니다: avg(), count()(그리고 count(distinct x)), max(), min(), sum(). stddev()/stddev_samp(), stddev_pop(), var_pop(), variance()/var_samp() 함수는 DOUBLE 유형 컬럼에서만, covar_samp()/covar_pop()REAL 또는 DOUBLE 유형 컬럼에서만 푸시다운이 지원됩니다.

커넥터는 성능이 향상될 수 있는 곳에서 푸시다운을 수행하지만, 정확성을 지키기 위해 일부 연산은 푸시다운되지 않을 수 있습니다.

조인 푸시다운 (Join pushdown)

join-pushdown.enabled 카탈로그 설정 속성 또는 join_pushdown_enabled 카탈로그 세션 속성이 커넥터의 조인 연산 푸시다운 여부를 제어합니다. 기본값은 false이며, 조인 푸시다운을 켜면 일부 쿼리 성능에 부정적 영향을 줄 수 있습니다.

조건 푸시다운 지원 (Predicate pushdown support)

커넥터는 CLOB, NCLOB, BLOB, RAW(n) Oracle 데이터베이스 유형을 사용하는 컬럼이나, 이러한 유형으로 매핑되는 Trino 데이터 유형에 대한 조건 푸시다운을 지원하지 않습니다.

다음 예제에서 nameVARCHAR 유형 컬럼으로 Oracle에서는 NCLOB로 매핑되므로 두 쿼리 모두 조건이 푸시다운되지 않습니다:

SHOW CREATE TABLE nation;

--             Create Table
----------------------------------------
-- CREATE TABLE oracle.trino_test.nation (
--    name VARCHAR
-- )
-- (1 row)

SELECT * FROM nation WHERE name > 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';

다음 예제에서 nameVARCHAR(25) 유형 컬럼으로 Oracle에서는 VARCHAR2(25)로 매핑되므로 두 쿼리 모두 조건이 푸시다운됩니다:

SHOW CREATE TABLE nation;

--             Create Table
----------------------------------------
-- CREATE TABLE oracle.trino_test.nation (
--    name VARCHAR(25)
-- )
-- (1 row)

SELECT * FROM nation WHERE name > 'CANADA';
SELECT * FROM nation WHERE name = 'CANADA';

더 알아보기 (Learn more)

Oracle 커넥터로 다른 데이터 소스와 데이터를 조합해보세요. 커넥터의 일반적인 개념은 커넥터 개요 문서에서 확인할 수 있어요.