⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cursor.cpp

📁 在动态库中实现异步导出大数据量的oracle数据
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      int getYear(const string &col) const
 */
void OCICPP::Cursor::getYear(int col,int &year) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_DAT) throw OraError("OCICPPLIB: Trying to get Month from non-date column",OCICPPERROR);
	if(row[col]->isNull(curRow)) year=0;
	else ((OraDate *)row[col])->getYear(year,curRow);
}

/*!
  If used for a Date-Column named \a colName, this function returns the year
  from this date.

  \sa void getYear(int ,int &) const
      int getYear(int col) const
      int getYear(const string &col) const
 */
void OCICPP::Cursor::getYear(const std::string &colName,int &val) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getYear(iter->second,val);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/*! \fn int OCICPP::Cursor::getYear(int col) const
  If used for a Date-Column \a col, this function reads the \a year from this
  date.

  \sa void getYear(int ,int &) const
      void getYear(const std::string &,int &) const
      int getYear(const string &col) const
 */

/*! \fn int OCICPP::Cursor::getYear(const string &col) const
  If used for a Date-Column named \a colName, this function returns the year
  from this date.

  \sa void getYear(int ,int &) const
      void getYear(const std::string &,int &) const
      int getYear(const string &col) const
 */

/* lob-related functions --------------------------------------------- */

/*!
  Initializes \a lob with the content of the character large object (CLOB) in
  column \a col from the cursor's current position.

  \sa void getCLOB(const std::string &,Lob &) const
 */
void OCICPP::Cursor::getCLOB(int col,Lob &lob) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_CLOB) throw OraError("OCICPPLIB: Trying to get CLOB from non-CLOB column",OCICPPERROR);
	((OraLob *)row[col])->getCLOB(lob,curRow); /* It's because lob's operation needs Server Context as one of it arguments */ 
}

/*!
  Initializes \a lob with the content of the character large object (CLOB)
  from  the column named \a colName from the cursor's current position.

  \sa void getCLOB(int,Lob &) const
 */
void OCICPP::Cursor::getCLOB(const std::string &colName,Lob &lob) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		DEBUG(DLEV_DEBUG,"Fetching CLOB\n");
		getCLOB(iter->second,lob);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/*!
  Initializes \a lob with the content of the binary large object (BLOB) in
  column \a col from the cursor's current position.

  \sa void getBLOB(const std::string &,Lob &) const
 */
void OCICPP::Cursor::getBLOB(const int col,Lob &lob) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_BLOB) throw OraError("OCICPPLIB: Trying to get BLOB from non-BLOB column",OCICPPERROR);
	((OraLob *)row[col])->getBLOB(lob,curRow);
}

/*!
  Initializes \a lob with the content of the binary large object (BLOB) from 
  the column named \a colName from the cursor's current position.

  \sa void getBLOB(const int ,Lob &) const
 */
void OCICPP::Cursor::getBLOB(const std::string &colName,Lob &lob) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getBLOB(iter->second,lob);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/*!
  Initializes \a bfile with the content of an external binary large object
  (BFILE) from  the column \a col from the cursor's current position.

  \sa void getFILE(const std::string &,BFile &) const
 */
void OCICPP::Cursor::getFILE(const int col,BFile &bfile) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_FILE) throw OraError("OCICPPLIB: Trying to get BFILE from non-BFILE column",OCICPPERROR);
	((OraBFile *)row[col])->getFILE(bfile,curRow);
}

/*!
  Initializes \a bfile with the content of an external binary large object
  (BFILE) from  the column named \a colName from the cursor's current position.

  \sa void getFILE(const int,BFile &) const
 */
void OCICPP::Cursor::getFILE(const std::string &colName,BFile &bfile) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getFILE(iter->second,bfile);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}


/* RowID related functions ----------------------------------------*/
void OCICPP::Cursor::getRowID(int col,RowID &rowid) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_RDD) throw OraError("OCICPPLIB: Trying to get RowID from non-RowID column",OCICPPERROR);
	rowid.init((OraRowID *)row[col]); 
}

void OCICPP::Cursor::getRowID(const std::string &colName,RowID &rowid) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getRowID(iter->second,rowid);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/* REFCURSOR related functions -------------------------------------*/

/*!
  Retreives a cursor produced as a refernce from an SQL statement.

  A brief example showing how the interaction with this cursor behaves:
  \code
  OCICPP::Connection con;
  OCICPP::Cursor cur, cur2;
  void printCursor( OCICPP::Cursor & );
  ...
  
  con.prepare(
    "SELECT id, CURSOR( select * FROM TABLE( my_tab.ANN ) ) "
    "FROM test my_tab", cur );
  cur.execute();

  while ( cur.fetch() )
  {
    printCursor( cur );
    cur.getCursor( 1, cur2 );
    cur2.execute();
    while ( cur2.fetch() )
    {
      printCursor( cur2 );
    }
  }
  \endcode
  
  \sa void getCursor( const std::string &,Cursor & ) const
 */
void OCICPP::Cursor::getCursor(int col,Cursor &cur) const {
	if(!canFetch || col<0 || col>=nCols) throw OraError(CELL_NOT_EXISTS);
	if(row[col]->getType()!=SQLT_RSET) throw OraError("OCICPPLIB: Trying to get CURSOR from non-CURSOR column",OCICPPERROR);	
	cur.drop();
	cur.init(envhp,svchp,errhp,1,NTABLE);
	cur.stmthp=((OraRefCur *)row[col])->getStmt(curRow);
}

/*!
 Retreives a cursor produced as a refernce from an SQL statement.

 \sa void getCursor( int, Cursor & ) const
*/
void OCICPP::Cursor::getCursor(const std::string &colName,Cursor &cur) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getCursor(iter->second,cur);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/* ----------------------*/


/*!
  Returns the number of columns within this cursor.
 */
int OCICPP::Cursor::getNCols() const {
	if(haveResultSet) return (int)nCols;
	throw OraError("OCICPPLIB: Can't return number of columns: No result set for this cursor",OCICPPERROR);
}	

/*!
  Retreive the name of column \a col into \a ret_col .
 */
void OCICPP::Cursor::getColName(int col,std::string &ret_col) const {
	if(!haveResultSet) throw OraError("OCICPPLIB: Cannot get column name: No result set for this cursor",OCICPPERROR);
	if(col<0 || col>=nCols) throw OraError("OCICPPLIB: Cannot get column name: column number is out of range",OCICPPERROR);
	row[col]->getAttrName(ret_col);
}

/*!
  Retrieve the size for the cursor's column indexed by \a col . The
  interpretation of the returned figure depends on the type of the column. For
  example, if a column of type \c CHAR has a size of 32, it max store 32
  characters.
  \sa int getColSize(const string &) const
 */
int OCICPP::Cursor::getColSize(int col) const {
	if(!haveResultSet) throw OraError("OCICPPLIB: Cannot get column name: No result set for this cursor",OCICPPERROR);
	if(col<0 || col>=nCols) throw OraError("OCICPPLIB: Cannot get column name: column number is out of range",OCICPPERROR);
	return row[col]->getSize();
}

/*!
  Retrieve the size for the cursor's column named \a colName .

  \sa int getColSize(int col) const
 */
int OCICPP::Cursor::getColSize(const std::string &colName) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		return getColSize(iter->second);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}	
}

/*!
  Returns the internal Oracle type for column \a col . \a col is counted
  starting from 0 for the first column selected within the current cursor.

  The possible return value may be \c SQLT_CHR, \c SQLT_NUM, \c SQLT_DAT and
  many more. (please refer to the Oracle OCI documentation for additional
  details)

  \sa int getColType(const std::string &colName) const
 */
int OCICPP::Cursor::getColType(int col) const {
	if(!haveResultSet) throw OraError("OCICPPLIB: Cannot get column type: No result set for this cursor",OCICPPERROR);
	if(col<0 || col>=nCols) throw OraError("OCICPPLIB: Cannot get column type: column number is out of range",OCICPPERROR);	
	return row[col]->getType();
}

/*!
  Returns the internal Oracle type for column named \a colName . \a col is
  counted starting from 0 for the first column selected within the current
  cursor.

  The possible return value may be \c SQLT_CHR, \c SQLT_NUM, \c SQLT_DAT and
  many more (please refer to the Oracle OCI documentation for additional
  details)

  \sa int getColType(int col) const
 */
int OCICPP::Cursor::getColType(const std::string &colName) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		return getColType(iter->second);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/*!
  Store the description of the type of the data stored in column index by
  \a col into \a typeName .
  \sa void getColTypeName(const string &,string &) const
 */
void OCICPP::Cursor::getColTypeName(int col,std::string &typeName) const {
	if(!haveResultSet) throw OraError("OCICPPLIB: Cannot get column type name: No result set for this cursor",OCICPPERROR);
	if(col<0 || col>=nCols) throw OraError("OCICPPLIB: Cannot get column type name: column number is out of range",OCICPPERROR);	
	row[col]->getTypeName(typeName);
}

/*!
  Store the description of the type of the data stored in column named 
  \a colName into \a typeName .
  \sa void getColTypeName(int,string &) const
 */
void OCICPP::Cursor::getColTypeName(const std::string &colName,std::string &typeName) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		getColTypeName(iter->second,typeName);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/*!
  Returns \c TRUE if the value stored within column \a col is not set in the
  row the cursor is currently pointing to (equivalent to a NULL-value in 
  SQL-Terms)

  \sa bool isNull(const string &) const
 */
bool OCICPP::Cursor::isNull(int col) const {
	if(!haveResultSet) throw OraError("OCICPPLIB: No result set for this cursor",OCICPPERROR);
	if(col<0 || col>=nCols) throw OraError("OCICPPLIB: Column number is out of range",OCICPPERROR);
	return row[col]->isNull(curRow);	
}

/*!
  Returns \c TRUE if the value stored within column named \a colName is not set
  in the row the cursor is currently pointing to (equivalent to a NULL-value
  in  SQL-Terms)

  \sa bool isNull(int) const
 */
bool OCICPP::Cursor::isNull(const std::string &colName) const {
	map<string,int>::const_iterator iter=cols_map.find(colName);
	if(iter!=cols_map.end()) {
		return isNull(iter->second);
	} else {
		throw OraError(CELL_NOT_EXISTS);
	}
}

/* Set's text which will be returned on request of null cell default "" (empty text) */	

/*!
  Set's text which will be returned on request of null cell default ""
  (empty text)
*/	
void OCICPP::Cursor::setNullText(const std::string &nulltext) {
	this->nulltext.assign(nulltext);
}

void OCICPP::Cursor::newCellByType(OraType **cell,OCIStmt *stmt,int col) {
	/* Get type */
	ub2 colType;
	OCIParam *paramd;
	CHECKERR(errhp,OCIParamGet(stmthp,OCI_HTYPE_STMT,errhp,(dvoid **) &paramd,col+1));
	CHECKERR(errhp,OCIAttrGet((dvoid *) paramd,OCI_DTYPE_PARAM,(dvoid *) &colType,(ub4 *) 0,(ub4) OCI_ATTR_DATA_TYPE,errhp));
	switch(colType) {
		/* String variables */
		case SQLT_CHR:
		case SQLT_LNG:
		case SQLT_AFC:
			*cell=new OraString(envhp,errhp,paramd,colType,prefetchRows);
			break;
		/* Raw & Long Raw */
		case SQLT_BIN:
		case SQLT_LBI:
			*cell=new OraRaw(envhp,errhp,paramd,colType,prefetchRows);
			break;
		/* MLSLABEL */
		case SQLT_LAB:
			*cell=new OraLabel(envhp,errhp,paramd,colType,prefetchRows);
			break;
		/* Numbers */
		case SQLT_NUM:
			*cell=new OraNumber(envhp,errhp,paramd,colType,prefetchRows);
			break;
		/* ROWID */
		case SQLT_RID:
		case SQLT_RDD:
			*cell=new OraRowID(envhp,errhp,paramd,colType,prefetchRows);
			break;
		/* Date */
		case SQLT_DAT:
			*cell=new OraDate(envhp,errhp,paramd,colType,prefetchRows);
			break;
		case SQLT_CLOB:
		case SQLT_BLOB:
			*cell=new OraLob(envhp,errhp,paramd,svchp,colType,prefetchRows);
			break;
		case SQLT_FILE:
			*cell=new OraBFile(envhp,errhp,paramd,svchp,colType,prefetchRows);
			break;
		/* REF CURSORS (nested tables) */
		case SQLT_RSET:
			*cell=new OraRefCur(envhp,errhp,paramd,colType,prefetchRows);
			break;
		case SQLT_NTY:
		case SQLT_REF:
		default:
			*cell=new OraDummy(envhp,errhp,paramd,colType,prefetchRows);
			break;
	}
}
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -