暂无图片
暂无图片
1
暂无图片
暂无图片
1
暂无图片

proc学习第一天

原创 七七 2021-12-23
514

一。proc中和数据库操作相关的
/*包含sqlca这个数据结构*/
exec sql include sqlca;
/*连接数据库*/
exec sql connect:username identified by :password;
exec sql connect:username/password;
/*查询操作*/
exec sql select col_name into :v_col from table_name where ;
/*提交或回滚后断开数据库连接 */
exec sql commit work release;
exec sql rollback work release;
二。写一个C程序的步骤
1.编写源代码
vi ***.c
2.编译 链接
gcc ***.c
3.执行
./a.out
三。PROC程序开发运行流程
1.编写源代码
vi ***.pc文件
2.precompile 把PC文件变成C文件
proc **.pc
3.编译 链接
gcc **.c -I${ORACLE_HOME}/rdbms/public -L${ORACLE_HOME}/lib -lclntsh linux下
gcc **.c -lorasql10 windows
4.执行
./a.out

四。宿主变量
1.概念
C语言是宿主语言
宿主语言定义的变量就是宿主变量。宿主变量的特点是即能在SQL中使用,又能在宿主语言中使用。
2.宿主变量的类型
char 字符类型
char var[n]定长字符串
short 短整型
int
long
float
double
varchar var[n]变长字符串
3.定长字符串和变长字符串
a.定长字符串:数据不够长度就补空格
b.变长字符串
char ---->varchar
在select语句中,使用变长字符串的变量和定长字符串没有区别。
但在宿主语言中,使用变长字符串的变量时,需要使用.arr把数据取出来。
一般变长字符串要初始化(可以使用零初始化,还可以通过获得数据长度然后在这个位置赋值一个'\0' .len),否则可能产生垃圾数据。

#include<stdio.h>
exec sql include sqlca;
int main()
{
char userpasswd[30]="dhr/dhr";
varchar v_name[30]={0};
/* CONNECT TO ORACLE DATABASE */
exec sql connect:userpasswd;
/* select */
exec sql select name into :v_name from t1 where id=10;
printf("v_name=%s \n",v_name.arr);
exec sql commit work release;

}

*************************************************************************************
#include<stdio.h>
exec sql include sqlca;
int main()
{
char userpasswd[30]="dhr/dhr";
varchar v_name[30];
/* CONNECT TO ORACLE DATABASE */
exec sql connect:userpasswd;
/* select */
exec sql select name into :v_name from t1 where id=10;
v_name.arr[v_name.len]='\0';
printf("v_name=%s hello\n",v_name.arr);
exec sql commit work release;

}


c.使用proc的预编译选项处理字符串
oname 相当于gcc的 -o
[nws@upright91 proc]$ proc varcharn.pc oname=var.c
[nws@upright91 proc]$ ls
a.out a.pc var.c varcharn.lis varcharn.pc

char_map=charz 处理成 定长 空格补齐 \0结尾 这是默认规则
=varchar2|charf 处理成 定长 空格补齐
=string 变长 \0结尾

4.宿主变量的使用注意事项
a.宿主变量在sql语句中使用时,变量名前加冒号
b.DDL不能使用宿主变量
c.宿主变量可以使用指针,但不推荐使用
d.宿主变量的定义 强烈推荐放入申明区
exec sql begin declare section;
exec sql end declare section;


#include<stdio.h>
exec sql include sqlca;
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
varchar v_name[30];
int id=20;
exec sql end declare section;
/* CONNECT TO ORACLE DATABASE */
exec sql connect:userpasswd;
/* select */
exec sql select name into :v_name from t1 where id=:id;
v_name.arr[v_name.len]='\0';
printf("v_name=%s hello\n",v_name.arr);
exec sql commit work release;

}

五。指示变量
1.指示变量的作用
当数据库中的字段值赋值给宿主变量时,赋值的状态可能通过指示变量得到。
指示变量的值如果是 0 代表赋值正常
-1 代表数据库中的字段值是NULL值
>0 代表截断赋值,尽量避免
2.指示变量的语法
指示变量必须是short类型
short indid;
short indname;
exec sql select id,name into
:v_id:indid,:v_name:indname
from t1 where id=10;

***或者********************************************
short indid;
short indname;
exec sql select id,name into
:v_id indicator :indid,
:v_name indicator :indname
from t1 where id=10;

3.例子:把T1表 ID=10的name赋值给一个宿主变量,赋值的状态通过指示变量得到。
#include<stdio.h>
exec sql include sqlca;
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
char v_name[30];
short indname=0;
exec sql end declare section;
exec sql connect:userpasswd;
exec sql select name into :v_name:indname from t1 where id=10;
printf("indname=%hd,v_name=%s\n",indname,v_name);
exec sql commit work release;

}

六、数组变量
1.数组变量的使用注意事项
a.只能是一维数组 但字符除外
int data[10];
char names[50][30]; /*定义一个有50行的字符长度为30的数组*/
b.不支持数组指针
c.最大元素个数32767
d.在select语句中使用数组变量时,只能给出数组的名字,不能给下标。
e.如果要指示多个变量的赋值状态,可以使用指示变量数组
2.例子:把T1表中所有ID和NAME分别放入两个数组中,并且使用指示器,指示ID的赋值状态。
indid=0,v_id=10,v_name=aa
indid=0,v_id=10,v_name=bb
indid=0,v_id=20,v_name=cc
indid=0,v_id=30,v_name=dd
[nws@upright91 proc]$ cat test.pc
#include<stdio.h>
exec sql include sqlca;
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
int v_id[10];
char v_name[10][30];
short indid[10];
exec sql end declare section;
exec sql connect:userpasswd;
exec sql select id,name into :v_id:indid,:v_name from t1;
int i=0;
for (i=0;i<sqlca.sqlerrd[2];i++)
{printf("indid=%hd,v_id=%d,v_name=%s\n",indid[i],v_id[i],v_name[i]);
}
exec sql commit work release;
}

运行结果:
[nws@upright91 proc]$ ./test
indid=0,v_id=10,v_name=aa
indid=0,v_id=10,v_name=bb
indid=0,v_id=20,v_name=cc
indid=0,v_id=30,v_name=dd

七。sqlca通信区
sqlca本质上是一个结构体
程序中每执行一条SQL,就会把sqlca中所有的字段都更新一遍。所以要得到一条SQL的执行信息,要立即获取,否则会被下一条SQL覆盖掉。
sqlca.sqlerrd[2] 可以得到sql语句影响的行数
sqlca.sqlcode sql的状态
==0 执行正常
>0 执行出错,一般是违反约束
<0 数据库系统出错或是网络错误
sqlca.sqlerrm.sqlerrmc 得到SQL出错的的原因

例子:
[nws@upright91 proc]$ cat test.pc
#include<stdio.h>
exec sql include sqlca;
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
int v_id[10];
char v_name[10][30];
short indid[10];
exec sql end declare section;
exec sql connect:userpasswd;
if(sqlca.sqlcode==0)
{printf("connect db successful!\n");
}
exec sql select id,name into :v_id:indid,:v_name from t1;
if(sqlca.sqlcode==0)
{printf("select db successful!");
}else
{printf("%s\n",sqlca.sqlerrm.sqlerrmc);}
int i=0;
for (i=0;i<sqlca.sqlerrd[2];i++)
{printf("indid=%hd,v_id=%d,v_name=%s\n",indid[i],v_id[i],v_name[i]);
}
exec sql commit work release;
}

运行结果:
[nws@upright91 proc]$ ./test
connect db successful!
ORA-01403: no data found

indid=0,v_id=10,v_name=aa
indid=0,v_id=10,v_name=bb
indid=0,v_id=20,v_name=cc
indid=0,v_id=30,v_name=dd
[nws@upright91 proc]$ ls
******************************************************
[nws@upright91 proc]$ cat test.pc
#include<stdio.h>
exec sql include sqlca;
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
int v_id[4];
char v_name[4][30];
short indid[4];
exec sql end declare section;
exec sql connect:userpasswd;
if(sqlca.sqlcode==0)
{printf("connect db successful!\n");
}
exec sql select id,name into :v_id:indid,:v_name from t1;
if(sqlca.sqlcode==0)
{printf("select db successful!");
}else
{printf("%s\n",sqlca.sqlerrm.sqlerrmc);}
int i=0;
for (i=0;i<sqlca.sqlerrd[2];i++)
{printf("indid=%hd,v_id=%d,v_name=%s\n",indid[i],v_id[i],v_name[i]);
}
exec sql commit work release;
}

运行结果:
[nws@upright91 proc]$ ./test
connect db successful!
select db successful!indid=0,v_id=10,v_name=aa
indid=0,v_id=10,v_name=bb
indid=0,v_id=20,v_name=cc
indid=0,v_id=30,v_name=dd


八。oraca通信区
对sqlca通信区的信息补充, 可以得到执行的SQL语句
oraca的使用步骤
1.包含oraca
exec sql include oraca;
2.打开oraca
exec oracle option(oraca=yes);
3.设置sql的保存标志
oraca.orastxtf
=0 默认值 ,默认不保存SQL
=1 当sql出错时保存SQL
=2 当SQL出现警告或者出错时保存
=3 无论什么情况都保存
4.得到SQL文本
oraca.orastxt.orastxtc

例子:
#include<stdio.h>
exec sql include sqlca;
exec sql include oraca;
exec oracle option(oraca=yes);
int main()
{
exec sql begin declare section;
char userpasswd[30]="dhr/dhr";
char v_name[30];
int id=10;
exec sql end declare section;
oraca.orastxtf=3;
exec sql connect:userpasswd;
exec sql select name into :v_name from t1 where id=:id;
printf("%s",oraca.orastxt.orastxtc);
exec sql commit work release;
}

得到的结果:
select name into :b0 from t1 where id=:b1



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

星星之火
暂无图片
1年前
评论
暂无图片 0
对于V$SQL视图,有几列关于时间的记录,其中关于LAST_ACTIVE_TIME列的描述正确的是
1年前
暂无图片 点赞
评论