proc_day1

一。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
            
            
             
                                                              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值