连接到 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
标签内的值是上述变量,并且都具有有效值。
- Coldfusion 变量不区分大小写,如 Adobe 所述
关于为什么这不会 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 连接的用户。
目的是测试数据库:
- 有程序。
- 数据库用户可以访问它。
- 数据库中的过程 运行s。
- 程序给出了预期的结果。
运行查询成功会告诉您#1-#3 没问题,您可以根据您的预期检查#4。
如果有任何不符合预期,那么您就知道问题出在数据库端,而不是在 ColdFusion 中。
如果它们 运行 符合预期,那么您可以开始查看 CF 设置以确保您的数据源指向您期望的位置(即它们是否连接到正确的用户)并且数据源有权执行程序。
然后,如果一切正确,请查看您传递到 <CFSTOREDPROC>
和 <CFPROCPARAM>
标记中的变量 - 是否是预期的数据源和变量。
如果您想在进行时将其形式化,那么您可以编写单元和集成测试,其中涵盖您尝试的步骤,下次您想要测试的时候,您只需 运行 测试套件。
有问题的应用程序 运行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
标签内的值是上述变量,并且都具有有效值。
- Coldfusion 变量不区分大小写,如 Adobe 所述
关于为什么这不会 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 连接的用户。
目的是测试数据库:
- 有程序。
- 数据库用户可以访问它。
- 数据库中的过程 运行s。
- 程序给出了预期的结果。
运行查询成功会告诉您#1-#3 没问题,您可以根据您的预期检查#4。
如果有任何不符合预期,那么您就知道问题出在数据库端,而不是在 ColdFusion 中。
如果它们 运行 符合预期,那么您可以开始查看 CF 设置以确保您的数据源指向您期望的位置(即它们是否连接到正确的用户)并且数据源有权执行程序。
然后,如果一切正确,请查看您传递到 <CFSTOREDPROC>
和 <CFPROCPARAM>
标记中的变量 - 是否是预期的数据源和变量。
如果您想在进行时将其形式化,那么您可以编写单元和集成测试,其中涵盖您尝试的步骤,下次您想要测试的时候,您只需 运行 测试套件。