Proc *C/C++入门之指示器变量

Proc *C/C++入门之动态SQL 基本概念 在有些情况下, 在编码时 SQL 语句还不能完整地写出来, 而是在程序执行时才能 构造出来,这种在程序执行临时生成的 SQL 语句叫动态 SQL 语句. 利用动态 SQL 来 编写 Pro*C 程序的方法叫动态 SQL 技术! 目的:加强应用程序的功能和灵活 静态SQL —- 在编写应用程序时,使用EXEC SQL关键字直接嵌入的SQL语句;在proc编译应用程序生成c语言的时,都已经确定 动态SQL —- 在运行应用程序时,由用户动态输入的SQL语句。 在下列情况之一不知道时, 使用动态 SQ 阅读详情

  用户能够将任何一个宿主变量同一个指示变量进行关联。指示器变量必须被定义为 2 个字
节的整数类型( short),在 SQL 语句中,如果没有指定 INDICATOR 关键字,指示变量必须
紧跟在与其关联的宿主变量后。如果使用 DECLARE SECTION 声明宿主变量,则相关指示
变量也必须采用 DECLARE SECTION 进行声明。

  • 短整型变量,用于处理数据库的NULL值,监督和管理与其相关联的宿主变量。
  • 主要用在输出, 即当宿主变量用于接收数据库的返回数据时.
  • 引用语法:

:host_variable INDICATOR :indicator_variable
或者
:host_variable:indicator_variable

通过在宿主变量后用指示变量, 检测是否返回了NULL.

  • 常用结构模块
EXEC SQL BEGIN DECLARE SECTION;
    char    desc[35];
    short   ind_desc;
EXEC SQL END DECLARE SECTION;
…
EXEC SQL SELECT emp_desc INTO :desc :ind_desc FROM emp WHERE emp_no=7788;

If(ind_desc < 0)
   cout<<“emp_desc is NULL”;
else
   cout<< desc << endl;

varchar类型在经过proc预编译后会变成

typedef struct { unsigned short len; unsigned char arr[1]; } varchar;

可以看出,字符串部分存储在arr指向的内存空间,所以对varchar类型的变量进行字符串访问的时候需要提取arr成员,综合实例如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"

//演示 指示变量,用来主的对宿主变量做说明


extern sqlgls(char * , size_t *, size_t * );
extern sqlglmt(void *,char *,size_t *,size_t *);

void sqlerr02()
{
    char    stm[120];
    size_t  sqlfc, stmlen=120;
    unsigned int ret = 0;

    //出错时,可以把错误SQL语言给打印出来
    EXEC SQL WHENEVER SQLERROR CONTINUE;

    ret = sqlgls(stm, &stmlen, &sqlfc); 
    printf("出错的SQL:%.*s\n", stmlen, stm);
    printf("出错原因:%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    //printf("出错原因:%.70s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
    EXEC SQL ROLLBACK WORK RELEASE;
    exit(1);
}

void nodata()
{
    int ret = 0;
    printf("没有发现数据\n");
    if (sqlca.sqlcode != 0)
    {
        ret = sqlca.sqlcode;
        printf("sqlca.sqlcode: err:%d \n", sqlca.sqlcode);
        return ;
    }
}


EXEC SQL BEGIN DECLARE SECTION;
char    *usrname = "scott";
char    *passwd = "lzj123529";
char    *serverid = "orcl";

int             deptno;
varchar         dname[20]; //varchar类型 和 char 类型的区别. 与编译选项有关系
short           dname_ind;
varchar         loc[20];
short           loc_ind;

EXEC SQL END DECLARE SECTION;

void connet()
{
    int ret = 0;
    //连接数据库
    EXEC SQL CONNECT:usrname IDENTIFIED BY:passwd USING:serverid ;
    if (sqlca.sqlcode != 0)
    {
        ret = sqlca.sqlcode;
        printf("sqlca.sqlcode: err:%d \n", sqlca.sqlcode);
        return ;
    }
    else
    {
        printf("connect ok...\n");
    }

}

//修改单挑数据
int main()
{
    int ret = 0;    
    int i = 0;

    EXEC SQL WHENEVER SQLERROR DO sqlerr02();
    connet();
    EXEC SQL WHENEVER NOT FOUND DO nodata();

    printf("\nplease enter deptno: ");
    scanf("%d", &deptno);

    EXEC SQL select deptno, dname, loc into :deptno, :dname:dname_ind, :loc:loc_ind from dept where deptno=:deptno;
    if (sqlca.sqlcode != 0)
    {
        ret = sqlca.sqlcode;
        printf("sqlca.sqlcode: err:%d \n", sqlca.sqlcode);
        return ;
    }
    if (dname_ind == -1)
    {
        printf("dname为空\n");
    }
    if (loc_ind == -1)
    {
        printf("loc为空\n");
    }

    printf("any key con....\n");
    getchar();
    printf("deptno:%d, dname:%s, loc:%s\n", deptno, dname.arr, loc.arr);

    loc_ind = -1;
    EXEC SQL update dept set loc=:loc:loc_ind where deptno=:deptno;//将之前获取的条目的loc更新为NULL
    if (sqlca.sqlcode != 0)
    {
        ret = sqlca.sqlcode;
        printf("sqlca.sqlcode: err:%d \n", sqlca.sqlcode);
        return ;
    }

    EXEC SQL COMMIT WORK RELEASE;
    printf("return ok...\n");

    return ret ;
}

效果如下


oracle@lzj:~$ ./array 
connect ok...

please enter deptno: 30
any key con....
deptno:30, dname:SALES, loc:CHICAGO
return ok...
华为OD机试双机位C卷-分披萨 (Py/Java/C/C++/Js/Go) 华为OD机试(机考)双机位C卷 【分披萨】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 分披萨。 阅读详情

相关推荐

python乘法运算 信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

本文解析了全国青少年信息素养大赛Python编程挑战赛的乘法运算题目。题目要求通过递归算法实现两个自然数的乘法运算,并输出算式。算法分析指出可将乘法转化为累加,使用递归函数实现。程序代码展示了一个自定义函数add(),通过递归调用完成累加运算。文章还分析了考点,包括递归函数、输入处理、分支语句等编程基础知识的应用。最后强调解题方法的多样性,重点在于理解递归原理和实现题目要求。该题目难度适中,主要考查选手对递归算法的理解和编程基础能力。

青少年编程学习指导 762

PROC基础知识之指示变量变量

指示器变量是与宿主变量相关联的一类SQL变量,它被用来监督和管理与其相关联的宿主变量,每一个宿主变量都可以定义一个指示器变量指示器变量的具体作用如下: (1) 向数据库表列输入NULL值 (2) 检查从数据库表列中选取的数据是否是NULL值,或是否发生截断问题 • 指示变量必须被定义为2 个字节的整数类型(short) •

DerekRay的博客 2083

TickPower_C++_indicator_c++RSI_C++_MT5ApiExample_

Tick based RSI like custom indicator function written by C++.

第五章-5.2-指示器随机变量

本文为《算法导论》5.2指示器随机变量的笔记,欢迎参考。

Toby的博客 987

[原]Pro*C介绍-内嵌SQL

[ Translate by Z.Jingwei. Document address:http://www-db.stanford.edu/~ullman/fcdb/oracle/or-proc.html ] Pro*C介绍内嵌SQL概要 Pro*C语法 SQL 预处理指令 语句标号 宿主变量 基础 指针 结构 数组 指示器变量 数据类型同等化 动态SQL...

aijinpu4229的博客 445

INDICATOR 再c嵌入sql环境中的作用

INDICATOR 再c嵌入sql环境中的作用

xie__jin__cheng的博客 841

Pro*C介绍-内嵌SQL

[ Translate by Z.Jingwei. Document address:http://www-db.stanford.edu/~ullman/fcdb/oracle/or-proc.html ] Pro*C介绍内嵌SQL概要 Pro*C语法 SQL 预处理指令 语句标号 宿主变量 基础 指针 结构 数组 指示器变量 数据类型同等化 动态SQL 事务 错误处理 SQLCA WHENEV

深海客栈 5150

Oracle 10g Pro*C/C++ Programmer's Guide英文官方文档的中文翻译(一 )

Oracle 10g Pro*C/C++ Programmer's Guide英文官方文档的中文翻译(一) -----根据Oracle10g的Pro*C/C++ Programmer's Guide 英文官方文档进行的翻译,本文为其文档中的第一章Introduction  简介,欢迎大家指出翻译中的错误,谢谢,转载请注明 1. 简介 Introduction 这一章向我们介绍Pro*

1760

ProC概述

Pro*C概述 一. Pro*C概述 Oracle支持在6种高级语言中嵌入SQL语句,他们分别是C,FORTRAN,PASCAL,COBOL,PL/I和Ada。这些语言统称为宿主语言,用它们开发的应用程序叫PRO程序。如果宿主语言是C,则相应的程序就叫Pro*C, 在Pro*C中可以嵌入SQL语句,利用这些SQL语句可以完成动态的建立,修改和删除数据库中的表,也可以查询,插入,修改和

caomiao2006的专栏 3910

oracle+pro+c+编程,介绍Pro*c编程的经验

strcpy(c_sql,"select c_user_id,c_user_name,to_char(t_date,'yyyy/mm/dd hh:mi:ss'),n_fee ");strcat(c_sql,"from USER_FEE_");strcat(c_sql,ac_mon);strcat(c_sql," where c_user_id = :v1");EXEC SQL PREPARE s ...

weixin_30082413的博客 516

Pro*C介绍--内嵌SQL[转载]

Pro*C介绍内嵌SQL &lt;!-- 目录 begin --&gt; 概要 Pro*C语法 SQL 预处理指令 语句标号 宿主变量 基础 指针 结构 数组 指示器变量 ...

编程资料大全 107

Proc笔记

概要 内嵌SQL是结合高级语言如C/C++的计算能力和SQL数据库处理能力的一种方法。它允许你在程序中执行任意的SQL语句。Oracle的嵌入SQL环境称为Pro*C。 Pro*C程序分两步编译 1.    Pro*C的预编译器识别出嵌入在程序中的SQL语句,并将这些语句转换为对SQL运行时库(SQL runtime library)中功能(functions)的适当调用。输出是纯C/C++

书山有路勤为径 435

oracle 11g proc c,proc oracle 11g 在Linux6.4 GCC 4.4.7下面的编译

Redhat6.4 x86_64 下面oracle11g pro*c 编译产生如下错误"Syntax error at line 73, column 26, file/usr/include/gconv.h:Error at line 73, column 26 in file /usr/include/gconv.hunsigned char **, size_t *, int, int);....

weixin_33242795的博客 230

PROC++批量导入导出ORACLE数据库

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 499

PROC++批量导入导出ORACLE数据库表 (转)

PROC++批量导入导出ORACLE数据库表 (转)[@more@]最近在开发一个项目中,为了解决数据库IO瓶颈,不得不把数据库中的数据导出为文本文件。文本传到客户端后又要导入到数据库。本人用C++Builder嵌入PROC++...

ciya3282的博客 250

xeno112v2 - 副本_xeno112v2.dll_Xenobyte1.12.2_xenobyte1.12_Xeno_

xeno112v2.dll,Minecraft 1.12.2 xeno reload young++

上一篇: Proc *C/C++入门之通讯区
下一篇: Proc *C/C++入门之游标访问数据库
小帅比simon
博客等级 码龄14年 213粉丝 329原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值