결과 사용하기¶
인라인 결과 반환하기¶
결과를 사용하는 가장 일반적인 방법은 complete
콜백을 connection.execute()
로 전달하는 방법입니다. 문의 실행이 종료되고 결과를 사용할 수 있으면, 결과 행이 인라인으로 반환되면서 complete
콜백이 호출됩니다.
connection.execute({ sqlText: 'SELECT * FROM sometable', complete: function(err, stmt, rows) { if (err) { console.error('Failed to execute statement due to the following error: ' + err.message); } else { console.log('Number of rows produced: ' + rows.length); } } });
결과 스트리밍하기¶
결과를 행의 스트림으로 사용할 수도 있습니다. 이는 statement.streamRows()
메서드를 호출하여 수행할 수 있으며, 이를 통해 수신될 때 행을 사용하기 위해 사용될 수 있는 Node.js Readable
스트림이 반환됩니다. Readable
스트림에 대한 자세한 내용은 Node.js 설명서 를 참조하십시오.
예:
var statement = connection.execute({ sqlText: 'SELECT * FROM sometable' }); var stream = statement.streamRows(); stream.on('error', function(err) { console.error('Unable to consume all rows'); }); stream.on('data', function(row) { // consume result row... }); stream.on('end', function() { console.log('All rows consumed'); });
일괄 처리 결과¶
기본적으로 statement.streamRows()
메서드에서는 결과의 모든 행이 포함되는 스트림이 생성됩니다. 그러나 하위 결과 세트만을 사용하거나 결과 행을 일괄적으로 사용하려는 경우에는 start
및 end
인자를 사용하여 streamRows()
를 호출할 수 있습니다. 이러한 추가 옵션이 지정되면 요청된 범위 내의 행만 스트리밍됩니다.
connection.execute({ sqlText: 'SELECT * FROM sometable', streamResult: true, // prevent rows from being returned inline in the complete callback complete: function(err, stmt, rows) { // no rows returned inline because streamResult was set to true console.log('rows: ' + rows); // 'rows: undefined' // only consume at most the last 5 rows in the result rows = []; stmt.streamRows({ start: Math.max(0, stmt.getNumRows() - 5), end: stmt.getNumRows() - 1, }) .on('error', function(err) { console.error('Unable to consume requested rows'); }) .on('data', function(row) { rows.push(row); }) .on('end', function() { console.log('Number of rows consumed: ' + rows.length); }); } })
데이터 타입 캐스팅¶
결과 행이 생성되면 드라이버는 SQL 데이터 타입을 해당 JavaScript 데이터 타입으로 자동으로 매핑합니다. 예를 들어, TIMESTAMP 및 DATE 타입의 값은 JavaScript 날짜 오브젝트로 반환됩니다.
JavaScript를 SQL 데이터 타입으로 완전하게 매핑하려면 아래 테이블을 참조하십시오.
SQL 데이터 타입
JavaScript 데이터 타입
참고
VARCHAR, CHAR, CHARACTER, STRING, TEXT
String
INT, INTEGER, BIGINT, SMALLINT
숫자
기본 매핑입니다. 세션 매개 변수 JS_TREAT_INTEGER_AS_BIGINT를 사용하여 JavaScript Bigint로 매핑합니다.
NUMBER(전체 자릿수, 소수 자릿수), DECIMAL(p, s), NUMERIC(p, s), 여기서
scale
= 0숫자
기본 매핑입니다. 세션 매개 변수 JS_TREAT_INTEGER_AS_BIGINT를 사용하여 JavaScript Bigint로 매핑합니다.
NUMBER(전체 자릿수, 소수 자릿수), DECIMAL(p, s), NUMERIC(p, s), 여기서
scale
> 0숫자
FLOAT, FLOAT4, FLOAT8, DOUBLE, DOUBLE PRECISION, REAL
숫자
TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ
날짜
TIMESTAMP_NTZ 값은 UTC 시간으로 반환됩니다.
DATE
날짜
TIME
String
SQL의 TIME 데이터 타입에 해당하는 타입이 JavaScript에는 없으며, 그러므로 JavaScript 문자열로 매핑됩니다.
BOOLEAN
Boolean
VARIANT, ARRAY, OBJECT
JSON
정수 데이터 타입을 Bigint로 가져오기¶
기본적으로, Snowflake INTEGER 열(BIGINT, NUMBER(p, 0) 등 포함)은 JavaScript의 Number 데이터 타입으로 변환됩니다. 하지만 가장 큰 올바른 Snowflake 정수 값은 가장 큰 올바른 JavaScript Number 값보다 큽니다. Snowflake INTEGER 열을 JavaScript Number보다 큰 값을 저장할 수 있는 JavaScript Bigint로 변환하려면 세션 매개 변수 JS_TREAT_INTEGER_AS_BIGINT를 설정합니다.
이 매개 변수는 다음의 2가지 방법으로 설정할 수 있습니다.
아래와 같이 ALTER SESSION 문을 사용합니다.
connection.execute( { sqlText: 'ALTER SESSION SET JS_TREAT_INTEGER_AS_BIGINT = TRUE', complete: function ... } );
연결 구성 정보에 매개 변수를 지정합니다.
var connection = snowflake.createConnection( { username: 'fakeusername', password: 'fakepassword', account: 'fakeaccountidentifier', jsTreatIntegerAsBigInt: true } );
데이터 타입을 문자열로 가져오기¶
connection.execute()
가 호출될 때 fetchAsString
옵션을 설정하여 모든 숫자 또는 날짜를 문자열로 강제 반환하도록 설정할 수 있습니다. 이를 통해 얻을 수 있는 결과는 다음과 같습니다.
DATE 또는 TIMESTAMP(또는 베리언트) 타입 값의 타입이 지정된 버전.
전체 자릿수가 손실되지 않고 JavaScript 숫자로 변환할 수 없는 숫자 SQL 타입의 문자열 버전.
예:
connection.execute({
sqlText: 'SELECT 1.123456789123456789123456789 as "c1"',
fetchAsString: ['Number'],
complete: function(err, stmt, rows) {
if (err) {
console.error('Failed to execute statement due to the following error: ' + err.message);
} else {
console.log('c1: ' + rows[0].c1); // c1: 1.123456789123456789123456789
}
}
});