使用VC调用ORACLE的存储过程并返回记录
m_pConnection.CreateInstance("ADODB.Connection");
/******************连接数据库********************/
try
{
m_pConnection->ConnectionTimeout = 8;
//连接SQL SERVER
//m_pConnection->Open("Driver=SQL Server;Database=test;Server=127.0.0.1;UID=sa;PWD=;","","",adModeUnknown);
//连接ACCESS2000
//m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=userinfo.mdb","","",adModeUnknown);
//连接到oracleMSDAORA oraoledb.oracle
m_pConnection->Open("Provider=oraoledb.oracle;Data Source=ep;User ID=zongdui;Password=zongdui;PLSQLRSet=1","","",adModeUnknown); }
catch(_com_error e)///捕捉异常
{
AfxMessageBox("数据库连接失败!");
return FALSE;

/**********************************************/上面是连接数据库,PLSQLRSet=1这个一定要有。 m_bNewUser = FALSE;
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
//m_pRecordset->Open("SELECT name as username,old,photo as photo1 FROM test",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenStatic,adLockPessimistic,adCmdText);
_CommandPtr     pCmdChange  = NULL;
// _ParameterPtr pprmByRoyalty = NULL; pCmdChange.CreateInstance(__uuidof(Command));
pCmdChange->CommandType = adCmdStoredProc;
pCmdChange->CommandText = "pkg_test.get";


//Define Integer/variant.
// pprmByRoyalty.CreateInstance(__uuidof(Parameter));
// VARIANT vtRoyalty;
// vtRoyalty.vt = VT_I2;
// vtRoyalty.iVal = 20;
// pprmByRoyalty = pCmdChange->CreateParameter("param1",adInteger,adParamInput,sizeof(int),vtRoyalty);
// pCmdChange->Parameters->Append(pprmByRoyalty); // pprmByRoyalty->Value  = vtRoyalty;
           
      //Create Recordset by executing the command
pCmdChange->ActiveConnection = theApp.m_pConnection; //Create Recordset by executing the command
m_pRecordset->CursorType=adOpenStatic;
m_pRecordset->LockType=adLockPessimistic;
m_pRecordset = pCmdChange->Execute(NULL,NULL,adCmdStoredProc); 
//m_pRecordset->Open("{CALL (?{20})}",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenStatic,adLockPessimistic,adCmdStoredProc);
/**/
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
return FALSE;
}这样就可以得到pkgtest.get返回的记录集

解决方案 »

  1.   

    在ASP中使用Oracle数据库技巧
    Oracle是世界上用得最多的数据库之一,活动服务器网页(ASP)是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言。许多ASP开发人员一直在考虑,能否在开发互联网应用、电子商务网站、互联网管理系统时结合使用ASP和Oracle数据库?这个问题的答案是肯定的,我们还可以使用VB访问Oracle数据库。在本篇文章中,我们将主要讨论如何使用ASP来处理Oracle数据库中数据的方法。  在开始讨论这个问题前,我们需要了解几个背景知识,Oracle Objects for OLE就是其中之一。Oracle Objects for OLE是Oracle开发的一个中间件,它允许使用微软的OLE标准的客户端应用程序访问Oracle的数据库。也许会有读者说,我们也可以使用ODBC访问Oracle的数据库。当然,可以使用ODBC访问Oracle数据库,但我认为,Oracle Objects for OLE比ODBC更安全,而且完全支持PL/SQL。PL/SQL是Oracle对SQL命令集的扩展,开发人员能够利用它对非结构化的SQL命令块进行流控制和逻辑设计。如果安装的是Oracle8i数据库,我相信你已经在使用Oracle Objects for OLE。如果还没有使用Oracle Objects for OLE,可以从Oracle的网站上下载它。  另外,我们还需要了解Oracle针对Visual Basic开发的二个对象和一个接口:OraSession、OraDynaset对象和OraDatabase接口。OraSession对象管理应用程序的OraDatabase、OraConnection和OraDynaset,它是由ASP的CreateObject而不是Oracle Objects for OLE创建的一个对象。OraDatabase接口向Oracle数据库表示表现用户对话,并为SQL、PL/SQL的执行提供方法。它们每个都有一些属性和方法。例如,OraDynaset对象有BOF、EOF、Book、Connection等属性以及AddNew、Update、Delete、Edit、Refresh、Clone等10个方法。  下面我们就开始切入主题,讨论如何使用ASP处理Oracle数据库中的数据。  准备工作
      我们需要什么样的环境和工具?
      1)我使用了Oracle8i、IIS5.0、Windows2000专业版作为应用程序的开发和运行环境。
      
      2)在Oracle数据库中建立一个名字为MYTABLE1或类似的表。ID (type: number) User Name(type: varchar2) Phone(type: varchar2) Email(type: varchar2) 100 Colin Tong 999-999-8888 [email protected] 111 John White 888-888-8888 [email protected] 101 Don Wod 416-333-3344 [email protected]  数据的访问和存取  1) Instantiate OO4O Object, OraSession and interface OraDatabase for connecting to ORACLE.   
      
      初始化Oracle Objects for OLE、OraSession对象和OraDatabase接口,为连接ORACLE数据库作准备。  首先,使用CreateObject创建OraSession对象,然后通过打开一个与Oracle的连接创建OraDatabase对象,如下所示:  <%
      Set OraSession = CreateObject("OracleInProcServer.XOraSession")  Set OraDatabase = OraSession.OpenDatabase("", _  "username/password", Cint(0))
      %>  “username”和“password”是你所使用的关系数据库的用户名和口令。  2)创建OraDynaset对象执行SQL命令。我们可以使用CreateDynaset或DbCreateDynaset创建记录集。
      <%
      'execute SQL Set OraDynaset = OraDatabase.DbCreateDynaset( _ "select * from
      mytable1", cint(0))
      %>3)存取数据并删除创建的对象。  <%  Do While(OraDynaset.EOF = FALSE)  Response.write(OraDynaset.Fields("ID"))  Response.write(OraDynaset.Fields("UserName"))
      ... others ...
      ... ...
      OraDynaset.MoveNext
      Loop
      'remove OraSession
      Set OraSession = Nothing
      %>
      编辑数据记录
      我们将使用OraDynaset的方法实现对数据记录的编辑。
      1)使用SQL语句创建OraDynaset对象。
      <%
      '创建ID= fID的记录的OraDynaset对象。
      Set OraDynaset = OraDatabase.CreateDynaset(_
      "select * from MYTABLE1 where ID= "& fID, cint(0))
      %>  fID是想插入更更新的记录的ID值。  2)执行OraDynaset更新或添加数据记录。  <%   '使用Edit方法更新ID=fID记录的域。
      '或使用AddNew插入一个新记录
      OraDynaset.Edit
      OraDynaset.Fields("Phone").Value = fPhone
      OraDynaset.Update
      ' 删除创建的对话
      Set OraSession = Nothing
       %>删除数据记录   
      如果已经真正地理解了我们在上面讨论的一些方法(Edit、Update和AddNew),也许有的读者已经知道该如何在Oracle数据库中删除记录了。
      <%
      '删除所有符合上面条件的记录 OraDynaset.Delete
      %>
      在Oracle8i中搜索和更新数据记录的代码
      1)搜索
      <%
    'RetriveRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录
    %>
    <% '定义作为OLE对象的变量
      Dim OraSession
      Dim OraDatabase
      Dim OraDynaset
    '创建OraSession对象
      Set OraSession = CreateObject("OracleInProcServer.XOraSession")'通过打开Oracle数据库的一个连接创建OraDatabase对象
    '一定要使用自己的用户名和口令访问Oracle数据库
    Set OraDatabase = OraSession.OpenDatabase("", "user/password", _
    Cint(0))'创建OraDynaset对象执行SQL语句
      Set OraDynaset = OraDatabase.DbCreateDynaset(_
      "select * from mytable1", cint(0))
      %><html>  <body>
      <H3>Retrieve All Records in MYTABLE1 Table ( in Oracle)
      Using oo4o</H3>
      <table border=1 ID="Table1">
      <%
      Do While(OraDynaset.EOF = FALSE)
      Response.Write("<tr><td>")
      Response.write(OraDynaset.Fields("ID"))
      Response.Write("</td><td>")
      Response.write(OraDynaset.Fields("UserName"))
      Response.Write("</td><td>")
      Response.write(OraDynaset.Fields("Phone"))
      Response.Write("</td><td>")
      Response.write(OraDynaset.Fields("Email"))
      Response.Write("</td></tr>")
      OraDynaset.MoveNext
      Loop
      '删除OraSession Set OraSession = Nothing
       %>
      </table>
      <a href="javascript:window.history.go(-1)">
      Back previous Page</a> |
      <a href="index.html"> Back home Page</a>
      </body>
      </html>  2)更新
      <% 'UpdateRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录  %>
      <%
      '定义作为OLE对象的变量。Dim OraSession
      Dim OraDatabase
      Dim OraDynaset
      '从提交的表格中获取字段值
      fID = request.form("ID")
      fUserName = request.form("UserName")
      fPhone = request.form("Phone")
      fEmail = request.form("Email")
      '创建OraSession对象
      Set OraSession = CreateObject("OracleInProcServer.XOraSession")
      '通过打开Oracle数据库的一个连接创建OraDatabase对象
      Set OraDatabase = OraSession.OpenDatabase("", "user/password", _ Cint(0))
      '创建ID= fID的记录的OraDynaset对象
      Set OraDynaset = OraDatabase.CreateDynaset(_ "select * from MYTABLE1 where ID= "& fID, cint(0))
      '使用Edit方法更新ID=fID记录的字段
      Do While(OraDynaset.EOF = FALSE)
      OraDynaset.Edit
      OraDynaset.Fields("UserName").Value = fUserName
      OraDynaset.Fields("Phone").Value = fPhone
      OraDynaset.Fields("Email").Value = fEmail
      OraDynaset.Update
      OraDynaset.MoveNext Loop
      %>
      <html>
      <body><H3>Update A Record in MYTABLE1 Table (Oracle) Using oo4o</H3>  The record (ID=<%=fID%>) has been updated successfully!<br>
      You can view the result <a href="RetrieveAllRec.asp"> here</a>
      <a href="javascript:window.history.go(-1)"> Back previous Page</a>
      &bnsp;&bnsp;
      <a href="javascript:window.history.go(-2)"> Back home Page</a>  <%  '删除OraSession对象  Set OraSession = Nothing
      %>  </body>  </html>  至此,我们已经讨论了如何在ASP代码中使用Oracle Objects for OLE来处理Oracle数据库中的数据。  使用存储过程
      我们已经讨论了如何在ASP中访问Oracle数据库,所有的SQL语句都可以嵌入在ASP网页中。如果在ASP中使用存储过程,将更能够更有效地处理数据。我建议读者除在ASP中嵌入SQL语句外,还应当使用PL/SQL存储过程。在Oracle数据库中创建存储过程已经超出了本文章的范围,在这里就不再进行介绍了。  ASP和Oracle数据库是二种比较流行的技术,都有相当广泛的用户群,如果能够有机地将二者结合起来,将能够给工作带来许多方便,希望这篇文章能够起到抛砖引玉的作用,使读者能够更好地探索将这二种技术结合使用的途径。
      

  2.   

    我也来贴~ (就过段 VB+ado 的话)一、关于ADO  ---- 在基于Client/Server结构的数据库环境中,通过OLE DB接口可以存取数据,但它定义的是低层COM接口,不仅不易使用,而且不能被VB,VBA,VBScript等高级编程工具访问。而使用ADO则可以很容易地使VB等编程语言直接访问数据(通过OLE DB接口)。ADO是基于面向对象方法的,其对象模型如下图所示(略)  ---- 由上图可见,ADO对象模型总共才包括六个对象,相对于数据访问对象(DAO)来说简单得多。因此实际中常常使用它来访问数据库。  ---- 二、ADO访问数据库实例  ---- 下面,我们以Oracle为例,使用VB6.0来访问其数据库中的存储过程。在此例中,我们首先在Oracle数据库上创建有两个存储过程,一个不带参数,另一个带有参数。然后,使用ADO来访问这两个存储过程。步骤如下:  ---- 1. 在Oracle服务器上运行以下DDL脚本:  DROP TABLE person;  
    CREATE TABLE person  
    (ssn NUMBER(9) PRIMARY KEY,  
    fname VARCHAR2(15),  
    lname VARCHAR2(20));  
    INSERT INTO person VALUES(555662222,'Sam','Goodwin');  
    INSERT INTO person VALUES(555882222,'Kent','Clark');  
    INSERT INTO person VALUES(666223333,'Jane','Doe');  
    COMMIT;  
    /  ---- 2. 在Oracle服务器上创建包(package):  
    CREATE OR REPLACE PACKAGE packperson  
    AS  
    TYPE tssn is TABLE of NUMBER(10)  
    INDEX BY BINARY_INTEGER;  
    TYPE tfname is TABLE of VARCHAR2(15)  
    INDEX BY BINARY_INTEGER;  
    TYPE tlname is TABLE of VARCHAR2(20)  
    INDEX BY BINARY_INTEGER;  PROCEDURE allperson  
    (ssn OUT tssn,  
    fname OUT tfname,  
    lname OUT tlname);  
    PROCEDURE oneperson  
    (onessn IN NUMBER,  
    ssn OUT tssn,  
    fname OUT tfname,  
    lname OUT tlname);  
    END packperson;  
    /  ---- 3. 在Oracle服务器上创建以下包体(package body):  
    CREATE OR REPLACE PACKAGE BODY packperson  
    AS  
    PROCEDURE allperson  
    (ssn OUT tssn,  
    fname OUT tfname,  
    lname OUT tlname)  
    IS  
    CURSOR person_cur IS  
    SELECT ssn, fname, lname  
    FROM person;  
    percount NUMBER DEFAULT 1;  
    BEGIN  
    FOR singleperson IN person_cur  
    LOOP  
    ssn(percount) := singleperson.ssn;  
    fname(percount) := singleperson.fname;  
    lname(percount) := singleperson.lname;  
    percount := percount + 1;  
    END LOOP;  
    END;  
    PROCEDURE oneperson  
    (onessn IN NUMBER,  
    ssn OUT tssn,  
    fname OUT tfname,  
    lname OUT tlname)  
    IS  
    CURSOR person_cur IS  
    SELECT ssn, fname, lname  
    FROM person  
    WHERE ssn = onessn;  
    percount NUMBER DEFAULT 1;  
    BEGIN  
    FOR singleperson IN person_cur  
    LOOP  
    ssn(percount) := singleperson.ssn;  
    fname(percount) := singleperson.fname;  
    lname(percount) := singleperson.lname;  
    percount := percount + 1;  
    END LOOP;  
    END;  
    END;  
    /  ---- 4. 在 VB 6.0 中打开一个新的工程,缺省创建表单 Form1。  
    ---- 5. 在表单上添加二个按钮,cmdGetEveryone和cmdGetOne。  ---- 6. 在代码窗口中添加以下代码:  Option Explicit  
    Dim Cn As ADODB.Connection  
    Dim CPw1 As ADODB.Command  
    Dim CPw2 As ADODB.Command  
    Dim Rs As ADODB.Recordset  
    Dim Conn As String  
    Dim QSQL As String  
    Dim inputssn As Long  Private Sub cmdGetEveryone_Click()  
    Set Rs.Source = CPw1  
    Rs.Open  
    While Not Rs.EOF  
    MsgBox "Person data: " & Rs(0) & ",  
    " & Rs(1) & ", " & Rs(2)  
    Rs.MoveNext  
    Wend  
    Rs.Close  
    End Sub  Private Sub cmdGetOne_Click()  
    Set Rs.Source = CPw2  
    inputssn = InputBox(  
    "Enter the SSN you wish to retrieve:")  
    CPw2(0) = inputssn  
    Rs.Open  
    MsgBox "Person data: " & Rs(0) & "  
    , " & Rs(1) & ", " & Rs(2)  
    Rs.Close  
    End Sub  Private Sub Form_Load()  
    '使用合适的值代替以下用户ID,  
    口令(PWD)和服务器名称(SERVER)  
    Conn = "UID=*****;PWD=*****;driver=" _  
    & "{Microsoft ODBC for  
    Oracle};SERVER=dseOracle;"  
    Set Cn = New ADODB.Connection  
    '创建Connection对象  
    With Cn  
    .ConnectionString = Conn  
    .CursorLocation = adUseClient  
    .Open  
    End With  
    QSQL = "{call packperson.allperson(  
    {resultset 9,ssn,fname,"_  
    & "lname})}"  
    Set CPw1 = New ADODB.Command  
    '创建Command对象  
    With CPw1  
    Set .ActiveConnection = Cn  
    .CommandText = QSQL  
    .CommandType = adCmdText  
    End With  
    QSQL ="{call packperson.oneperson(?,  
    {resultset 2,ssn, "_  
    & " fname,lname})}"  
    '调用存储过程  
    Set CPw2 = New ADODB.Command  
    With CPw2  
    Set .ActiveConnection = Cn  
    .CommandText = QSQL  
    .CommandType = adCmdText  
    .Parameters.Append.CreateParameter(  
    ,adInteger, _  
    adParamInput)  
    '添加存储过程参数  
    End With  
    Set Rs = New ADODB.Recordset  
    With Rs  
    .CursorType = adOpenStatic  
    .LockType = adLockReadOnly  
    End With  
    End Sub  Private Sub Form_Unload(Cancel As Integer)  
    Cn.Close  
    Set Cn = Nothing  
    Set CPw1 = Nothing  
    Set CPw2 = Nothing  
    Set Rs = Nothing  
    End Sub  ---- 7. 运行程序。当点下cmdGetEveryone按钮时,程序调用Oracle数据库中不带参数的存储过程packperson.allperson,点下cmdGetOne按钮时调用packperson.oneperson存储过程。 
      

  3.   

    我是做java的,能用java来阐述吗???谢谢了
      

  4.   

    我是用java的,在JDBC中有一个CallableStatement 接口,你可以使用它来调用oracle的存储过程
      

  5.   

    很简单的,在google上查查就知道了,祝你好运!
      

  6.   

    存储过程p_test:
    create or replace procedure p_test(fnum1 in int,fname1 in nvarchar2,fnote1 in nvarchar2) is
    begin
      insert into base_table(fnumber,fname,fnote) values(fnum1,fname1,fnote1);
    end p_test;
    程序调用:
    //连接oracle
    Connection dbConn = DBConnection.getDBConnection();//调用存储过程
    CallableStatement cstmt = dbConn.prepareCall("{call p_test(?,?,?)}");
    //给参数赋值
    cstmt.setInt(1,90);
    cstmt.setString(2,"fname1");
    cstmt.setString(3,"fnote1");
    //执行
    cstmt.executeUpdate();
    //获取记录集
    ResultSet rs = cstmt.executeQuery();
    while(rs.next())
    {
    out.println(rs.getString("fname"));
    }
      

  7.   

    JAVA 中用CallableStatement即可调用存储过程,
    对照帮助就可以用。
      

  8.   

    用DBEXPRESS中的存储过程就可以了,可以调用FUNCTION,PRO,PACKAGE