Pro*C基础
SQL变量的申明: EXEC SQL BEGIN DECLARE SECTION; 类型 变量名【长度】
varchar2 serv_number[];
其中可以定义C变量
EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE Slqca; 说明SQL的通讯区,记录执行每一个SQL语句的状态。 错误信息处理 EXEC SQL WHENEVER SQLERROR DO sqlerror(); 指出执行SQL语句时,如果发生错误应如何处理。 连接数据库 EXEC SQL CONNECT :username IDENTIFIED BY :password; 嵌入式SQL语句或pl/sql块中的关键字应大写。 SQL变量 在变量的申明中定义,只允许包含下列语句:
(一)SQL变量的类型说明语句
(二)EXEC SQL INCLUDE
(三)EXEC SQL VAR
(四)EXEC SQL TYPE EXEC SQL VAR 和EXEC SQL TYPE 分别用于将sql变量和外部的变量等价。用法如下: EXEC SQL VAR host_variable IS type_name[(length)]; 可以用户定义类型和等价: struct screen { short len;
char buff[];
}
typedef struct screen graphics; EXEC SQL BEGIN DECLARE SECTION; EXEC SQL TYPE graphics IS VARRAW(); EXEC SQL END DECLARE SECTION; 可以将一个用户说明的类型定义为显示的或隐式的指针,然后使用新的类型。必须使用Reference; 如:
EXEC SQL TYPE graphics varraw() Reference;
graphics my_raw; 可以使用如下的修饰符来说明变量的性质: auto
static
extern
const 定义的常量
volatile 有一个程序不知道的方法(如 通过设备)来改变值 VARCHAR变量的说明和应用: C中没有这种类型,特别引入的这种类型,称为伪类型。 EXEC SQL BEGIN DECLARE SECTION; VARCHAR user_name(); EXEC SQL END DECLARE SECTION; 在预编译时,该变量被翻译成: struct { unsigned short len;
unsigned char arr[];
} user_name; 通讯区的说明: Oracle提供了两个通讯区SQL通讯区(sqlca)和Oracle通讯区(oraca) sqlca是一个结构类型的标量,是Oracle和应用程序的接口,执行Pro*C时,Oracle把每一个嵌入的SQL执行的状态存入sqlca; sqlca的结构: struct sqlca{ char sqlcaid[]; //标识一个sql通讯区
long sqlbc; //通讯区的长度
long sqlcode;
/*
最近执行Sql后的状态码
有三中可能的值:
0 正确结束
>0 Oracle执行了该语句,但遇到了例外
<0 Oracle未执行该语句,当出现这类错误时,应该回滚该事务。
*/
struct { unsigned short sqlerrml; //保存sqlerrmc中的文本的长度
unsigned char sqlerrmc[]; //保存sqlcode编码对于的错误信息,只有当sqlcode的值为负时,才应用sqlerrmc,只有70个字符,如果要应用超过70个字符的信息,必须使用SQLGLM()函数。如果sqlcode执行为0时,sqlerrmc为最近sql的信息。
}sqlerrm; char sqlerrp[];
long sqlerrd[];
char sqlwarn[];
char sqlext[];
} sqlca; 通讯区的应用方式: EXEC SQL INCLUDE sqlca; 或将上述编码拷贝到C代码中。 SQLGLM的应用,sqlglm(message_buffer,&buffer_size,&message_length); message_buffer: 文本缓冲区,将错误的信息保留中这里,用空格补充后面的空间。
buffer_size : 缓冲区的长度。
message_length: Oracle错误信息的实际的长度。 oraca 类似与sqlca,但比sqlca提供的信息更多。 INCLUDE 语句 作用将一个文件拷贝到程序中,类似于#include 定义: EXEC SQL INCLUDE filename; 程序中使用的是filename的副本。 断开数据库连接 EXEC SQL COMMIT WORK RELEASE; 错误处理的方法: EXEC SQL WHENERVE SQLERROR GOTO sqlerror; sqlerror: EXEC SQL WHENERVER SQLERROR CONTINUE; EXEC SQL ROLLBACK; exit(); 也可以使用方法: sqlerror(); void sqlerror; EXEC SQL WHENEVER SQLERROR DO sqlerror(); void sqlerror()
{
EXEC SQL WHENERVER SQLERROR CONTINUE; EXEC SQL ROLLBACK; exit(); } 数据未找到信息的处理方法: EXEC SQL WHENEVER NOT FOUND GOTO notfound; notfound : printf("not found"); SQLCA.SQLERRD[] //记录处理的行数 select 语句中不允许使用FOR子句。 select返回的多行确定时,可以使用数组,但必须有MODE={ANSI|ANSI13|ORACLE}; 当select返回的行不确定时,可以使用光标。 光标的思想: 使用光标时,开辟了一个缓冲区,将SELECT的查询结果存放在缓冲区中,并将指针指向第一条记录。 光标语句的使用: (一)说明一个游标 使用declare cursor EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT BRAND_ID,BRAND_DESC
FROM TB_DET_BRAND
WHERE BRAND_ALL_ID=:emp_number; 注意:光标的全程必须在一个编译区内。 (二)打开光标 EXEC SQL OPEN emp_cursor; OPEN语句的作用: . 定义一个光标缓冲区
. 把满足条件的行检索到缓冲区中
. 将光标指向第一行
. 行计算器sqlca.sqlerrd[]清0; (三)提取 EXEC SQL FETCH emp_cursor INTO :brand,:brand_name; (四)关闭光标 EXEC SQL CLOSE emp_cursor; 技巧: Oracle中的字符串以NULL结尾。因而,可以使用类型等价实现。 typedef char aciz; aciz name;
aciz brand; EXEC SQL TYPE aciz IS SRTING(); 这样,aciz是以NULL为结束符。 光标使用的例子: main()
{
....... EXEC SQL WHENEVER SQLERROR DO sqlerror(); //连接数据库
EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT BRAND_ID,BRAND_DESC
FROM TB_DET_BRAND
WHERE BRAND_ALL_ID=:emp_number; EXEC SQL OPEN emp_cursor; for(;;)
{
EXEC SQL WHENEVER NOT FOUND DO break; EXEC SQL FECTH emp_cursor INTO :brand,:brand_name; //处理信息
} EXEC SQL CLOSE emp_cursor; exit();
} Pro*C嵌入PL/SQL块 认为特色的地方: 可以使用RECODE类型 TYPE test_type IS RECODE
( brand_id varchar2() not null,
brand_desc varchar2()); 嵌入PL/SQL的方法 EXEC SQL EXECUTE
DECLARE ---pl/SQL
BEGIN
END;
END_EXEC; 指示器变量: 作用:
从宿主程序接收NULL值存入数据库表中
把NUll或截断的值输出给宿主变量 使用方法: 如 :emp_name:ind_emp 过程:
当进入PL/SQL块时,如果指示器的值为-,则PL/SQL自动把NULL值赋给相应的宿主变量。
退出该块时,如果宿主变量的值为NULL,则把-1赋给相应的指示器变量。 PL/SQL块中只使用数组的一部分时,可以指定最小的数组的大小: 方法:
EXEC SQL ARRAYLEN host_array (array_integer); EXEC SQL BEGIN DECLARE SECTION; float salary[];
int m;
EXEC SQL ARRAYLEN salary(m);
EXEC SQL END DECLARE SECTION; 指定数据的维数 m=;
上例中只有30个元素被传递到PL/SQL块中。 方法:
(一)启动oracle通讯区 EXEC ORACLE OPTION (ORACA=YES); (二)指定RELEASE_CURSOR=YES,用于释放Pro*C执行后SQL的资源,这将保证数据操作后,oracle不保持表分析锁,后续的数据定义操作不会导致分析锁错误。 EXEC ORACLE OPTION (RELEASE_CURSOR=YES); 错误处理 动态SQL技术 动态sql方法1: 用于非select语句,方法: execute immedite ‘insert into ....’;不允许输入宿主变量; 动态sql方法2:(用于非SELECT) PREPARE语句:(分析和命名一个动态SQL语句) EXEC SQL PREPARE [statement_name][block_name] FROM [:host_string][string_literal]; 例:
strcpy(sql_t1,"DELETE FROM EMP WHERE EMP_NAME=:V"); EXEC SQL PREPARE p1 FROM :sql_t1; EXECUTE 语句: 例 EXEC SQL EXECUTE p1 USING :ind_emp; 方法1和方法2区别: 方法1每执行一次分析一次,而方法二分析一次,多次执行。 动态SQL方法3:(只用于select语句) 例:
EXEC SQL BEGIN DECLARE SECTION; VARCHAR sqlstmt[];
int imp;
int brand;
int brand_a;
EXEC SQL END DECLARE SECTION; ....
main()
{
//构造动态SQL
sqlstmt.len=sprintf(sqlstmt.arr,"select brand_id,brand_all_id from tb_det_brand where brand_all_id=:v"); //分析动态的SQL
EXEC SQL PREPARE p1 FROM :sqlstmt; //说明光标
EXEC SQL DECLARE c1 CURSOR FOR p1; imp=;
......
//打开光标 EXEC SQL OPEN c1 USING :imp; EXEC SQL WHENEVER NOT FOUND DO break; while(true)
{
//提取数据
EXEC SQL FETCH c1 INTO :brand,:brand_a;
................ } //关闭光标
EXEC SQL CLOSE c1; } 动态方法四: 特点: 在执行SQL之前,表项、宿主变量个数、类型直到执行前仍然不知道。因而,不能在预编译时产生完整的Oracle调用。 对于方法四,要求提供如下的信息: 选择表项和实宿主变量的个数。
每一个表项和实宿主变量的长途。
每一个表项和实宿主变量的类型。
每一个输出宿主变量(存储选择表项的值)和实输入宿主变量的内存单元地址。 提供信息的方法: oracle提供的SQL的描述区来说明,它提供了一个sqlda 的数据结构。
具体的过程如下: 将选择表项和虚拟输入宿主变量分别保存在选择SQLDA和结合SQLDA中。选择表项的值和名字被存储在输出缓冲区,而实输入宿主变量的值和名字被存储在输入缓冲区。输出缓冲区的地址存储在选择SQLDA中,而输入缓冲区的地址存储在结合SQLDA中。 SQLDA写入信息的方法: (一)sqlald()函数 在分配描述区和缓冲区时,还把SLI(选择表项)或P(虚拟输入宿主变量)的名字在缓冲区中的地址和长度写入SQLDA中。 (二)应用程序 通过程序把存放SLI或BV(结合变量或实输入宿主标量)的值的缓冲区的地址、长度及数据类型写入SQLDA中。 (三)DESCRIBE DESCRIBE SELECT LIST 检查每一个选择表项的信息将信息存储在选择SQLDA及输出缓冲区中。 DESCRIBE BIND VARIABLES 检查每一个虚拟输入宿主变量的信息将信息存储在结合SQLDA及输入缓冲区中。 SQLDA的说明和应用 . 使用INCLUDE EXEC SQL INCLUDE sqlda; . 使用指针 EXEC SQL INCLUDE sqlda;
sqlda *bind_dp;
sqlda *select_dp;
bind_dp=sqlald(....);
select_dp=sqlald(....); SQLDA的应用 对于每一个动态的SQL都应该说明一个SQLDA. 库函数sqlprc()分离精度和定标。 用户出口(SQL*Forms) EXEC IAF GET
EXEC IAF PUT EXEC IAF GET 将form中的值取出赋给宿主变量 例 EXEC IAF GET brand_id INTO :brand; //将brand_id的值取出赋给宿主变量brand EXEC IAF PUT 将常量或宿主变量的值放入forms中 例 EXEC IAF PUT brand VALUES(:brand_id); 用户出口的引用 方法: 定义触发器,在触发器中,用USER_EXIT(user_exit_string[,error_string])引用出口。 错误处理 whenever 子句 EXEC SQL WHENEVER {SQLERROR|NOT FOUND|SQLWARNING}
{CONTINUE|DO function call|DO break|GOTO table|STOP};
Pro*C基础的更多相关文章
- Git Pro - (1) 基础
近乎所有操作都可本地执行 在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网. 三种状态 对于任何一个文件,在 Git 内都只有三 种状态:已提交(committed),已修改(modifi ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
- 吉他软件Guitar Pro入门
Guitar Pro是一款优秀的吉他学习软件,初学者可以依靠其学习理论知识,也可以通过和弦添加.曲谱导出等功能来提升弹奏能力.今天,小编就给大家简略地介绍下吉他软件Guitar Pro. 乐谱编辑功能 ...
- Python 键盘鼠标监听
异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的API就可以了. 下面是我在使用pyHoo ...
- 酷Q插件_SDK———入门与使用
1.这里使用的是易语言的SDK,所以请看不惯的人自行离开.{wymbf.} 1.2 这里不会直接给你工程,请用动手打代码,动脑思考. 1.3 不知道.不了解酷Q是干嘛的,请访问:https://cqp ...
- ArcGIS Pro 简明教程(2)基础操作和简单制图
ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...
- 【重磅】PRO基础版免费,是时候和ExtJS说再见了!
三石的新年礼物 9 年了,FineUI(开源版)终于迎来了她的继任者 - FineUIPro(基础版),并且完全免费! FineUIPro(基础版)作为三石奉献给社区的一个礼物,绝对让你心动: 拥 ...
- 【转】 Pro Android学习笔记(九七):BroadcastReceiver(1):基础小例子
目录(?)[-] 基础小例子 发送Broadcast intent 运行情况 应用间的广播 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog ...
- 【转】 Pro Android学习笔记(三九):Fragment(4):基础小例子-续
目录(?)[-] Step 3实现简介显示类DetailFragment 创建实例 编写所需的生命周期代码 Step 4实现showDetailint index如何管理fragment fragme ...
随机推荐
- python如何连接mysql数据库
先花点时间来说说一个程序怎么和数据库进行交互1.和数据库建立连接2.执行sql语句,接收返回值3.关闭数据库连接使用MySQLdb也要遵循上面的几步.让我们一步步的进行. 1.MySQL数据库要用My ...
- ios 应用多语言自由切换实现
第一次进入应用获取本机语言.1.假设本机语言在软件实现语言列表里.则默认选中本机语言,可是用户还是能够选择其他语言.2.假设本机语言不在软件实现语言列表里,则默认选中英语.用户还是能够选择其他语言. ...
- Oracle基础学习登陆SQLPLUS(一)
SQLPLUS是ORACLE公司开发的非常简洁的管理工具,SQLPLUS是最好的,最核心的ORACLE管理工具.SQLPLUS简洁而高效,舍弃浮华,反璞归真.使用sqlplus,进入sqlplus并进 ...
- Blue Jeans - poj 3080(后缀数组)
大致题意: 给出n个长度为60的DNA基因(A腺嘌呤 G鸟嘌呤 T胸腺嘧啶 C胞嘧啶)序列,求出他们的最长公共子序列 使用后缀数组解决 #include<stdio.h> #include ...
- redis常用数据类型 HyperLoglog
1.HyperLoglog简介 HyperLoglog是redis新支持的两种类型中的另外一种(上一种是位图类型Bitmaps).主要适用场景是海量数据的计算.特点是速度快.占用空间小. 同样是用于计 ...
- Python导入不同文件夹下模块
import os.path as osp import sys def add_path(path): if path not in sys.path: sys.path.insert(0, pat ...
- 消息队列(message queue)
最近纠结于一个问题,就是horizon 在处理前台数据的时候非得等到cinder client将数据全部获取后才开始执行horizon的下一行代码,这给大量数据显示造成了很大的时延,其实对于用户体验来 ...
- linq to sql 动态构建查询表达式树
通过Expression类进行动态构造lamda表达式. 实现了以下几种类型,好了代码说话: public Expression<Func<T, bool>> GetAndLa ...
- Unity3D学习笔记——NGUI之UISlider
UISlider:用于创建简单的滑动块和进度条,并且可以添加一个拇指按钮. 效果图如下: 一:使用步骤 1.从上面的效果看出,这个工具由四部分组成:背景图,进度图,进度lable显示,拇指按钮. 2. ...
- OpenCV学习笔记十一:opencv_ocl模块
一,简介: 基于OpenCL优化的代码.