学习笔记day69-----oracle-proc-在C/C++中使用ql/sql语法的方法

1、proc中使用qlsql
    1.1、语法
        exec sql execute
            begin
                /*相当于qlsql的匿名库*/    
            end;
        end-exec;

        在预编译的时候,需要增加两个预编译选项:
            sqlcheck=semantics
            userid=用户名/密码  //使用userid的目的,在预编译时连接数据库,检查调用的过程,函数等是否存在,调用方式是否正确。
    1.2、proc中调用存储过程
        1)  创建一个存储过程
            根据指定id 查询员工的first_name
                create or replace procedure proc_lx_42(sid number,name out varchar2) is
                begin
                    select first_name into name from s_emp where id=sid;
                end;
                /
                declare
                    id number(7):=1;
                    name varchar2(25);
                begin
                    proc_lx_42(id,name);
                    dbms_output.put_line(name);
                end;
                /
        2)  调用
            案例:callprocedure.pc
    1.3、调用函数
        1)  创建函数
            创建一个函数,传入两个数字,返回最大值,同时把两数之和保存在第二个参数
            create or replace function func_lx_42(one number,two in out number) return number is
                var_temp number;
            begin
                var_temp:=two;
                two:=one+two;
                if one>var_temp then
                    return one;
                end if;
                    return var_temp;
            end;
            /
        2)
            案例:callfunction.pc
2、数据库的连接
    2.1、本地数据库连接
        exec sql connect:用户名/密码
        exec sql connect:用户名 identified by :密码;
    2.2、远程数据库连接
        需要提供一个描述,描述运程的数据库。包括:ip地址、端口号、oracle数据库的服务ID(服务名)。
        %ORACLE_HOME/network/admin/tnsnames.ora文件中有远程数据库描述的配置
        $ORACLE_HOME:环境变量   oracle的安装路径
        char rdbdesc[]="DB20";
        exec sql connect:userpasswd using :rdbdesc;

        案例:rdbconn.pc
    2.3、连接多个数据库
3、错误处理
    3.1、局部错误处理
        sqlca.sqlcode
    3.2、全局错误处理
        错误处理方案只写一次,可以多次使用
        语法:
            exec sql whenever 条件 动作;
            其中,条件-----条件类型,有三种:
                                    sqlerror-----sql语句错误
                                    notfound-----没有找到数据
                                    sqlwarning---sql语句出现警告(不常用)
                动作-----错误处理方案,有多种:
                do 错误处理函数();  ---一旦出现错误,调用函数
                do break;           ---推出循环
                continue;           ---继续运行
                stop;               ---停止运行
                goto 标签;          ---跳转
    3.3、案例
        sqlerror.pc
        执行sql语句时,如果出现了错误,向上查找匹配的错误处理语句,并执行错误处理方案,之后继续执行后面的操作
4、proc中的数据处理
    1)  单行单列的结果集    一个宿主变量
            exec sql select first_name into :name from s_emp where id=1;
    2)  单行多列的结果集    多个宿主变量或者结构体变量
            exec sql select id,first_name into :id,:name from s_emp where id=1;
            案例:使用结构体变量接受单行多列的结果集
                selecta.pc
    3)  多行单列的结果集    一个数组
            exec sql first_name into :names from s_emp;
    4) 多行多列的结果集    多个数组或结构体数组或者游标
            exec sql id,first_name into :ids,:names from s_emp;
            案例:使用结构体数组接受多行多列的结果集
                selectb.pc
            案例:使用游标接受多行多列的结果集
                selectc.pc
                a.声明游标
                    exec sql declare 游标名 cursor for select语句;
                b.打开游标
                    exec sql open 游标名;
                c.提取数据
                    exec sql fetch 游标名   into :宿主变量;
                d.关闭游标
                    exec sql close 游标名;
                游标在提取数据时,会用到循环,退出循环的方式:
                    exec sql whenever notfound do break;

            有一种滚动游标,可以直接跳转到结果集的任何位置,在使用上和普通游标(顺序游标)的差别
                1、声明滚动游标时,关键字是 scroll cursor
                    exec sql declare 游标名 scroll cursor for select 语句;
                2、fetch时,有多种方式:
                    fetch first         提取第一行
                    fetch last          提取最后一行
                    fetch next          提取当前行的下一行
                    fetch prior         提取当前行的上一行
                    fetch absolute n    提取第n行
                    fetch relative n    提取从当前行开始的第n行
                    fetch current       提取当前行

                    比如:
                        exec sql fetch absolute 10 游标名 into :宿主变量;
                        案例 selectd.pc

                案例:使用游标,便利s_dept表中的全部数据
5、动态sql
    proc中常用的动态sql有三种情况:
        1)  非select语句,没有占位符(不使用宿主变量)
            char sqlstr[100] = "create table ...";
            exec sql execute immediate :sqlstr;

            案例:dsqla.pc

        2)  非select语句,有占位符(使用宿主变量)
            char sqlstr[100] = "insert into 表名 values(:b0,...)";
            exec sql prepare s from :sqlstr;
            exec sql execute s using :宿主变量,...;

            案例:dsqlb.pc
        3)  select语句
            char sqlstr[100] = "select 字段列表 from 表名";
            exec sql prepare s from :sqlstr;
            exec sql declare 游标名 cursor for s;

            案例:dsqlc.pc

c++ 编译
proc oracledao.pc parse=none code=cpp oname=oracledao.cpp

练习

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值