proc/c++(二)
来源:互联网 发布:网络教育专本科 编辑:程序博客网 时间:2024/05/16 12:02
1. 指示变量:当数据库中的字段值赋值给宿主变量时 赋值的
状态可以通过指示变量得到。
exec sql select 字段 into :宿主变量:指示变量
from 表 where 条件;
exec sql select 字段 into :宿主变量 indicator :指示变量
from 表 where 条件;
==0 正常
==-1 数据库中的字段值是NULL值
>0 截断赋值 尽量避免
2. 数组变量:
(1)proc 只支持一维数组 ,字符除外
(2)proc 不支持数组指针
(3)最大元素数 32767
(4)数组变量在select语句中使用时 只能给出数组名 不能
给下标。
把s_emp 表中所有的first_name,commission_pct
分别放入两个数组中 然后指示提成的赋值状态
3. 可以从sqlca中获得sql语句影响的行数据
sqlca通信区
sqlca.sqlerrd[2] sql语句影响的行数
sqlca.sqlcode sql语句执行状态
==0 sql语句执行正常
>0 异常发生 一般是违反约束
<0 数据库本身出错 或者 网络错误
sqlca.sqlerrm.sqlerrmc 得到sql执行出错原因
-----------------------------------------------
oraca 也是一个通信区 它是对sqlca的信息补充
资源消耗比较大 所有这个通信区默认关闭。
1.包含oraca
exec sql include oraca;
2.打开oraca通信区
exec oracle option(oraca=yes);
3.设置sql语句的保存状态
oraca.orastxtf
0 默认的 不保存sql
1 sql出错时保存
2 sql出现警告保存
3 无论什么情况都保存
4.从oraca中得到sql文本
oraca.orastxt.orastxtc
--------------------------------------
4. 数据库的连接
本地连接:
exec sql connect:userpasswd;
exec sql connect:username
identified by :password;
远程连接:
a.相关的文件
$ORACLE_HOME/network/admin/tnsnames.ora
当有多个数据库连接时 需要使用at 来区分不同连接
这种数据库连接 要使用$ORACLE_HOME/network/admin/
tnsnames.ora 中的数据库描述。 在proc中需要使用关键字
using使用这个描述。但有多个数据库连接时,要使用贴
标签的方式来区分这些具体的连接。在以后的每个sql
操作前都使用 at 关键字指定连接。
b.使用数据库链的方式
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
)';
在192.168.0.26 的sqlplus中建立一个数据库链接
叫my26link
create database link my26link connect to
username identified by passwd using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1524))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
叫my20link
create database link my20link connect to
openlab identified by open123 using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
)
)';
2.在proc中使用这些链接
exec sql select first_name into :var_name
from 表@链接名 where id=1;
exec sql update 表名@链接名 set
字段=值,字段=值 where 条件;
exec sql commit;
远程数据库事务 完全交给本地数据库来控制
状态可以通过指示变量得到。
exec sql select 字段 into :宿主变量:指示变量
from 表 where 条件;
exec sql select 字段 into :宿主变量 indicator :指示变量
from 表 where 条件;
==0 正常
==-1 数据库中的字段值是NULL值
>0 截断赋值 尽量避免
#include <stdio.h>exec sql include sqlca;int main(){ exec sql begin declare section; char userpasswd[30]="username/passwd"; char var_name[30];int mid=-1;/* 指示manager_id 赋值给mid */short indmid=0;exec sql end declare section;exec sql connect:userpasswd;exec sql select first_name,manager_id into :var_name,:mid:indmid from s_empwhere id=2;printf("var_name=%s\n",var_name); printf("mid=%d,indmid=%hd\n",mid,indmid);exec sql commit work release;}
2. 数组变量:
(1)proc 只支持一维数组 ,字符除外
(2)proc 不支持数组指针
(3)最大元素数 32767
(4)数组变量在select语句中使用时 只能给出数组名 不能
给下标。
把s_emp 表中所有的first_name,commission_pct
分别放入两个数组中 然后指示提成的赋值状态
#include <stdio.h>exec sql include sqlca;int main(){ exec sql begin declare section; char userpasswd[30]="username/passwd"; /* 定义两个数组放名字和提成 */char var_names[50][30];double cpcts[50]={0};/* 指示提成的数组 */short indcpcts[50]={0};exec sql end declare section; exec sql connect:userpasswd;exec sql select first_name,commission_pctinto :var_names,:cpcts:indcpcts from s_emp;/* 输出数组中的数据 */int i=0;for(i=0;i<50;i++){ printf("%s:%lf:%hd\n",var_names[i],cpcts[i],indcpcts[i]);}exec sql commit work release;}
3. 可以从sqlca中获得sql语句影响的行数据
sqlca通信区
sqlca.sqlerrd[2] sql语句影响的行数
sqlca.sqlcode sql语句执行状态
==0 sql语句执行正常
>0 异常发生 一般是违反约束
<0 数据库本身出错 或者 网络错误
sqlca.sqlerrm.sqlerrmc 得到sql执行出错原因
exec sql update account set money=money-5000 where ano='A';int a=sqlca.sqlcode;exec sql update account set money=money+5000 where ano='B';int b=sqlca.sqlcode;if(a==0 && b==0){ commit;}else{ rollback;}
-----------------------------------------------
oraca 也是一个通信区 它是对sqlca的信息补充
资源消耗比较大 所有这个通信区默认关闭。
1.包含oraca
exec sql include oraca;
2.打开oraca通信区
exec oracle option(oraca=yes);
3.设置sql语句的保存状态
oraca.orastxtf
0 默认的 不保存sql
1 sql出错时保存
2 sql出现警告保存
3 无论什么情况都保存
4.从oraca中得到sql文本
oraca.orastxt.orastxtc
#include <stdio.h>exec sql include sqlca;exec sql include oraca;exec oracle option(oraca=yes);int main(){ oraca.orastxtf=3;exec sql begin declare section; char userpasswd[30]="openlab/open123";char var_name[30];int var_id=10;exec sql end declare section;exec sql connect:userpasswd;exec sql select first_name into :var_name from s_emp where id=:var_id; printf("%s\n",oraca.orastxt.orastxtc);exec sql commit work release;}
--------------------------------------
4. 数据库的连接
本地连接:
exec sql connect:userpasswd;
exec sql connect:username
identified by :password;
远程连接:
a.相关的文件
$ORACLE_HOME/network/admin/tnsnames.ora
当有多个数据库连接时 需要使用at 来区分不同连接
这种数据库连接 要使用$ORACLE_HOME/network/admin/
tnsnames.ora 中的数据库描述。 在proc中需要使用关键字
using使用这个描述。但有多个数据库连接时,要使用贴
标签的方式来区分这些具体的连接。在以后的每个sql
操作前都使用 at 关键字指定连接。
#include <stdio.h>exec sql include sqlca;int main(){ exec sql begin declare section; char userpasswd[30]="username/passwd";/* 这是保存远程数据库数据的变量 */char var_name[30];/* 远程数据库描述 */char rdbdes[20]="CAH_192.168.0.26";exec sql end declare section;/* 直接和rdbdes对应的远程数据库 建立连接*/exec sql connect:userpasswd using :rdbdes;/* 这是从192.168.0.26主机上取得数据 */ exec sql select first_name into :var_namefrom s_emp where id=1; printf("var_name=%s\n",var_name);exec sql commit work release;}多个数据库连接
#include <stdio.h>exec sql include sqlca;int main(){ exec sql begin declare section; char userpasswd[30]="username/passwd";/* 这是保存远程数据库数据的变量 */char var_name[30];/* 远程数据库描述 */char rdbdes[20]="CAH_192.168.0.26";/* 制造标签 */char db23[20]="db23";char db26[20]="db26";exec sql end declare section;/* 直接和rdbdes对应的远程数据库 建立连接*/exec sql connect:userpasswd at :db26 using :rdbdes;exec sql connect:userpasswd at :db23;/* 这是从192.168.0.26主机上取得数据 */ exec sql at:db26 select first_name into :var_namefrom s_emp where id=1; printf("db26 var_name=%s\n",var_name);/* 要从23数据库连接上取得数据 */ exec sql at:db23 select first_name into :var_namefrom s_emp where id=1;printf("db23 var_name=%s\n",var_name);exec sql at:db26 commit work release;exec sql at:db23 commit work release;}
b.使用数据库链的方式
(1)建立链接
create database link 链接名 connect to 用户名
identified by 密码 using'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
)';
在192.168.0.26 的sqlplus中建立一个数据库链接
叫my26link
create database link my26link connect to
username identified by passwd using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1524))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
)';
叫my20link
create database link my20link connect to
openlab identified by open123 using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ***)
)
)';
2.在proc中使用这些链接
exec sql select first_name into :var_name
from 表@链接名 where id=1;
exec sql update 表名@链接名 set
字段=值,字段=值 where 条件;
exec sql commit;
远程数据库事务 完全交给本地数据库来控制
#include <stdio.h>exec sql include sqlca;/* 在本地数据库中已经建立好了两个 链接 db20link db26link */int main(){ exec sql begin declare section; char userpasswd[30]="openlab/open123"; char var_name[30];exec sql end declare section;/* 连接到本地数据库 */ exec sql connect:userpasswd; exec sql select first_name into :var_name from s_emp where id=1; printf("23db var_name=%s\n",var_name);exec sql select first_name into :var_namefrom s_emp@my20link where id=1; printf("20db var_name=%s\n",var_name); exec sql select first_name into :var_name from s_emp@my26link where id=1; printf("26db var_name=%s\n",var_name); exec sql commit work release;}
- proc/c++(二)
- proc*c 程序设计(二) 指示变量
- Proc*C实例二 -- 读取数据库
- proc源码解析(二)--proc数据结构
- proc源码解析(二)--proc数据结构
- proc源码解析(二)--proc数据结构
- proc源码解析(二)--proc数据结构
- linux c读取proc
- kernel/proc.c
- kernel/proc.c
- linux c shell proc
- PROC*C编程基础
- proc/c++(三)
- proc/c++(一) 快速上手
- proc c编译失败解决办法
- proc
- proc
- /proc
- JSON
- 树的前、中、后遍历非递归算法
- IOS飞机大战OC版
- WPF 多国语言 localization
- 对“啊哈C v2.0”集成开发环境的一些感受 (LTS)
- proc/c++(二)
- 个人计划!
- springmvc 注解版helloworld
- tmpfs和sysfs
- Oracle DB 使用闪回技术2
- 牛逼的Android UI--第18章 与用户交互相关的设计模式 (下1)
- android开发案例之使用JSON数据向服务器提交和获取服务器传递的Json数据
- Android MediaRecorder获取音频流的方法
- 程序的链接与装入(动、静态重定位)