ODBC 익스텐션 함수
ODBC 익스텐션 함수 (ODBC Extension Functions)
ODBC 익스텐션이 제공하는 함수 목록이에요. ODBC 연결을 열고 쿼리하고, 트랜잭션을 관리하고, 데이터 소스와 드라이버를 나열하는 등의 작업을 SQL에서 처리할 수 있어요.
출처: 문서
본문
odbc_begin_transactionodbc_bind_paramsodbc_closeodbc_commitodbc_connectodbc_copyodbc_create_paramsodbc_list_data_sourcesodbc_list_driversodbc_queryodbc_rollback
odbc_begin_transaction
odbc_begin_transaction(conn_handle BIGINT) -> VARCHAR
지정된 연결에 SQL_ATTR_AUTOCOMMIT 속성을 SQL_AUTOCOMMIT_OFF로 설정해 사실상 암시적 트랜잭션을 시작해요. 이러한 연결에서 트랜잭션을 완료하려면 odbc_commit 또는 odbc_rollback을 호출해야 해요. 완료는 이 연결에서 또 다른 암시적 트랜잭션을 시작해요. 자세한 내용은 Transaction management를 참고해요.
파라미터 (Parameters):
conn_handle(BIGINT):odbc_connect로 만든 ODBC 연결 핸들
반환 (Returns):
항상 NULL (VARCHAR) 반환.
예시 (Example):
SELECT odbc_begin_transaction(getvariable('conn'))
odbc_bind_params
odbc_bind_params(conn_handle BIGINT, params_handle BIGINT, params STRUCT) -> BIGINT
지정된 파라미터 핸들에 지정된 파라미터 값을 바인딩해요. 2단계 파라미터 바인딩에서만 필요해요. 자세한 내용은 Query parameters를 참고해요.
파라미터 (Parameters):
conn_handle(BIGINT):odbc_connect로 만든 ODBC 연결 핸들params_handle(BIGINT):odbc_create_params로 만든 파라미터 핸들params(STRUCT): 파라미터 값
반환 (Returns):
두 번째 인자로 전달된 것과 같은 파라미터 핸들(BIGINT).
예시 (Example):
SELECT odbc_bind_params(getvariable('conn'), getvariable('params1'), row(42, 'foo'))
odbc_close
odbc_close(conn_handle BIGINT) -> VARCHAR
원격 DB에 대한 지정된 ODBC 연결을 닫아요. 이미 닫혀 있으면 에러를 던지지 않아요.
파라미터 (Parameters):
conn_handle(BIGINT):odbc_connect로 만든 ODBC 연결 핸들
반환 (Returns):
항상 NULL (VARCHAR) 반환.
예시 (Example):
SELECT odbc_close(getvariable('conn'))
odbc_commit
odbc_commit(conn_handle BIGINT) -> VARCHAR
지정된 연결에서 SQL_COMMIT 인자로 SQLEndTran을 호출해 현재 트랜잭션을 완료해요. 이 호출 전에 이 연결에서 odbc_begin_transaction을 호출해야 완료가 효과가 있어요. 자세한 내용은 Transaction management를 참고해요.
파라미터 (Parameters):
conn_handle(BIGINT):odbc_connect로 만든 ODBC 연결 핸들
반환 (Returns):
항상 NULL (VARCHAR) 반환.
예시 (Example):
SELECT odbc_commit(getvariable('conn'))
odbc_connect
odbc_connect(conn_string VARCHAR) -> BIGINT
odbc_connect(conn_string VARCHAR, username VARCHAR, password VARCHAR) -> BIGINT
원격 DB에 대한 ODBC 연결을 엽니다.
username과 password(위치) 파라미터가 지정되면 UID와 PWD로 연결 문자열에 추가돼요.
파라미터 (Parameters):
conn_string(VARCHAR): Driver Manager에 전달되는 ODBC 연결 문자열.
반환 (Returns):
VARIABLE에 넣을 수 있는 연결 핸들. 연결은 자동으로 닫히지 않으며, odbc_close로 닫아야 해요.
예시 (Example):
SET VARIABLE conn = odbc_connect('Driver={Oracle Driver};DBQ=//127.0.0.1:1521/XE;UID=scott;PWD=tiger')
SET VARIABLE conn = odbc_connect('Driver={Oracle Driver};DBQ=//127.0.0.1:1521/XE', 'scott', 'tiger')
odbc_copy
odbc_copy(conn_handle BIGINT, [, <optional named parameters>]) -> TABLE
odbc_copy(conn_string VARCHAR, [, <optional named parameters>]) -> TABLE
DuckDB가 접근할 수 있는 파일이나 테이블에서 원격 DB로 행을 복사해요.
경고 (Warning) Python Relational API에서
odbc_copy를 사용할 때.
odbc_copy는 복사된 2048행마다 하나의 행을 반환하는 테이블 함수예요. Python에서duckdb.sql()로 사용하면 Lazy Evaluation이 일어나요. 그래서 실행을 트리거하는 메서드가 결과 릴레이션에 호출되고 모든 결과 행이 소비될 때까지 어떤 행도 복사되지 않아요.
파라미터 (Parameters):
conn_handle_or_string(BIGINT또는VARCHAR), 다음 중 하나:odbc_connect로 만든 ODBC 연결 핸들- 일회성 쿼리를 위한 ODBC 연결 문자열. 이 경우 새 ODBC 연결이 열리고 쿼리가 끝나면 자동으로 닫혀요
선택적 명명된 파라미터 (source):
소스 쿼리는
odbc_copy가 호출되는 인스턴스와 별개의 DB 인스턴스를 사용해 실행돼요. 따라서source_query는 기존 인메모리 테이블을 참조할 수 없고 현재 열려 있는 DuckDB 파일을 열 수 없어요. 해결 방법으로, 복잡한 소스 쿼리의 경우 쿼리 결과를 먼저 로컬 Parquet 파일로 내보낸 다음 그 파일에odbc_copy를 실행하는 것이 좋아요.
source_conn_string(VARCHAR, 기본::memory:): 소스 DB에 대한 DuckDB 연결 문자열. 예:ducklake:postgres:postgresql://username:***@127.0.0.1:5432/lake1source_file(VARCHAR): DuckDB로 읽을 (원격 또는 로컬) Parquet, CSV, JSON 파일 경로. 예:https://blobs.duckdb.org/nl_stations.csv.source_query='SELECT * FROM '<source_file>'과 동일source_query(VARCHAR): 데이터를 읽을 DuckDB SQL 쿼리. 예:FROM nl_train_stationssource_queries(LIST(VARCHAR)): 하나씩 실행되는 여러 DuckDB SQL 쿼리. 마지막 쿼리가 복사할 결과 집합을 반환해야 하고, 이전 쿼리의 결과는 버려지며, 모든 쿼리의 결과는 메모리에 구체화돼요. 예:
source_queries=[
'CREATE SECRET s (TYPE s3 [...])',
'FROM nl_train_stations'
],
source_limit(UBIGINT, 기본:0): 한 번에 소스 쿼리/파일에서 읽을 레코드 수. 이 옵션이 지정되면 소스 쿼리는LIMIT <limit> OFFSET <offset>을 추가해 여러 번 실행돼요.2048이상이어야 하고2048이 나머지 없이 나눠질 수 있어야 해요
선택적 명명된 파라미터 (destination):
dest_table(VARCHAR): 원격 DB의 대상 테이블 이름.INSERT와CREATE TABLE쿼리에 사용됨.dest_query가 지정되면 지정할 수 없음; DB마다 대소문자 구분과 기본 대소문자 규칙이 달라서 대상 테이블 이름을 대문자TAB1로 지정하거나 따옴표 형태"tab1"(또는 스키마 이름 포함"schema1"."tab1")으로 지정해야 할 수 있어요dest_query(VARCHAR): 각 소스 배치에 대해 원격 DB에서 실행될 쿼리. ODBC 파라미터 플레이스홀더?의 수가source_columns_count * batch_size와 같아야 함.dest_table이 지정되면 지정할 수 없음. 예:CALL import_city(?,?,?,?)dest_query_single(VARCHAR):batch_size>0이고 마지막 소스 배치에서 읽은 행 수가batch_size보다 적을 때만 사용됨. 이 경우dest_query대신 사용. ODBC 파라미터 플레이스홀더?의 수가source_columns_count와 같아야 해요
선택적 명명된 파라미터 (create table):
create_table(BOOLEAN, 기본:FALSE): 소스 쿼리의 컬럼 이름과 컬럼 타입을 사용해 대상 원격 DB에 테이블을 만들지 여부. 사실상 CTAS(create table as select) 구현column_types(MAP(VARCHAR, VARCHAR)):create_table=TRUE가 지정될 때 소스 DuckDB 타입과 대상 RDBMS 타입 사이의 타입 매핑을 제공/재정의할 수 있게 해줌. 예:
create_table=TRUE,
column_types=MAP {
'DUCKDB_TYPE_VARCHAR': 'VARCHAR2(10)',
'DUCKDB_TYPE_DECIMAL': 'NUMBER({typmod1},{typmod2})'}
column_quotes(VARCHAR, 기본:"): 생성된CREATE TABLE과INSERT쿼리에서 컬럼 이름을 인용하는 데 사용할 인용 문자(또는 문자열)commit_after_create_table(BOOLEAN, 기본:FALSE):CREATE TABLE실행 후COMMIT을 발행할지 여부. Firebird에서는 자동으로 활성화됨
선택적 명명된 파라미터 (query parameters handling):
decimal_params_as_chars(BOOLEAN, 기본:false):DECIMAL파라미터를VARCHAR로 전달integral_params_as_decimals(BOOLEAN, 기본:false): (부호 없는)TINYINT,SMALLINT,INTEGER,BIGINT파라미터를SQL_C_NUMERIC으로 전달.
선택적 명명된 파라미터 (other):
batch_size(UINTEGER, 기본:16): 원격 DB에 대한 단일SQLExecuteODBC 호출에서 삽입(또는dest_query의 경우 실행)할 레코드 수. 허용 값:1,2,4,8,16,32,64,128,256,512,1024,2048use_insert_all(BOOLEAN, 기본:FALSE):INSERT ... VALUES (...), (...), ... (...)배치 삽입 대신INSERT ALL배치 삽입 쿼리 생성. Oracle에서는 자동으로 활성화됨use_insert_union(BOOLEAN, 기본:FALSE):INSERT ... VALUES (...), (...), ... (...)배치 삽입 대신INSERT ... SELECT FROM ... UNION ALL ...배치 삽입 쿼리 생성. Firebird에서는 자동으로 활성화됨dummy_table_name(VARCHAR):INSERT ALL과INSERT UNION쿼리에 사용할 더미 테이블 이름. Oracle은dualcopy_in_transaction(BOOLEAN, 기본:TRUE): 이 복사 호출에 대해 원격 DB에서 트랜잭션 시작. 모든 행이 처리되면 커밋, 에러 시 롤백max_records_in_transaction(UBIGINT, 기본:0): 지정 시 지정된 수의 행이 처리된 후마다 원격 트랜잭션을 커밋하게 함close_connection(BOOLEAN, 기본:false): 함수 호출이 완료된 후 전달된 연결을 닫음.odbc_copy의 일회성 호출과 함께 사용하기 위한 것
반환 (Returns):
다음 컬럼의 테이블:
completed(BOOLEAN): 이 출력 행이 결과 집합의 마지막 행인지 여부rows_processed(UBIGINT): 소스에서 읽은 행 수elapsed_seconds(FLOAT): 복사 프로세스 시작 후 경과한 초 수rows_per_second(FLOAT): 1초에 처리된 행 수table_ddl(VARCHAR): 복사 프로세스를 시작하기 전에 원격 DB에서 실행된 생성된CREATE TABLE쿼리
소스에서 읽은 2048행마다 하나의 결과 행이 출력돼요. completed=TRUE와 non-null table_ddl 값은 마지막 행만 가져요(create_table=TRUE가 지정된 경우에만).
예시 (Examples):
FROM odbc_copy(getvariable('conn'),
source_file='https://blobs.duckdb.org/nl_stations.csv',
dest_table='NL_TRAIN_STATIONS',
create_table=TRUE)
FROM odbc_copy(getvariable('conn'),
source_conn_string='ducklake:postgres:postgresql://username:***@127.0.0.1:5432/lake1',
source_queries=[
'CREATE SECRET s (TYPE s3 [...])',
'FROM nl_train_stations'
],
dest_table='NL_TRAIN_STATIONS',
create_table=TRUE,
batch_size=32,
max_records_in_transaction=42);
odbc_create_params
odbc_create_params() -> BIGINT
파라미터 핸들을 만든다. 2단계 파라미터 바인딩에서만 필요해요. 자세한 내용은 Query parameters를 참고해요.
파라미터 (Parameters):
없음.
반환 (Returns):
파라미터 핸들(BIGINT). 핸들이 odbc_query로 전달되면 기본 준비된 문(prepared statement)에 연결되고 문이 닫힐 때 자동으로 닫혀요.
예시 (Example):
SET VARIABLE params1 = odbc_create_params()
odbc_list_data_sources
odbc_list_data_sources() -> TABLE(name VARCHAR, description VARCHAR, type VARCHAR)
OS에 등록된 ODBC 데이터 소스 목록을 반환해요. 드라이버 매니저 호출 SQLDataSources를 사용해요.
파라미터 (Parameters):
없음.
반환 (Returns):
다음 컬럼의 테이블:
name(VARCHAR): 데이터 소스 이름description(VARCHAR): 데이터 소스 설명type(VARCHAR): 데이터 소스 타입.USER또는SYSTEM
예시 (Example):
FROM odbc_list_data_sources()
odbc_list_drivers
odbc_list_drivers() -> TABLE(description VARCHAR, attributes MAP(VARCHAR, VARCHAR))
OS에 등록된 ODBC 드라이버 목록을 반환해요. 드라이버 매니저 호출 SQLDrivers를 사용해요.
파라미터 (Parameters):
없음.
반환 (Returns):
다음 컬럼의 테이블:
description(VARCHAR): 드라이버 설명attributes(MAP(VARCHAR, VARCHAR)):name->value맵으로서의 드라이버 속성
예시 (Example):
FROM odbc_list_drivers()
odbc_query
odbc_query(conn_handle BIGINT, query VARCHAR[, <optional named parameters>]) -> TABLE
odbc_query(conn_string VARCHAR, query VARCHAR[, <optional named parameters>]) -> TABLE
원격 DB에서 지정된 쿼리를 실행하고 쿼리 결과 테이블을 반환해요.
파라미터 (Parameters):
conn_handle_or_string(BIGINT또는VARCHAR), 다음 중 하나:odbc_connect로 만든 ODBC 연결 핸들- 일회성 쿼리를 위한 ODBC 연결 문자열. 이 경우 새 ODBC 연결이 열리고 쿼리가 끝나면 자동으로 닫혀요
query(VARCHAR): 원격 DBMS로 전달되는 SQL 쿼리
쿼리 파라미터를 전달하는 데 사용할 수 있는 선택적 명명된 파라미터:
params(STRUCT): 원격 DBMS에 전달할 쿼리 파라미터params_handle(BIGINT):odbc_create_params로 만든 파라미터 핸들. 2단계 파라미터 바인딩에서만 사용. 자세한 내용은 Query parameters를 참고해요.
타입 매핑을 바꿀 수 있는 선택적 명명된 파라미터:
익스텐션은 쿼리 파라미터가 어떻게 전달되고 결과 데이터가 어떻게 처리되는지 바꾸는 데 사용할 수 있는 여러 옵션을 지원해요. 알려진 DB에 대해 이 옵션들은 자동으로 설정돼요. 자동 구성을 재정의하기 위해 odbc_query 함수에 명명된 파라미터로 전달할 수도 있어요:
decimal_columns_as_chars(BOOLEAN, 기본:false):DECIMAL값을VARCHAR로 읽되 클라이언트에 반환하기 전에 다시DECIMAL로 파싱decimal_columns_precision_through_ard(BOOLEAN, 기본:false):DECIMAL을 읽을 때 "Application Row Descriptor"를 통해precision과scale지정decimal_columns_as_ard_type(BOOLEAN, 기본:false):DECIMAL을 읽을 때SQL_C_NUMERIC대신SQL_ARD_TYPE사용decimal_params_as_chars(BOOLEAN, 기본:false):DECIMAL파라미터를VARCHAR로 전달integral_params_as_decimals(BOOLEAN, 기본:false): (부호 없는)TINYINT,SMALLINT,INTEGER,BIGINT파라미터를SQL_C_NUMERIC으로 전달.reset_stmt_before_execute(BOOLEAN, 기본:false): 실행 전에 준비된 문을 재설정(SQLFreeStmt(h, SQL_CLOSE)사용)time_params_as_ss_time2(BOOLEAN, 기본:false):TIME파라미터를 SQL Server의TIME2값으로 전달timestamp_columns_as_timestamp_ns(BOOLEAN, 기본:false):TIMESTAMP-류(TIMESTAMP WITH LOCAL TIME ZONE,DATETIME2,TIMESTAMP_NTZ등) 컬럼을 나노초 정밀도(소수 9자리)로 읽기timestamp_columns_with_typename_date_as_date(BOOLEAN, 기본:false): 타입 이름이DATE인TIMESTAMP컬럼을 DuckDBDATE로 읽기timestamp_max_fraction_precision(UTINYINT, 기본:9): 나노초 정밀도의TIMESTAMP컬럼을 읽을 때 사용할 최대 소수 자리 수timestamp_params_as_sf_timestamp_ntz(BOOLEAN, 기본:false):TIMESTAMP파라미터를 Snowflake의TIMESTAMP_NTZ로 전달timestamptz_params_as_ss_timestampoffset(BOOLEAN, 기본:false):TIMESTAMP_TZ파라미터를 SQL Server의DATETIMEOFFSET으로 전달var_len_data_single_part(BOOLEAN, 기본:false): 긴VARCHAR또는VARBINARY값을 단일 읽기로 읽기(드라이버가 Variable-Length Data를 부분적으로 검색을 지원하지 않을 때 사용)var_len_params_long_threshold_bytes(UINTEGER, 기본:4000): 이후부터SQL_WVARCHAR파라미터를SQL_WLONGVARCHAR로 전달하는 길이 임계값enable_columns_binding(BOOLEAN, 기본:false): 고정 크기 컬럼에SQLGetData대신SQLBindCol사용 허용 여부
기타 선택적 명명된 파라미터:
ignore_exec_failure(BOOLEAN, 기본:false): 원격 DB에서 실행되는 쿼리가 성공적으로 준비될 수 있지만 실행 시점에(예: 테이블 존재 같은 스키마 상태 때문에) 실패할 수도 있을 때, 이 플래그를 사용해 쿼리 실행 실패 시 에러를 던지지 않을 수 있음. 쿼리 실행이 실패하면 빈 결과 집합이 반환돼요.close_connection(BOOLEAN, 기본:false): 함수 호출 완료 후 전달된 연결을 닫음.odbc_query의 일회성 호출과 함께 사용하기 위한 것. 예:
FROM odbc_query(
odbc_connect('Driver={Oracle Driver};DBQ=//127.0.0.1:1521/XE', 'scott', 'tiger'),
'SELECT 42 FROM dual',
close_connection=TRUE);
반환 (Returns):
쿼리 결과가 담긴 테이블.
예시 (Example):
FROM odbc_query(getvariable('conn'),
'SELECT CAST(? AS NVARCHAR2(2)) || CAST(? AS VARCHAR2(5)) FROM dual',
params=row('🦆', 'quack')
)
odbc_rollback
odbc_rollback(conn_handle BIGINT) -> VARCHAR
지정된 연결에서 SQL_ROLLBACK 인자로 SQLEndTran을 호출해 현재 트랜잭션을 완료해요. 이 호출 전에 이 연결에서 odbc_begin_transaction을 호출해야 완료가 효과가 있어요. 자세한 내용은 Transaction management를 참고해요.
파라미터 (Parameters):
conn_handle(BIGINT):odbc_connect로 만든 ODBC 연결 핸들
반환 (Returns):
항상 NULL (VARCHAR) 반환.
예시 (Example):
SELECT odbc_rollback(getvariable('conn'))
더 알아보기 (Learn more)
- ODBC 익스텐션 — 연결·파라미터·트랜잭션 관리 전반.