proc_day02

来源:互联网 发布:淘宝立即购买灰色 编辑:程序博客网 时间:2024/04/21 00:24
   九.sqlca通信区
   9.1 概念
   sqlca 本质上是一个结构体变量,每执行
   一次sql都会把sqlca中的字段更新一遍。
   所以执行完一次sql 可以通过sqlca获得
   sql执行的相关信息。一条sql的执行信息
   执行完sql之后要立即获取 否则会被下一
   条sql覆盖掉。
   9.2 通过sqlca 可以获取的信息
   sqlca.sqlcode  sql的执行状态
       ==0   sql执行正常
       >0    异常发生  一般是违反约束
       <0    数据库本身错误或者网络错误
   sqlca.sqlerrd[2] 获取sql影响的数据行数
   
   sqlca.sqlerrm.sqlerrmc 
       当sql出错时 可以获取错误消息内容      
 
 十. oraca 通信区 
   可以通过oraca 获取执行的sql语句 
   1.包含oraca
   exec sql include sqlca;
   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 
   
 十一. proc中如何嵌入sql语句
    11.1 如何嵌入select 
    在select语句前 加 exec sql 
    和into 结合 把数据放入宿主变量
    11.2 如何嵌入 ddl  dml tcl 
    在这些语句前 加 exec sql
    ddl中不能使用宿主变量 
     
 十二. proc 中如何嵌入 plsql语句
    exec sql execute
        begin
            /* 这里相当于匿名块 */
        end;
    end-exec;         
   
    写一个存储过程  传入两个整数参数
    然后把两个参数的和放入第二个参数中。
    create or replace procedure proGetSum
    (var_x  number,var_y in out number)
    is
    begin
        var_y:=var_x+var_y;
    end;
    /
   
    proc  ***.pc  sqlcheck=semantics 
        userid=openlab/open123
    userid 在预编译时连接数据库 确认
    存储过程 和 函数 是否存在与合法。
        
    写一个plsql函数 传入两个整数参数 返回
    这两个参数的最大值。再写一个proc程序
    调用这个函数 要求参数必须使用宿主变量
    验证这个函数的功能。
    
    create  or  replace  function getMax(
    x in number,y in number)return number
    is
    begin
        if  x<y then
           return y;
        end if;
           return x;   
    end;
    /
    
十三.远程连接
    本地连接
    exec sql connect:username/passwd;
    exec sql connect:name identified by 
        :passwd;
    /* 数据库的服务名或者实例名 */     
    echo  $ORACLE_SID 
                               
    远程连接:
        $ORACLE_HOME/network/admin/
            tnsnames.ora
   CAH_192.168.0.26 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.26)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = tarena)
    )
  ) 
   
   区分具体的数据库 使用 using 
   区分具体的连接   使用 at
   exec sql  connect:userpasswd at :标签;
   exec sql  connect:userpasswd at :标签2
       using  :远程数据库描述;
   在每个操作前 exec sql at:标签名     
       
   
   第二种远程数据库连接方式
   使用 database link 
   create  database link  链接名 connect 
       to  用户名  identified by 密码
       using   '远程数据库描述';
   
   create  database link  my23to26link 
       connect to openlab identified by 
       open123  using 'CAH_192.168.0.26';    
   
   exec sql  select  id,first_name 
       from s_emp@my23to26link where id=1;
   exec sql  update  s_emp@my23to26link 
       set salary=17500 where id=1;    
   exec sql commit;
   
   使用database link   my23to26link 
      查询对应 s_emp 表中id=1的first_name
      并打印这个数据 。查询本地数据库
      中s_emp id=1 的first_name 并打印.
      最后使用这个database link 把id=2 
      的salary 更新成12345 。
      
      
 十四.数据的数据操作时的错误处理  
     14.1 使用单个变量 可以操作单行单列
     局部错误处理  sqlca.sqlcode
     exec sql select  first_name 
         into  :var_name 
         from s_emp  where id=1;
     proc 对错误的默认处理方式 
     (采用默认继续处理的方式)
     这样可以获取到每条语句的执行状态 
     尽而根据状态对数据的事务进行控制。
     比如 转账
     exec sql  update account  
         set money=money-5000 
         where ano='A';    
     a=sqlca.sqlcode;
     exec sql  update account  
         set money=money+5000 
         where ano='B'; 
     b=sqlca.sqlcode;
     
     if(!a&&!b){
         exec sql commit;
     }else{
         exec sql rollback;
     }
     
    14.2 全局错误处理 
     100 条sql 
     进行统一化处理 而不是局部的错误处理
     exec sql  whenever 条件 动作;    
     条件: sqlerror  notfound sqlwarning 
     动作:  do  函数();
            do  break;
            continue;
            goto 标签;
            stop;
     当sql出错时 就向上找一个whenever语句
     如果错误的类型匹配就采用whenever后
     的动作如果不匹配就继续向上找,找不到
     就忽略错误。
     
     可以采用全局 加局部的错误处理方式
     先执行全局处理再执行局部错误处理。
     
 十五.proc中数据的操作
     15.1 使用单个变量操作单行单列
     exec sql select  first_name into 
         :var_name from s_emp
         where id=1;    
     15.2 使用多个变量操作单行多列 
     exec sql select id, first_name,salary
         into :id,:var_name,:salary
         from s_emp where id=1;
     15.3 proc 中使用结构体 替代多个变量
     struct{
         int  id;
         char name[30];
         double salary;
     }emp;    
     struct emp{
         int  id;
         char name[30];
         double salary;
     }emp; 
            
     typedef struct emp{
         int  id;
         char name[30];
         double salary;
     }emp;       
            
     结构体定义 推荐放入申明区
     否则在procc++中不能识别出类型
    15.4 把s_emp 表中所有的id  first_name
    salary 放入一个结构体数组中。然后把
    这个结构体数据中的数据 存入一张提前
    建立好的表中。          
 
    15.5 proc 中的游标 
       15.5.1 非滚动游标
       声明游标 
           exec sql declare 游标名 
               cursor  for select语句; 
       打开游标 
           exec sql open 游标名;
       提取数据 处理数据 
           exec sql fetch 游标名 
               into 变量;
       关闭游标
           exec sql close  游标名;
       15.5.2 把s_emp 表中所有的id 
       first_name  salary  放入一个游标
       中。然后提取游标的前两条数据。     
       
       15.5.3 如何提取游标中所有的数据
       exec sql whenever notfound 
           do break;
       15.5.4 滚动游标
       可以不按照顺序提取游标中的数据
       scroll
           last  最后一行
           first 第一行
           prior 当前行的前一行
           next  当前行的后一行
           current  当前行
           relative  n   n是正数就是向后
                     n是负数就是向前
           absolute  n  绝对的第几行
           
                     
           
     
           
           
                                                     
0 0
原创粉丝点击