【问题标题】:Calling Oracle Stored procedure from VBA ADODB从 VBA ADODB 调用 Oracle 存储过程
【发布时间】:2011-07-21 12:25:24
【问题描述】:


我正在尝试使用 WORD VBA 中的存储过程来检索一些地址,使用存储过程来填充列表字段。

Private Sub txtCpny_AfterUpdate()  
Dim rst As ADODB.Recordset  
Dim cmd As ADODB.Command
Dim param1 As ADODB.Parameter  
Dim param2 As ADODB.Parameter  
Dim strCpny As String  

strCpny = GetSearchString(Me.txtCpny) 'ie %Name%  

Set cmd = CreateObject("ADODB.Command")  

With cmd  
  .ActiveConnection = mcn  
  .CommandText = "LISTPARTNER_NAME"  
  .CommandType = adCmdStoredProc  
  Set param1 = .CreateParameter("RCT1", adInteger, adParamInputOutput, , Null)  
  Set param2 = .CreateParameter("firmaName", adVarChar, adParamInput, 50, strCpny)  
  .Parameters.Append param1    
  .Parameters.Append param2    
  Set rst = .Execute  
End With  

...Using the recordset here  

rst.Close  
Set param1 = Nothing  
Set param2 = Nothing  
Set cmd = Nothing  
End Sub

存储过程如下所示:SQL 应生成包含匹配公司的记录集。

PROCEDURE LISTPARTNER_NAME (  
firmaName    IN   VARCHAR2 DEFAULT NULL,  
RCT1         IN OUT GLOBALPKG.RCT1
)  

AS  
BEGIN  
  OPEN RCT1 FOR  
  SELECT  
  ...  
  FROM  
  ...  
  WHERE  
  KNAG.NAME_ORG LIKE LISTPARTNER_NAME.firmaName  
  ...  
END LISTPARTNER_NAME

当命令执行时 VB 抛出一个 RunTime Error

ORA-06550: Line 1, column 13:  
PLS-00306: wrong number or types of arguments in call to  
'LISTPARTNER_NAME'  
ORA-06550: line 1, column 7:  
PL/SQL: Statement ignored

在我看来,我在参数方面做错了。我一直在尝试各种版本的参数设置,但没有运气
任何线索? 谢谢

【问题讨论】:

  • 看看这个帖子,它可能会有所帮助(发帖链接很乱,所以我把它放在下面的答案中)

标签: vba oracle stored-procedures ms-word adodb


【解决方案1】:

看看这个帖子,它可能会有所帮助 http://forums.oracle.com/forums/thread.jspa?threadID=360922

我唯一可以建议的另一件事是切换参数的顺序(因此它们的顺序相同——我知道 ODP 默认为顺序,但我不确定 ADODB)

【讨论】:

    【解决方案2】:

    我已经在Access中成功使用了这段代码:

    Function runAdo(sql As String, usr As String, pwd As String)
    'by Patrick Honorez - www.idevlop.com  ----- 09-nov-2012
    'Purpose   :  run Oracle proc using ADO connection
    
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Set cn = New ADODB.Connection
        cn.Open GetPersonalizedConnectStringADO(usr, pwd)
        Set rs = New ADODB.Recordset
        rs.Open sql, cn, adOpenStatic, adLockReadOnly
        cn.Close
    End Function
    

    我很少使用 Access 中的 ADO,因为我发现 DAO 更易于使用,但在这种情况下,我必须执行一些需要不同 UID 的 Oracle procs,并创建一个新的 DAO Querydef 指定不同的 UID 和 PWD,但不起作用,可能是因为 Access 保留了连接缓存。
    所以我决定为第二个“用户”使用 ADO,它就像一个魅力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2011-06-01
      • 2017-07-22
      • 2018-07-18
      • 2011-04-25
      • 2015-05-22
      • 2012-01-27
      相关资源
      最近更新 更多