proc(1)

来源:互联网 发布:大数据时代的阅读答案 编辑:程序博客网 时间:2024/06/06 18:59

proc

 

主要内容:

1.proc简介

2.proc程序的开发流程

3.宿主变量和指示变量

4.嵌入sql语句

5.连接数据库

6.错误处理

7.数据的存取更新操作

8.动态sql

------------------------------------------

1.什么是pro程序?

  1.1概念

  在过程化的编程语言中嵌入sql开发出的应用程序,称为pro程序

  在编程语言中嵌入的sql叫做嵌入式sql

  可以嵌入sql语句的编程语言称为宿主语言

  1.2proc/c++

  在c/c++语言中嵌入slq语句开发出的应用程序,称为proc/c++程序

  目的:使c这种高效率的编程语言成为访问oracle数据库的工具

2.proc程序和数据库相关的操作

 #include <stdio.h>

  ..

  函数

  变量

 main(){}

 

  /* 包含一个 sqlca的结构 */

 exec sql include sqlca;

  /* 连接数据库 */

 exec sql connect:用户名/密码;

  /* 执行对数据库的操作 */

 exec sql select 字段 into 变量 from 表名 where 条件;

 ....

  /* 断开数据库连接 */

 exec sql commit work release;

 exec sql rollback work release;

 

3.C程序的编写步骤

  1) 编写源程序

    vi ***.c

  2)编译 连接

   gcc ***.c

  3)执行

   ./a.out

 

4.proc程序的编写步骤

  1)编写源代码

   vi ***.pc

  2)预编译  ***.pc --> ***.c

   proc ***.pc

  3)编译 连接

   gcc ***.c -lclntsh   -- linux

  4)执行

   ./a.out

  案例:

  vifirst.pc

5.宿主变量

  5.1概念

   在宿主语言中声明的变量,称为宿主变量

   特点是既可以在宿主语言中使用,也可以在sql语句中使用

  5.2宿主变量的类型

  char            字符

  char var[n]     定长字符串

  short

  int

  long

  float

  double 

  varchar var[n]  变长字符串

  5.3定长字符串和变长字符串

   1)定长字符串   长度不足补空格

     cp first.pc charn.pc

   2)变长字符串

     cp charn.pc varcharn.pc

 

     char   --- varchar

   

     在sql语句中使用变长字符串变量和定长字符串变量没有区别

     但是在宿主语言中使用时,变长字符串需要用.arr提取数据

     可能产生乱码

     解决乱码问题的方法:

     a.变长字符串进行初始化

       varchar name[30]={0};

     b.把变长字符串之后赋值为'\0'

       name.arr[name.len]='\0';

     变长字符串只有两个属性:arr len

   3)使用预编译选项

    oname   相当c中-o

     例如:proccharn.pc oname=my.c

    

    char_map  =charz: 把字符串处理成定长 空格补齐 \0结尾

                        默认的处理方式

               =varchar2|charf:把字符串处理成定长 空格补齐

                        不以 \0 结尾

               =string 把字符串处理成变长 \0结尾

    charn.pc

    proc charn.pc char_map=string

    gcc charn.c -lclntsh

    ./a.out

 

  5.4宿主变量的使用注意事项

   1)宿主变量在sql语句中使用时最好在宿主变量前加:

     避免宿主变量和表中字段重名时引起的问题

    ...

    int id=2;

    ...

    exec sql select first_name into name from s_emp

       where id=id;

    ...

     结果是id=1的数据

  2)ddl语句中不能使用宿主变量

     vi ddl.pc:删除一张表

    ...

    char tablename[30]="emp_zsm_00";

    /* 删除名称为 tablename 的表 */

    exec sql drop table tablename;

    /* 错误  宿主变量不允许在ddl语句中使用 */

    exec sql drop table :tablename;

   3)允许使用指针,但不推荐使用

   4)宿主变量的声明,强烈推荐放入声明区

    (c++,windows要求宿主变量的声明必须放入声明区,

     为了兼容不同的语言和系统,最好放入声明区)

    exec sql begin declare section;

     //声明宿主变量

    exec sql end declare section;

    

6.指示变量

  6.1作用

   从数据库中读取数据赋值的宿主变量时,可以使用指示变量指示

   赋值的状态

   指示变量的值:

  0     -- 赋值正常

  -1    -- 数据库中对应字段的值为null

  >0    -- 截断赋值,要尽量避免(编译没有错误,出错的时机不确定)

  

   指示变量的类型必须是short

 

  6.2指示变量的语法

   short indid;

   short indname;

   -- 第一种用法

   exec sql select id,first_name into :id:indid,:name:indname

      from s_emp where id=1;

    宿主变量和指示变量之间可以有空格,但一般不加

   -- 第二种用法(indicator:指示器)

   exec sql select id,first_name into :id indicator :indid,

      :name indicator :indname from s_emp where id=1;

  6.3把s_emp表中id=1的员工的manager_id和first_name查询出来

    保存在对应的宿主变量中,并用指示变量指示manager_id的赋值状态

   vi indvar.pc  

 

7.数组变量

  7.1使用数组的注意事项

   1)只能使用一维数组,char型除外

    int data[10];

    char names[50][30];

   2)不支持指针数组

   3)数组最大元素个数为32767

   4)在select语句中使用数组时,只能使用数组名,不能加下标

   5)要对多个变量的赋值状态进行指示时,可以使用指示变量数组

  7.2把s_emp表中所有员工的id,first_name,manager_id查询出来

    用多个数组保存,并声明指示变量数组指示manager_id的赋值状态

    循环输出员工的信息

   vi indvar_arr.pc

 

8.sqlca通信区

 sqlca本质上是一个结构体

  每执行一条sql语句,sqlca中的数据就会被覆盖、更新

  所有想要获取sqlca中的数据时需要执行完sql语句马上获取

 sqlca.sqlerrd[2]       sql语句影响的行数

 sqlca.sqlcode          sql语句执行的状态

                  ==0   执行正常

                  >0     执行出错  比如出现异常

                  <0     数据库系统错误 或者网络错误

 sqlca.sqlerrm.sqlerrmc:sql出错的原因(错误的信息)

 

  cpindvar_arr.pc  sqlca.pc

   

9.oraca通信区

  对sqlca通信区的补充

  可以获取执行的sql语句的文本

 

  使用步骤:

  1)包含oraca结构体

   exec sql include oraca;

  2)打开oraca

   exec oracle option(oraca=yes);

  3)设置在什么情况下保存sql文本

   oraca.orastxtf   取值:

               0     不保存 默认值

               1     sql语句错误时保存

               2     sql语句出现警告或错误时保存

               3     无论什么情况都保存

   

   4)取得保存的sql文本

    oraca.orastxt.orastxtc

 

    vi oraca.pc

    

 

10.在proc中使用sql语句

  1)select语句 -- 配合into 使用,前边加exec sql

    exec sql select 字段 into :宿主变量 from 表名

       where 条件;

  2)ddl(create drop alter)

    dml(insert delete update)

    tcl(commit  rollback savepoint)

     直接在sql语句前加exec sql

    ddl中不能使用宿主变量

 

   案例:完成以下功能

       1)创建表:

         id  number primary key

         name varchar2(25)

         sal  number(11,2)

       2)从s_emp表中查询id,first_name,salary三个字段,

         分别存入数组

       3)把以上三个数组中的数据插入到第一步创建的表中

       4)把emp_zsm_00表中id=1的员工的salary 加100

         

   visql.pc

 

-------------------------------------------------------

总结:

1.proc简介

2.proc程序中和数据库相关的操作

3.c程序流程

4.proc程序的编写步骤

5.宿主变量

6.指示变量

  必须是short

7.数组变量

8.sqlca通信区

 sqlca.sqlcode

 sqlca.sqlerrd[2]

 sqlca.sqlerrm.sqlerrmc

9.oraca通信区

 exec sql include oraca;

 exec oracle option(oraca=yes);

 oraca.orastxtf

 oraca.orastxt.orastxtc

10.proc中使用sql语句

 1)select语句配合into 加exec sql

 2)ddl

   dml

   tcl

   直接加execsql  

 

练习:

1.把s_dept表中的所有数据查询出来存到相应的数组,并使用

  指示变量数组指示region_id的赋值状态,循环输出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击