zoukankan      html  css  js  c++  java
  • VC调用存储过程的通用方法(ORACLE篇)

    From: http://soft.zdnet.com.cn/software_zone/2008/0922/1144116.shtml

    先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果集,需要进行遍历:

    long lngRec = 0;
    _RecordsetPtr Rs = m_Rs;   //m_Rs为调用存储过程返回的结果集

    while(Rs)
    {
       //结果集的处理,有无数据的判断,数据处理等
      while(!m_Rs->EndOfFile)
      {
         //...
      }
       Rs = Rs->NextRecordset((VARIANT *)lngRec);
    }

    调用Oracle存储过程,vc调用代码不需要变动,但需要对Oracle存储过程和调用的SQL语句进行一些调整。

    首先,连接字符串不能用ODBC,即连接字符串不能是
    "Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;"
    这种形式,而应该是类似:
    "Provider=MSDAORA.1;Password=asdasd;User ID=Username;Data Source=world;Persist Security Info=True"

    然后是存储过程的调整,Oracle存储过程怎么返回结果集网上的文章已经很多了,需要用到包,随便摘录一个:

    CREATE OR REPLACE PACKAGE pkg_test
    AS
        TYPE myrctype IS REF CURSOR;
     
        PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);
    END pkg_test;
    /
     
    CREATE OR REPLACE PACKAGE BODY pkg_test
    AS
        PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)
        IS
           sqlstr   VARCHAR2 (500);
        BEGIN
           IF p_id = 0 THEN
              OPEN p_rc FOR
                 SELECT ID, NAME, sex, address, postcode, birthday
                   FROM student;
           ELSE
              sqlstr :=
                 "select id,name,sex,address,postcode,birthday
                from student where id=:w_id";
              OPEN p_rc FOR sqlstr USING p_id;
           END IF;
        END get;
    END pkg_test;
    /
    其实不用包也可以,直接创建get,只需要把最后一个参数p_rc的类型改为sys_refcursor就可以了。

    最后是SQL语句的调整,SQLServer是直接get 0就可以,Oracle必须这样调用
    {call get(0)}
    即执行:
    m_Rs->Open("{call get(0)}",(IDispatch*)(m_Conn->m_Conn),adOpenStatic,    adLockReadOnly,adCmdText);
    get虽然有两个参数,但是SQL语句里这个最后的输出参数是可以不用写的。

    {call 存储过程名(输入参数1,输入参数2,...)}这样的SQL语句在SQLServer和Oracle是都能得到返回结果集的,因此只要把SQL语句改成这种形式,程序代码不需要修改,就可以同时支持SQLServer和Oracle存储过程的调用了。

  • 相关阅读:
    线程包含CPU现场
    K8S资源操作
    Kubernetes资源管理
    kubernetes部署安装
    kubernetes简介
    Docker总结
    3.11 虚拟局域网
    3.10 以太网交换机生成树协议STP
    3.9 以太网交换机自学习和转发帧的流程
    3.8 集线器与交换机的区别
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1884811.html
Copyright © 2011-2022 走看看