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

📄 h_oracle.cpp

📁 使用OCI类的API函数
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   Defnp = NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp, FErrhp, 4, RowNumber,
      sizeof(RowNumber) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      goto error;
   }

   r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,
      NULL, NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIStmtExecute(Stmthp1) : ");
      goto error;
   }
   
   for(;;)
   {
      r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
      if( r == OCI_NO_DATA )
         break;
      if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
      {
         CreateErrorString("OCIStmtFetch2 : ");
         goto error;
      }
      Owner[30] = '\0';
      TableName[30] = '\0';
      TableSpace[30]= '\0';
      //TableType[12] = '\0';
      RowNumber[10] = '\0';

      TableDes  aTable;
      aTable.TableOwner  = AnsiString(Owner).TrimRight();
      aTable.TableName  = AnsiString(TableName).TrimRight();
      aTable.TableSpace  = AnsiString(TableSpace).TrimRight();
      aTable.Rows   = StrToInt(AnsiString(RowNumber).TrimRight());
      aTable.GetColOk = "no";
      aTable.GetIndexOk = false;
      aTable.GetKeyOk = false;
      //aTable.Type = AnsiString(TableType).TrimRight();

      //add 2007-05-24
      //GetTableCol(aTable,aTable.Fields,i,DBName);
      i++;
      TableList.push_back(aTable);
   }

   OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
   return true;

error :

   if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
      OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);

   return false;
}

bool  __fastcall HOracle::GetTableCol(AnsiString tableName, AnsiString tableOwner,
     vector <ColumnDes> &TableCols)
{
   int i;
   sword r;
   OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;
   /*
   char ColumnName[30 + 1];
   memset(ColumnName, 0, sizeof(ColumnName));
   char DataType[30+1];
   char DataLength[10+1];
   char DataPrecision[10+1];
   char DataScale[10+1];
   char Nullable[1+1];
   char colID[10 + 1];
   */

   typedef struct
   {
      char ColumnName[30 + 1];
      //memset(ColumnName, 0, sizeof(ColumnName));
      char DataType[30+1];
      char DataLength[10+1];
      char DataPrecision[10+1];
      char DataScale[10+1];
      char Nullable[1+1];
      char colID[10 + 1];
   } t_std;
   t_std tstd[100] = {0};

   //Add by Liaoyangbo
   bool isLob = false;
   //增加LONG类型字段的判断
   bool isLong = false;
   //End by Liaoyangbo


   OCIDefine *Defnp;

   AnsiString SqlStr1 =
      AnsiString("select column_name, substr(data_type,0,30), data_length, NVL(data_precision,0),")
       + " NVL(data_scale,0), nullable, column_id from dba_tab_columns where table_name='"
       + tableName + "' and owner ='" + tableOwner + "'";


   TableCols.clear();
   r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIHandleAlloc(Stmt1) : ");
      //goto error;
   }

   r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),
      SqlStr1.Length(), OCI_NTV_SYNTAX, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIStmtPrepare(SqlStr1) : ");
      //goto error;
   }


   OCIDefine *Defnp1 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp1, FErrhp, 1, &tstd[0].ColumnName,
      sizeof(tstd[0].ColumnName) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp2 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp2, FErrhp, 2, &tstd[0].DataType,
      sizeof(tstd[0].DataType) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp3 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp3, FErrhp, 3, &tstd[0].DataLength,
      sizeof(tstd[0].DataLength) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp4 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp4, FErrhp, 4, &tstd[0].DataPrecision,
      sizeof(tstd[0].DataPrecision) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp5 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp5, FErrhp, 5, &tstd[0].DataScale,
      sizeof(tstd[0].DataScale) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp6 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp6, FErrhp, 6, &tstd[0].Nullable,
      sizeof(tstd[0].Nullable) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   OCIDefine *Defnp7 = (OCIDefine *) NULL;
   r = OCIDefineByPos(Stmthp1, &Defnp7, FErrhp, 7, &tstd[0].colID,
      sizeof(tstd[0].colID) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIDefineByPos : ");
      //goto error;
   }

   r = OCIDefineArrayOfStruct(Defnp1, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp2, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp3, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp4, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp5, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp6, FErrhp, sizeof(t_std), 0, 0, 0);
   r = OCIDefineArrayOfStruct(Defnp7, FErrhp, sizeof(t_std), 0, 0, 0);

   r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0,
      NULL, NULL, OCI_DEFAULT);

   if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
   {
      CreateErrorString("OCIStmtExecute(Stmthp1) : ");
      goto error;
   }


   for(;;)
   {
      r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
      if( r == OCI_NO_DATA )
         break;
      if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
      {
         CreateErrorString("OCIStmtFetch2 : ");
         goto error;
      }
      /*
      tstd[0].ColumnName[30] = '\0';
      DataType[30] = '\0';
      DataLength[10] = '\0';
      DataPrecision[10] = '\0';
      DataScale[10]='\0';
      Nullable[1]='\0';
      colID[10] = '\0';
      */  

      for (i = 0; i < 100; i++)
      {
         ColumnDes aColumn;
         aColumn.ColumnName = AnsiString(tstd[i].ColumnName).TrimRight();
         if (aColumn.ColumnName.IsEmpty())
            break;
         aColumn.DataType = AnsiString(tstd[i].DataType).TrimRight();
         sscanf(tstd[i].DataLength, "%d", &aColumn.DataLength);
         sscanf(tstd[i].DataPrecision, "%d", &aColumn.DataPrecision);
         sscanf(tstd[i].DataScale, "%d", &aColumn.DataScale);
         if (tstd[i].Nullable[0] == 'y' || tstd[i].Nullable[0] == 'Y')
            aColumn.IsNull = true;
         else
            aColumn.IsNull = false;

         //Add by Liaoyangbo
         sscanf(tstd[i].colID, "%d", &aColumn.ColId);
      
         //增加对大对象的判断
         /*if (BlobList.find(aColumn.DataType) != BlobList.end())
         {
            //该字段为大对象
            aColumn.IsBlob = true;
            //存在大对象(表)
            isLob = true;
         }
         else
         {
            aColumn.IsBlob = false;
         }*/
         //判断该字段是否为LONG类型字段
         if (aColumn.DataType.UpperCase() == "LONG")
         {
            //该字段为LONG类型
            aColumn.IsLong = true;
            isLong = true;
         }
         else
         {
            aColumn.IsLong = false;
         }
         //End by Liaoyangbo

         TableCols.push_back(aColumn);
      }
   }

   //Add by Liaoyangbo
   //表中存在大对象
   if (isLob)
   {
       //Table.IsBlob = true;
   }
   else
   {
       //Table.IsBlob = false;
   }
   //表中是否存在LONG字段类型
   if (isLong)
   {
       //Table.hasLong = true;
   }
   else
   {
       //Table.hasLong = false;
   }
   //End by Liaoyangbo

   OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
   return true;

error :

   if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
      OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);

   return false; 
}

bool __fastcall HOracle::GetTableDataInfo(AnsiString tableName, AnsiString tableOwner, vector <TableData> &TableDatas)
{
    sword r;
    OCIDefine *Defnp[4];

    typedef struct
    {
       char col1[10+1];
       char col2[10+1];
       char col3[10+1];
       char col4[10+1];
    }stTableData;

    stTableData tableData[100]= {0}; // 每次批量读取100行
    OCIStmt *Stmthp1 = (OCIStmt*)OCI_INVALID_HANDLE;
    string SqlStr1 = string("select * from ");
    SqlStr1 += tableOwner.c_str();
    SqlStr1 += string(".");
    SqlStr1 += tableName.c_str();
    //SqlStr1 += "";

    Defnp[0] = (OCIDefine *) 0;
    Defnp[1] = (OCIDefine *) 0;
    Defnp[2] = (OCIDefine *) 0;
    Defnp[3] = (OCIDefine *) 0;

    r = OCIHandleAlloc(FEnvhp, (dvoid**)&Stmthp1, OCI_HTYPE_STMT, 0, NULL);

    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIHandleAlloc(Stmt1) : ");
        goto error;
    }

    r = OCIStmtPrepare(Stmthp1, FErrhp, SqlStr1.c_str(),
      SqlStr1.length(), OCI_NTV_SYNTAX, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIStmtPrepare(SqlStr1) : ");
        goto error;
    }

    Defnp[0] = NULL;
    r = OCIDefineByPos(Stmthp1, &Defnp[0], FErrhp, 1, &tableData[0].col1,
      sizeof(tableData[0].col1) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIDefineByPos : ");
        goto error;
    }

    Defnp[1] = NULL;
    r = OCIDefineByPos(Stmthp1, &Defnp[1], FErrhp, 2, &tableData[0].col2,
      sizeof(tableData[0].col2) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIDefineByPos : ");
        goto error;
    }

    Defnp[2] = NULL;
    r = OCIDefineByPos(Stmthp1, &Defnp[2], FErrhp, 3, &tableData[0].col3,
      sizeof(tableData[0].col3) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIDefineByPos : ");
        goto error;
    }

    Defnp[3] = NULL;
    r = OCIDefineByPos(Stmthp1, &Defnp[3], FErrhp, 4, &tableData[0].col4,
      sizeof(tableData[0].col4) - 1, SQLT_CHR, NULL, NULL,
      NULL, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIDefineByPos : ");
        goto error;
    }
    r = OCIDefineArrayOfStruct(Defnp[0], FErrhp, sizeof(stTableData), 0, 0, 0);
    r = OCIDefineArrayOfStruct(Defnp[1], FErrhp, sizeof(stTableData), 0, 0, 0);
    r = OCIDefineArrayOfStruct(Defnp[2], FErrhp, sizeof(stTableData), 0, 0, 0);
    r = OCIDefineArrayOfStruct(Defnp[3], FErrhp, sizeof(stTableData), 0, 0, 0);

    r = OCIStmtExecute(FSvchp, Stmthp1, FErrhp, 0, 0, NULL, NULL, OCI_DEFAULT);
    if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
    {
        CreateErrorString("OCIStmtExecute(Stmthp1) : ");
        goto error;
    }

    for(;;)
    {
        r = OCIStmtFetch2(Stmthp1, FErrhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT); // OCI_FETCH_NEXT
        if( r == OCI_NO_DATA )
			break;
		if( r != OCI_SUCCESS && r != OCI_SUCCESS_WITH_INFO )
		{
			CreateErrorString("OCIStmtFetch2 : ");
			goto error;
		}
        for (int i = 0; i < 100; i++)
        {
            TableData aData;
            aData.col1 = AnsiString(tableData[i].col1).TrimRight();
            if (aData.col1.IsEmpty())
                break;

            aData.col2 = AnsiString(tableData[i].col2).TrimRight();
            aData.col3 = AnsiString(tableData[i].col3).TrimRight();
            aData.col4 = AnsiString(tableData[i].col4).TrimRight();
            TableDatas.push_back(aData);
        }
    }
    return true;

error:
   if( Stmthp1 != (OCIStmt*)OCI_INVALID_HANDLE )
      OCIHandleFree(Stmthp1, OCI_HTYPE_STMT);
   return false;
}

⌨️ 快捷键说明

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