46,数据库(08)

/*
达内学习 Oracle day44 2013-11-4
*/
回忆:
a,使用varchar 来处理变长字符串,在sql中正常使用,在宿主语言中用.arr取出
    防止乱码, 初始化, .arr[.len]='\0'
b,proc预编译选项
  iname    cname   char_map = string
宿主变量的注意事项:
    1,要求宿主变量放入申明区
    exec  sql begin declare section;
    exec  sql end declare section;
    2,可以使用指针  不推荐
   3,ddl中不能使用宿主变量
    4,在sql语句中使用宿主变量时候 前面要加冒号

4 ,指示变量
   当数据库中的字段值, 赋值给宿主变量时候,赋值的状态可以通过指示变量得到
   ==0 赋值正常
   == -1 数据库中字段值是null
   >0 阶段赋值  尽量避免
 short 类型
   : 宿主变量:指示变量
   : 宿主变量  indicator: 指示变量
5 ,数组变量
 proc只支持一维数组 字符除外
 不能使用数组指针
 最大元素个数 32767
 在 select 语句中,只能出现数组名  不能出现下标
6,sqlca通信区
  一个事务中的sql语句 每执行一句都会把一个叫sqlca的结构体,的所有字段更新一遍
  sqlca.sqlerrd[2]   sqlca中影响的行数
  sqlca.sqlcode     sql语句执行的状态
  == 0 正常
  >0 异常发生
  <0  系统错误(网络错误)
 sqlca.sqlerrm.sqlerrmc  sql出错信息
7,oraca 通信区
  对sqlca 的信息补充,消耗资源比较大,默认关闭状态
  从oraca中取得执行的sql语句
  1,包含oraca
     exec sql include oraca;
  2,打开oraca
     exec oracle option(oraca=yes);
  3, 设置sql的保存标志
      oraca.orastxtf=0 默认状态 不保存sql
                         =1  出现错误时保存
                         =2  出现警告或者错误保存
                         =3  所有都保存
  4,得到sql语句
     oraca.orastxt.orastxtc
proc 中select的占位符和 plsql中是一样的
8, proc 中最重要最简单的内容
  proc 中如何嵌入sql语句
    a,select语句
         在select语句前 在 exec sql
         select 语句要和into:宿主变量结合
     exec sql select first_name into :var_name where  id = :id;
    b,dml intsert   delete  update
       tcl comimit rollback savepoint
         ddl  create drop alter
       只需在前面家exec  sql
       ddl中不能出现宿主变量
9, proc中如何调用plsql
 a,proc中如何调用存储过程
   设计一个存储过程 传入两个整数参数 ,把两个参数的和存入第二个参数中
   create or replace procedure getsum(x int number ,y in out number) 
   is
  begin
      y:= x+y;
  end;
 
   exec sql execute
        begin
            /* 相当于匿名快  */
          end;
   end-exec;
   预编译时需要两个预编译选项
   selcheck=semantics
   userid=用户名/密码 在预编译时链接   数据库确定存储过程中是否存在并检查存储过程的合法性
 proc sqlcheck=semantics callprocedure.pc userid = openlab/open123
 
b,proc 中如何调用函数
 写一个函数 传入两个整数参数,返回两个参数最大值,并把两个参数的和放入第二个参数中,两个参数必须使用proc的宿主参数  验证函数的功能
 
10. 远程数据库链接
  本地数据库链接
exec sql connect:userpasswd;
EXEC SQL CONNECT :userName IDENTIFIED BY :userPwd;
   默认链接的是
echo $ORACLE_SID  得到数据库服务名

远程数据库链接
char  userPwd[20] = “scott / tiger”;
char  dbString[20] = “remoteDB”;
EXEC SQL CONNECT : userPwd  Using :dbString;
remoteDB 是网络服务名, 在
$ORACLE_HOME/network/admin/tnsnames.ora文件中定义.

exec sql connect: userpasswd;
为了远程链接
char rdbdes[30]="CAH_192.168.0.26";
 /* 直接和远程数据库 建立链接  */
exec  sql connect:userpasswd using:redbdes;

exec sql connect:userpasswd;
/*  后面的操作无法区分在数据库链接上的操作 */
at 关键字后面可以跟一个标签
char db23[20]="db23";
exec  sql connect:userpasswd at :db23
exec sql connect:userpassed at:db26 using:redbdes;

using 后面跟数据库描述
at 后的数据是用于区分数据库链接的

insufficient privileges 权限不足
create darabase link my26link onnect to openlab identifide by open123
{}
update  s_emp@my26link set salary = 1200 where id=1;
远程数据库的事务 交给本地数据库控制

11,proc中的异常处理
 sqlca.sqlcode 得到sql语句的执行状态
 exec sql whenever 条件 动作
条件:sqlerror     notfound  sqlwarnng
动作:do  错误处理函数
      do break;
     continue;
      stop;
      goto 标签;
12.数据的操作
  a,使用单个变量 一次操作单行数据
     exec sql select first_name into :var_name from s_emp where id=1;
  b,使用多个变量一次操作单行多列
    exec sql select first_name,salary into :var_name,:varsal from s_emp where id =1;
  c,使用结构体操作单行多列
     C++ 中要求把结构体的定义放入申明区
  d,数组变量可以操作多行多列

  f,游标操作多行多列
   proc中的游标使用步骤
    1,声明游标
       exec sql declare 游标名  cursor for  sql语句;
    2,打开游标
        exec  sql open 游标名;
    3,提取数据  处理数据
        exec sql fetch 游标名 into: 结构变量;
    4,关闭游标
         exec sql close  游标名;

如何 遍历游标中所有的数据:
  exec sql whenever notfound do break;
     
滚动游标:可以不按照顺序访问
scroll  cursor
last first
prior  前一个
next  下一个
current   当前
relative  n相对当前   正向后  负数向前
absolute  n绝对


13,动态sql
   1,把一条字符串 对应的sql 当作真正的sql来执行
   动态sql
     不能有select 语句
     不能有:占位符
       exec sql execute immediate :sqlstr;
   2,可以有展位符,不能有select
      exec sql prepare s from :sqlstr;
      exec sql execute using :宿主变量
   3,只能是select 可以有占位符  动态sql2 和 游标的结合
      “select id,first_name,salary from s_emps”
      动态sql2 和游标的结合
char sqlstr[100]="seleect id,first_name,salaryfrom s_emp where id>b    0";
int id =15;
exec sql prepare s from :sqlstr;
exec sql declare empcursor cursor for s;
exec sql open empcursor using:id;

------------------------------------------------
列出相关null相关的知识
1,nvl(par1,par2)
   不为空返回第一个,为空返回第二个,类型要求一致
2,where 字段 is null
3,排序
4,表链接  内链接  外链接  等值  非等值  自连接 (+)
5,组函数和分组
6,子查询
7,DDL
8,约束
9,三范式
10,其他对象
     序列 索引 视图  分页


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值