ocistmt.h

来自「一个通用的oracle OCI开发程序包」· C头文件 代码 · 共 211 行

H
211
字号
#ifndef _COCIStatement
#define _COCIStatement

#if defined(_WIN32)
#pragma warning(disable : 4786 4800 4666)
#endif

#ifndef OCI_ORACLE
#include "oci.h"
#endif

#ifndef _CIndStruct
#include "ociind.h"
#endif

#ifndef _STRING_
#include <string>
#endif

#ifndef _VECTOR_
#include <vector>
#endif

class COCISession;
class COCILob;
class COCIRef;
class COCIObject;
class COCIBinary;
class COCINumber;
class COCIDate;
class COCIString;

template<class T>
class COCIVArray;
template<class T>
class COCINestedTable;


class COCIStatement
{
public:
  COCIStatement(const COCISession& Sess);
  ~COCIStatement();

  COCIStatement& operator = (char * str);
  bool execute(void);
  bool fetch(void);
  void fix_up_object(void);
  void fix_up_ref(void);
  void fix_up_coll(void);
  void clean_up(void);

  ub4  rows_fetched(){return m_RowsFetched;}

  // define are read variables
  // bind are write variables

  // int
  void define(int pos, int& valuep, signed short* is_null = false);
  void define(int pos, std::vector<int>& valuep);
  void bind(int pos, int& valuep);
  void bind(char* name, int& valuep);
  void bind(int pos, std::vector<int>& valuep);
  void bind(char* name, std::vector<int>& valuep);

  // long
  void define(int pos, long& valuep);
  void define(int pos, std::vector<long>& valuep);
  void bind(int pos, long& valuep);
  void bind(char* name, long& valuep);
  void bind(int pos, std::vector<long>& valuep);
  void bind(char* name, std::vector<long>& valuep);

  // float
  void define(int pos, float& valuep);
  void define(int pos, std::vector<float>& valuep);
  void bind(int pos, float& valuep);
  void bind(int pos, std::vector<float>& valuep);

  // double
  void define(int pos, double& valuep);
  void define(int pos, std::vector<double>& valuep);
  void bind(int pos, double& valuep);
  void bind(int pos, std::vector<double>& valuep);

  // long double
  void define(int pos, long double& valuep);
  void define(int pos, std::vector<long double>& valuep);
  void bind(int pos, long double& valuep);
  void bind(int pos, std::vector<long double>& valuep);



  void define(int pos, char* buf, ub4 len, signed short* is_null = false);
  // valuep == (elem_len + 1) * no_of_elem; e.g. for varchar2[10] and array fetch of 5 rows
  // create a buffer (10 + 1) * 5 = 55
  // i.e. for above example pass
  // char buffer[(10+1)*5]; define(1,buffer,10,5); 
  void define(int pos, char* valuep, ub4 elem_len, ub4 no_of_elem);
  void bind(int pos, char* buf, ub4 len, signed short* is_null = false);
  void bind(char* name, char* buf, ub4 len, signed short* is_null = false);
  void bind(int pos, char* valuep, ub4 elem_len, ub4 no_of_elem);

  void define(int pos, COCILob& lob);
  void bind(int pos, COCILob& lob);
  void bind(char* name, COCILob& lob);

  void define(int pos, COCIRef& ref);
  void define(int pos, std::vector<COCIRef>& ref);
  void bind(int pos, COCIRef& ref);
  void bind(char* name, COCIRef& ref);
  
  void define(int pos, COCIObject& obj);
  void define(int pos, std::vector<COCIObject>& obj);
  void bind(int pos, COCIObject& obj);
  void bind(char* name, COCIObject& obj);
  
  void define(int pos, COCIBinary& raw);
  void bind(int pos, COCIBinary& raw);

  void define(int pos, COCINumber& num);
  void bind(int pos, COCINumber& num);
  void bind(char* name, COCINumber& num);

  void define(int pos, COCIDate& date);
  void bind(int pos, COCIDate& date);
  void bind(char* name, COCIDate& date);

  void define(int pos, COCIString& str);
  void bind(int pos, COCIString& str);
  void bind(char* name, COCIString& str);

  void define(int pos, std::string& str, signed short* is_null = 0);
  void bind(int pos, std::string& str);

  // Can't get template members to work in MSVC V5.0 (bummer)
  void define(int pos, COCIVArray<COCINumber>& coll);

  void define(int pos, COCIVArray<COCIDate>& coll);
  void bind(int pos, COCIVArray<COCIDate>& coll);
  void bind(char* name, COCIVArray<COCIDate>& coll);

  void define(int pos, std::vector<COCIVArray<COCINumber> >& coll);
  void bind(int pos, COCIVArray<COCINumber>& coll);

  void define(int pos, COCIVArray<COCIString>& coll);
  void define(int pos, std::vector<COCIVArray<COCIString> >& coll);
  void bind(int pos, COCIVArray<COCIString>& coll);

  void define(int pos, COCIVArray<COCIObject>& coll);
  void define(int pos, std::vector<COCIVArray<COCIObject> >& coll);
  void bind(int pos, COCIVArray<COCIObject>& coll);

  // Will need to support other types
  void define(int pos, COCINestedTable<COCINumber>& coll);
  void bind(int pos, COCINestedTable<COCINumber>& coll);
  void define(int pos, COCINestedTable<COCIObject>& coll);

  


private:
  OCIStmt* stmthp;
  const COCISession& m_Session;
  char* sqlstmt;
  OCIDefine* m_pDefine;
  OCIBind* m_pBind;
  ub4 m_Rows;
  ub4 m_RowsFetched;
  ub4 m_TotalRowsFetched;

  std::vector<CIndStruct<COCIObject>*> m_pObjIndStruct;
  std::vector<CIndStruct<COCIRef>*>    m_pRefIndStruct;
  // VArray
  std::vector<CIndStruct<COCIVArray<COCINumber> >*> m_pVArrayNumberIndStruct;
  std::vector<CIndStruct<COCIVArray<COCIString> >*> m_pVArrayStringIndStruct;
  std::vector<CIndStruct<COCIVArray<COCIObject> >*> m_pVArrayObjectIndStruct;

  // Nested Table
  std::vector<CIndStruct<COCINestedTable<COCINumber> >*> m_pNestedTableNumberIndStruct;
  std::vector<CIndStruct<COCINestedTable<COCIString> >*> m_pNestedTableStringIndStruct;
  std::vector<CIndStruct<COCINestedTable<COCIObject> >*> m_pNestedTableObjectIndStruct;




  std::vector<std::vector<COCIObject>*> m_pObject;
  std::vector<std::vector<COCIRef>*>    m_pRef;
  std::vector<dvoid**> m_indpp_list;
  std::vector<dvoid**> m_pgvpp_list;
  std::vector<ub4*>    m_indszp_list;
  std::vector<ub4*>    m_pvszp_list;


  ub4 m_Object_Count;
  ub4 m_Ref_Count;
  ub4 m_VArray_Number_Count;
  ub4 m_VArray_String_Count;
  ub4 m_VArray_Object_Count;

  ub4 m_NestedTable_Number_Count;
  ub4 m_NestedTable_String_Count;
  ub4 m_NestedTable_Object_Count;



};


#endif

⌨️ 快捷键说明

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