code: def exec(self, *args, **kwargs) -> Iterator[Batch]:
      db_catalog_entry = self.db.catalog().get_database_catalog_entry(
          self._database_name
      )
  
      if db_catalog_entry is None:
          raise ExecutorError(
              f"{self._database_name} data source does not exist. Use CREATE DATABASE to add a new data source."
          )
  
      with get_database_handler(
          db_catalog_entry.engine, **db_catalog_entry.params
      ) as handler:
          resp = handler.execute_native_query(self._query_string)
  
      if resp and resp.error is None:
          yield Batch(resp.data)
      else:
          raise ExecutorError(resp.error)
  
file_path: evadb/evadb/executor/use_executor.py
imports: from typing import Iterator
  from evadb.database import EvaDBDatabase
  from evadb.executor.abstract_executor import AbstractExecutor
  from evadb.executor.executor_utils import ExecutorError
  from evadb.models.storage.batch import Batch
  from evadb.parser.use_statement import UseStatement
  from evadb.third_party.databases.interface import get_database_handler
label_desc: Use image node_id 2 for calling the UseExecutor obj's underlying member method code with example usage: obj.exec() without return types