VC調用預存程序的通用方法(ORACLE篇)

來源:互聯網
上載者:User

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的預存程序的調用了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.