Day44_PRO_C的使用

一、proc如何使用sql语句
  1.select 语句 只要在语句前 加exec sql 并且结合 into 使用
    exec sql select first_name into :var_name from s_emp where id=1;
  2.dml(insert delete update)
    ddl(create drop alter)
    tcl(commit rollback savepoint)
    直接在语句前加 exec sql 即可
    ddl中不能使用宿主变量
二、proc中如何使用PLSQL
  1.使用PLSQL的语法
    exec sql execute
      begin
        /* 这里相当于匿名块 */
      end;
    end-exec;
    在proc预编译时 需要使用两个选项
    sqlcheck=semantics
    userid=用户名/密码
  2.proc中如何调用存储过程
    a.写一个存储过程 传入两个整数参数
      然后把这两个整数参数的和 存入第二个参数中
      create or replace procedure getsum(x in number,y in out number)
      is      
      begin
        y:=x+y;
      end;
    b.写一个proc程序验证存储过程
      
  3.proc 中如何调用函数
    a.设计一个plsql的函数 传入两个整数参数 返回这两个整数参数的最大值 写一个proc程序验证
      create or replace function getmaxnum(x in number,y in number) return number
      is      
      begin
        if x>y then
          return x;
        else
          return y;
        end if;
      end;
三、数据库连接
  1.本地数据库
    exec sql connect:用户名/密码;
    exec sql connect:用户名  identified by:密码;
  2.远程数据库连接
    $ORACLE_HOME/network/admin/tnsnames.ora
    得到某个机器上的oracle服务器名
    echo $ORACLE_SID
  3.使用using:远程数据库描述符号 就可以区分不同的数据库。
    有多个数据库连接时 需要使用at:标签 来区分具体的连接
    只需要在每个数据库操作前 加上exec sql at:标签名 即可
  4.使用database link 进行远程数据库连接;
    建立database link  的语法
      create  database link  链接名
        connect to 用户名 indentified by 密码 using '远程数据库描述';
    在sqlplus中建立 35 到179的远程连接
      create database link my35_179zjlink
        connect to openlab identified by open123 using '192.168.40.179';
         报错:重复链接或者权限不够
         本地操作
           select id,first_name from s_emp where id=1;
         远程操作
            select id,first_name from s_emp@my35_179zjlink where id=1;
         给id等于1,的人涨工资
           select id,first_name,salary from s_emp@my35_179zjlink where id=1;
           update s_emp@my35_179zjlink where id=1;                  
           update s_emp@my35_179zjlink set salary=salary+100 where id=1;
         远程数据库的事物交给本地操作
            create database link my35_179link
               connect to openlab identified by open123 using
                       (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.40.179)(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
      )
    )
        总结:必须先登陆本地的数据库 然后才能使用数据库中的链接。链接可以建立多个。远程数据的事物交给本地数据库来控制。
四、proc中的异常处理
    1. sqlca.sqlcode 来判断sql语句的执行状态,局部的错误处理;
    2. proc中的全局错误处理方式
       exec sql whenever 条件 动作
     条件:sqlerror notfound sqlwarning
     动作:do  错误处理函数名();
            do break;    终止循环
            continue;
            stop;
            goto  标签;
     3.举例
         把s_emp 表 删除表
     总结:proc中sql出错之后,向上查找 exec sql whenever 语句 如果找到就执行whenever语句对应的动作。如果找不到就采用系统默认的忽略处理

五、proc中的数据处理
  1.使用单个变量处理 单行单列
    exec sql select 字段名 into :宿主变量 from 表名 where 条件;
  2.使用多个变量  一次操作单行多列
    exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=1;
  3.使用结构体 操作 单行多列
    struct{
        int    id;
        char   name[30];
        double salary;
    } emp;
    
    struct emp{
        int    id;
        char   name[30];
        double salary;
    } emp;
  4.使用结合结构体 和 数组操作多行多列
    把s_emp表中所有的id,first_name,salary 放入一个结构体数组中
  5.使用游标操作 多行多列
    1).游标的使用步骤
      a.声明游标
        exec sql declare 游标名 cursor for select 语句;
      b.打开游标
        exec sql open 游标名;
      c.提取数据
        exec sql fetch 游标名 into 宿主变量;
      d.关闭游标
        exec sql close 游标名;
    2).举例
      把s_emp表中所有的id,first_name,salary 放入游标中
    3).把上面的游标代码复制一份,然后考虑如何遍历出游标中所有的数据
    4).滚动游标
      可以不按照顺序 提取数据
      scroll
      fetch last  最后一条数据
      fetch first 第一条数据
      fetch prior 当前的前一行数据
      fetch next  当前的后一行
      fetch relative n 正数向后,负数向前
      fetch absolute n 绝对的第几条
      fetch current  当前数据
      
六、动态sql
  1.不能是select语句
    不能有占位符
    exec sql execute immediate :sqlstr;
  2.可以有占位符 :b0 :b1
    不能是select语句
    /* 预处理 */
    exec sql prepare s from :sqlstr;
    exec sql execute s using:宿主变量;
  3.只能是select语句
    可以有占位符
    "select id,first_name,salary from s_emp where id>:bo"
    动态sql2+游标的形式
    核心思想:把预处理的串 关联到游标上
    
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值