相关应用程序在Coldfusion 11
上hotfix 7
运行,并在连接到Linux
的{{1}}服务器上运行。目标是使应用程序在Windows Oracle database
上运行,这是一个循序渐进的过程(这就是数据库在Linux
上的原因)。
我知道数据库有效,因为它通过Windows server
管理员面板成功连接,而Coldfusion
语句成功返回SQL
:
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#">
返回
SID :(此处为空白)和37
我已经尝试了很多东西,但还没有正确地返回cfthrow
(需要继续用户身份验证)。 sid
标记内的值是上述变量,并且都具有有效值。
有关为什么这不会返回cfprocparam
以及为什么sid
语句将会出现的任何见解? (根据我的研究,我认为它们是一样的。)
感谢您的帮助,我愿意并快速回答任何问题。
答案 0 :(得分:3)
由于我在评论中发布的代码中存在空白区域:
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;
/
在您通过ColdFusion连接的用户的SQL客户端(即SQL开发人员或SQL / Plus)中运行它。
目的是测试数据库:
成功运行查询会告诉您#1-#3没问题,您可以根据您的预期检查#4。
如果有任何不符合预期,那么您知道问题出在数据库端,而不是ColdFusion。
如果它们按预期运行,那么您可以开始查看CF设置以确保您的数据源指向您期望的位置(即它们是否连接到正确的用户)以及数据源是否具有执行过程的权限。
然后,如果这一切都正确,请查看传递给<CFSTOREDPROC>
和<CFPROCPARAM>
标签的变量 - 是预期的数据源和变量。
如果你想要正式化它,那么你可以写单位&amp;集成测试,涵盖您尝试的步骤,下次您想要测试的东西,您只需运行测试套件。