결과 사용하기

인라인 결과 반환하기

결과를 사용하는 가장 일반적인 방법은 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);
    }
  }
});
Copy

결과 스트리밍하기

결과를 행의 스트림으로 사용할 수도 있습니다. 이는 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');
});
Copy

일괄 처리 결과

기본적으로 statement.streamRows() 메서드에서는 결과의 모든 행이 포함되는 스트림이 생성됩니다. 그러나 하위 결과 세트만을 사용하거나 결과 행을 일괄적으로 사용하려는 경우에는 startend 인자를 사용하여 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);
    });
  }
})
Copy

데이터 타입 캐스팅

결과 행이 생성되면 드라이버는 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 ...
                        }
                      );
    
    Copy
  • 연결 구성 정보에 매개 변수를 지정합니다.

    var connection = snowflake.createConnection(
          {
          username: 'fakeusername',
          password: 'fakepassword',
          account: 'fakeaccountidentifier',
          jsTreatIntegerAsBigInt: true
          }
        );
    
    Copy

데이터 타입을 문자열로 가져오기

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
    }
  }
});
Copy