连接到 oracle 数据库的 cfprocparam 未返回 sid

sid not returned by cfprocparam that is connected to oracle database

有问题的应用程序 运行s 在 Coldfusion 11 上与 hotfix 7 和 运行ning 在连接到 [=15] 的 Linux 服务器上=].目标是在 Linux 上创建应用程序 运行,这是一个循序渐进的过程(这就是数据库在 Windows server 上的原因)。

我知道数据库可以正常工作,因为它通过 Coldfusion 管理员面板成功连接并且此 SQL 语句 returns 和 user_id 成功:

<cfquery name="qUser" datasource="#Application.datasource#">
    SELECT td_user_id
        FROM td_user
        WHERE ROWNUM <= 1
</cfquery>

有问题的代码是这样的:

<cfstoredproc procedure="td_session_pkg.new_session" datasource="#application.datasource#">
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#arguments.username#">
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#arguments.password#">
    <cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="#cgi.remote_addr#">
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#rand_int#">
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#application.app_id#">
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="1">
    <cfprocparam type="In" cfsqltype="CF_SQL_INTEGER" value="#pwdRequired#">
    <cfprocparam type="Out" cfsqltype="CF_SQL_CHAR" variable="sid">
</cfstoredproc>

<!--- Test --->
<cfquery name="testS" datasource="#Application.datasource#">
        SELECT
            sys_context('USERENV','SID') AS theSid
            FROM dual
</cfquery>
<cfthrow message="SID: #sid# and #testS.theSid#">

cfthrow return

SID: (blank here) and 37

我已经尝试了很多东西,但还没有正确 return sid(需要继续用户身份验证)。 cfprocparam 标签内的值是上述变量,并且都具有有效值。

关于为什么这不会 return sid 以及为什么 SQL 语句会的任何见解? (根据我的研究,我认为它们是同一回事)。

感谢您的帮助,我会尽快回答任何问题。

由于我在评论中发布的代码有白色-space 损坏:

SET SERVEROUTPUT ON;

DECLARE
  sid VARCHAR2(20);
BEGIN
  td_session_pkg.new_session(
    'username',
    'password',
    'remote_addr',
    0,
    0,
    1,
    0,
    sid
  );
  DBMS_OUTPUT.PUT_LINE( 'SID' || sid );
END;
/

运行 在 SQL 客户端(即 SQL 开发人员或 SQL/Plus)中,来自您将通过 ColdFusion 连接的用户。

目的是测试数据库:

  1. 有程序。
  2. 数据库用户可以访问它。
  3. 数据库中的过程 运行s。
  4. 程序给出了预期的结果。

运行查询成功会告诉您#1-#3 没问题,您可以根据您的预期检查#4。

如果有任何不符合预期,那么您就知道问题出在数据库端,而不是在 ColdFusion 中。

如果它们 运行 符合预期,那么您可以开始查看 CF 设置以确保您的数据源指向您期望的位置(即它们是否连接到正确的用户)并且数据源有权执行程序。

然后,如果一切正确,请查看您传递到 <CFSTOREDPROC><CFPROCPARAM> 标记中的变量 - 是否是预期的数据源和变量。

如果您想在进行时将其形式化,那么您可以编写单元和集成测试,其中涵盖您尝试的步骤,下次您想要测试的时候,您只需 运行 测试套件。