在 ColdFusion 中如何使用 in 变量获取 Oracle 存储过程以返回值?

Posted

技术标签:

【中文标题】在 ColdFusion 中如何使用 in 变量获取 Oracle 存储过程以返回值?【英文标题】:How in ColdFusion with in variables get a Oracle stored procedure to return values? 【发布时间】:2011-10-13 00:58:52 【问题描述】:

ORACLE 11g - COLDFUSION 9 - REF CURSOR - 至少有一个变量。

在 ColdFusion 中如何通过 in 变量获取 Oracle 存储过程以返回值?

我们尝试了几件事,如果我们不传入变量,我们可以得到一个存储过程来返回一个结果集,但是当我们传入变量时,我们无法得到它们。

我们知道如何调用 MS SQL。

感谢您的帮助

附:我们听说当前的 Oracle 驱动程序可能无法实现这一点,是否有不同的 Oracle 驱动程序?

根据我在网上阅读的内容,我认为这不仅仅是一个编码问题。我希望我错了。这只是我作为概念证明工作的一个示例,因此我可以开始创建所有这些示例。如果我不使用 ref cusor,我可以让它工作。

执行数据库查询时出错。 [Macromedia][Oracle JDBC 驱动程序]此驱动程序不支持指定的 SQL 类型。

错误发生在 D:\apache\htdocs\test\index.cfm: line 86

84 : 85: 86: 87: 88:

CF 调用过程

<cfstoredproc procedure="BWNGDBADEV.PACK_REFCURSOR.GETALL" datasource="mydatasourcename" returncode="no">
    <cfprocparam type="InOut" cfsqltype="CF_SQL_INTEGER" variable="pPERSONNELID" value="4" null="No">
    <cfprocparam type="Out" cfsqltype="CF_SQL_REFCURSOR" variable="AnyVarName">
    <!--- *** This name ties StoredProc results to the query below *** --->
    <cfprocresult name="myvar">
</cfstoredproc>

Oracle 包

CREATE OR REPLACE
PACKAGE PACK_REFCURSOR
AS
TYPE EMP_TableRows
IS
  REF
  CURSOR
    RETURN BWNGDBADEV.PER_PERSONNEL%ROWTYPE;
PROCEDURE GETALL(
      pPERSONNELID IN OUT BWNGDBADEV.PER_PERSONNEL.PERSONNELID%type,
      OUTTABLE OUT EMP_TableRows);
END PACK_REFCURSOR ;
  /


CREATE OR REPLACE
PACKAGE BODY PACK_REFCURSOR
AS
PROCEDURE GETALL(
      pPERSONNELID IN OUT BWNGDBADEV.PER_PERSONNEL.PERSONNELID%type,
      OUTTABLE OUT EMP_TableRows)
IS
BEGIN 
-- implicit cursor is opened - no close needed ***    
OPEN OUTTABLE FOR 
SELECT * 
FROM BWNGDBADEV.PER_PERSONNEL 
WHERE PERSONNELID = pPERSONNELID;

END GETALL ;

END PACK_REFCURSOR ;
/

【问题讨论】:

您能否展示完整的 SP 或 SP 的一部分?如果那样的话,我可以追踪它。 如果我没记错的话,我认为Oracle不能支持整个结果集。 【参考方案1】:

文档中有一条小说明:“您不能对 Oracle 8 和 9 引用游标使用 cfprocparam 标记。相反,请使用 cfprocresult 标记。”

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7d52.html

尝试以下方法:

<cfstoredproc 
    procedure = "BWNGDBADEV.PACK_REFCURSOR.GETALL" 
    dataSource = "mydatasourcename" 
    returnCode = "Yes"> 

    <!--- cfprocparam tags ---> 
    <cfprocparam type="InOut" cfsqltype="CF_SQL_INTEGER" variable="pPERSONNELID" value="4" null="No">
    <cfprocparam type="Out" cfsqltype="CF_SQL_REFCURSOR" variable="AnyVarName">

    <!--- cfprocresult tags ---> 
    <cfprocresult name="RS1" resultSet="1"> 
    <cfprocresult name="RS2" resultSet="2"> 

</cfstoredproc> 

【讨论】:

【参考方案2】:

您有最新的 DataDirect JDBC 驱动程序吗?

v 3.5 驱动程序和发行说明在这里:http://kb2.adobe.com/cps/000/42dcb10a.html

发行说明表明它可以解决您的确切问题

【讨论】:

以上是关于在 ColdFusion 中如何使用 in 变量获取 Oracle 存储过程以返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ColdFusion 中用 AJAX 替换 iframe

如何在ColdFusion中访问包含特殊字符的变量名称

如何在自定义 ColdFusion 日志文件中获得新行?

div元素到coldfusion变量

Coldfusion 和非作用域变量

何时对 ColdFusion 组件中的变量进行 var 作用域?