proc/c++(二)

1. 指示变量:当数据库中的字段值赋值给宿主变量时 赋值的
状态可以通过指示变量得到。
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_emp
				where  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_pct
				into :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_name
				from 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_name
				from s_emp where id=1;
    printf("db26 var_name=%s\n",var_name);
		/* 要从23数据库连接上取得数据 */
    exec sql at:db23 select first_name into :var_name
				from 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 = ***)

    )';


  在192.168.0.20 的sqlplus中建立一个数据库链接
 叫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_name
				from 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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值