栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Oracle数据库LONG类型字段的完整C代码操作(CREATE INSERT SELECT DROP)之一--CREATE TABLE

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Oracle数据库LONG类型字段的完整C代码操作(CREATE INSERT SELECT DROP)之一--CREATE TABLE

最近需要完成对Oracle数据库LONG字段类型的操作,网上各种查找都没什么完整的教程可参考,偶然获得了LONG类型字段的全套操作方法,记录下来与大家分享。

系列目录如下(Oracle数据库LONG类型字段的完整C代码操作):

之一--CREATE TABLE(本文)

之二--单纯INSERT

之三--单纯SELECt

之四--DROP TABLE

之五--分段轮询INSERT

之六--分段轮询SELECT

一、LONG类型简介

Internal Oracle Database Data Type

Maximum Internal Length

Data Type Code

LONG

2^31 - 1bytes(2gigabytes)

8

上表参考于Oracle官网 : https://docs.oracle.com/en/database/oracle/oracle-database/21/lnoci/data-types.html#GUID-92331EBC-12FB-4D5F-BFFD-5149F819266D

觉得在写代码时,要用到两点,一是 LONG的大小,最大可达2GB;二是LONG的类型码为8.(先记在脑中,后面用到的时候再细说)

二、本次目标(创建一个含有LONG字段的表)

创建一个含有LONG字段的表,为后面的INSERT操作、SELECT操作做好准备,表名为CAT_1,共有两个字段。

字段序号

字段名

字段类型

字段1

ID

NUMBER

字段2

CATNAME

LONG

(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,Dcat-Admin框架,大厂热门笔试面试领域博主)

三、程序结构及重点说明

四、完整代码

#include 
#include 
#include 
#include 

typedef struct cdemol2lctx
{
  OCIEnv *envhp;
  OCIServer *srvhp;
  OCISvcCtx *svchp;
  OCIError *errhp;
  OCISession *authp;
  OCIStmt *stmthp;
} cdemol2lctx;



static text *username = (text *) "c##fang";
static text *password = (text *) "fang";


static void initialize(cdemol2lctx *ctxptr);
static void cleanup(cdemol2lctx *ctxptr);
static void checkerr();
static void sql_stmt_execute();
int main();


int main(argc, argv)
int argc;
char *argv[];
{
  cdemol2lctx ctx;
  text *cretab_stmt1 = (text *)"CREATE TABLE CAT_1 (ID NUMBER, CATNAME LONG)";
  printf("n ######## start DEMO program ############ n");

  initialize(&ctx);

  
  printf("nCREATING TABLE CAT_1 ... n");
  sql_stmt_execute(&ctx, cretab_stmt1);
 
  
  cleanup(&ctx);

  return 1;

} 



void sql_stmt_execute(ctxptr, sql_stmt)
cdemol2lctx *ctxptr;
text *sql_stmt;
{ 
  checkerr(ctxptr->errhp, OCIStmtPrepare(ctxptr->stmthp, ctxptr->errhp, 
                          sql_stmt, (ub4) strlen((char *)sql_stmt), 
                          (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT));

  checkerr(ctxptr->errhp, OCIStmtExecute(ctxptr->svchp,
                          ctxptr->stmthp,
                          ctxptr->errhp, (ub4) 1, (ub4)0,
                          (OCISnapshot *) NULL, (OCISnapshot *) NULL,
                          OCI_DEFAULT)); 
} 


void initialize(ctxptr)
cdemol2lctx *ctxptr;
{

  if (OCIEnvCreate((OCIEnv **) &ctxptr->envhp,
                   (ub4)OCI_THREADED|OCI_OBJECT, (dvoid *)0,
                    (dvoid * (*)(dvoid *, size_t)) 0,
                   (dvoid * (*)(dvoid *, dvoid *, size_t))0,
                   (void (*)(dvoid *, dvoid *)) 0,
                   (size_t) 0, (dvoid **) 0 ))
    printf("FAILED: OCIEnvCreate()n");


  printf("n ######## Connect to server ############# n");

  if (OCIHandleAlloc((dvoid *) ctxptr->envhp,
                     (dvoid **) &ctxptr->errhp,
                     (ub4) OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0))
    printf("FAILED: OCIHandleAlloc() on ctxptr->errhpn");

  if (OCIHandleAlloc((dvoid *) ctxptr->envhp,
                     (dvoid **) &ctxptr->srvhp,
                     (ub4) OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0))
    printf("FAILED: OCIHandleAlloc() on ctxptr->srvhpn");

  if (OCIHandleAlloc((dvoid *) ctxptr->envhp,
                     (dvoid **) &ctxptr->svchp,
                     (ub4) OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0))
    printf("FAILED: OCIHandleAlloc() on ctxptr->svchpn");

  if (OCIHandleAlloc((dvoid *) ctxptr->envhp,
                     (dvoid **) &ctxptr->authp,
                     (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0))
    printf("FAILED: OCIHandleAlloc() on ctxptr->authpn");

  if (OCIServerAttach(ctxptr->srvhp, ctxptr->errhp,
                      (text *) "", (sb4) strlen((char *) ""),
                      (ub4) OCI_DEFAULT))
    printf("FAILED: OCIServerAttach()n");

  if (OCIAttrSet((dvoid *) ctxptr->svchp, (ub4) OCI_HTYPE_SVCCTX,
                 (dvoid *) ctxptr->srvhp, (ub4) 0,
                 (ub4) OCI_ATTR_SERVER, ctxptr->errhp))
    printf("FAILED: OCIAttrSet() server attributen");
  
  
  if (OCIAttrSet((dvoid *) ctxptr->authp, (ub4) OCI_HTYPE_SESSION,
                 (dvoid *) username, (ub4) strlen((char *) username),
                 (ub4) OCI_ATTR_USERNAME, ctxptr->errhp))
    printf("FAILED: OCIAttrSet() useridn");

  if (OCIAttrSet((dvoid *) ctxptr->authp, (ub4) OCI_HTYPE_SESSION,
                 (dvoid *) password, (ub4) strlen((char *) password),
                 (ub4) OCI_ATTR_PASSWORD, ctxptr->errhp))
    printf("FAILED: OCIAttrSet() passwdn");
      
  printf("Logging on as %s  ....n", username);
  
  checkerr(ctxptr->errhp, OCISessionBegin((dvoid *)ctxptr->svchp,
                        ctxptr->errhp, ctxptr->authp,
                       (ub4) OCI_CRED_RDBMS,(ub4) OCI_DEFAULT ));
    
  printf("%s logged on.n", username);
                 
  if (OCIAttrSet((dvoid *) ctxptr->svchp, (ub4) OCI_HTYPE_SVCCTX,
             (dvoid *) ctxptr->authp, (ub4) 0, (ub4) OCI_ATTR_SESSION, 
             ctxptr->errhp))
    printf("FAILED: OCIAttrSet() sessionn");
  

  
  
  if (OCIHandleAlloc((dvoid *)ctxptr->envhp, (dvoid **) &ctxptr->stmthp,
                   (ub4)OCI_HTYPE_STMT, (ConST size_t) 0, (dvoid **) 0))
    printf("FAILED: alloc statement handlen");

} 



void checkerr(errhp, status)
OCIError *errhp;
sword status;
{
  text errbuf[512];
  sb4 errcode = 0;

  switch (status)
  {
  case OCI_SUCCESS:
    break;
  case OCI_SUCCESS_WITH_INFO:
    (void) printf("Error - OCI_SUCCESS_WITH_INFOn");
    break;
  case OCI_NEED_data:
    (void) printf("Error - OCI_NEED_DATAn");
    break;
  case OCI_NO_data:
    (void) printf("Error - OCI_NODATAn");
    break;
  case OCI_ERROR:
    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
                        errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
    (void) printf("Error - %.*sn", 512, errbuf);
    break;
  case OCI_INVALID_HANDLE:
    (void) printf("Error - OCI_INVALID_HANDLEn");
    break;
  case OCI_STILL_EXECUTING:
    (void) printf("Error - OCI_STILL_EXECUTEn");
    break;
  case OCI_CONTINUE:
    (void) printf("Error - OCI_CONTINUEn");
    break;
  default:
    break;
  }
} 



void cleanup(ctxptr)
cdemol2lctx *ctxptr;
{
  printf("n ########## clean up ############ n");

  if (OCISessionEnd(ctxptr->svchp, ctxptr->errhp, 
                      ctxptr->authp, (ub4) 0))
    printf("FAILED: OCISessionEnd()n");

  printf("%s Logged off.n", username);

  if (OCIServerDetach(ctxptr->srvhp, ctxptr->errhp,
                   (ub4) OCI_DEFAULT))
    printf("FAILED: OCIServerDetach()n");

  printf("Detached from server.n");
  
  printf("Freeing handles ...n");
  if (ctxptr->stmthp)
    OCIHandleFree((dvoid *) ctxptr->stmthp, (ub4) OCI_HTYPE_STMT);
  if (ctxptr->errhp)
    OCIHandleFree((dvoid *) ctxptr->errhp, (ub4) OCI_HTYPE_ERROR);   
  if (ctxptr->srvhp)
    OCIHandleFree((dvoid *) ctxptr->srvhp, (ub4) OCI_HTYPE_SERVER);
  if (ctxptr->svchp)
    OCIHandleFree((dvoid *) ctxptr->svchp, (ub4) OCI_HTYPE_SVCCTX);
  if (ctxptr->authp)
    OCIHandleFree((dvoid *) ctxptr->authp, (ub4) OCI_HTYPE_SESSION);
  if (ctxptr->envhp)
    OCIHandleFree((dvoid *) ctxptr->envhp, (ub4) OCI_HTYPE_ENV);

} 



五、编译及运行

5.1 将long_creat.c放入自己的目录下

(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,Dcat-Admin框架,大厂热门笔试面试领域博主)

5.2 编译
gcc long_creat.c -o long_creat -I $ORACLE_HOME/rdbms/public -L $ORACLE_HOME/lib -l clntsh

5.3 运行
./long_creat

5.4 查看数据库中建表情况
show user;

(确定下当前登录的用户,与代码中填写的用户一致)

show con_name;

(本代码里写的是在CDB下建表,所以确认下当前在CDB下,也可以通过修改代码,改为在PDB下建表)

describe CAT_1;

(显示表结构,可以看到,表CAT_1已经创建成功,表共有两列,与预期目标一致)

六、可下载的代码包(懒人福音)

可通过下面的链接,免费下载有猫彬为你准备的代码包(已编译好,可直接运行,内含编译运行命令,直接复制粘贴即可)

https://download.csdn.net/download/have_a_cat/75366720https://download.csdn.net/download/have_a_cat/75366720

(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,Dcat-Admin框架,大厂热门笔试面试领域博主)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号