经典 ASP 使用 OraOleadb Driver 调用 Oracle 存储过程
Classic ASP calling Oracle stored procedure with OraOleadb Driver
我遇到了一个很奇怪的问题,可能是我漏掉了什么。
场景如下,我们有一个 ASP 应用程序,它使用 Oracle 11G 作为后端数据库。
我们正在调用接受这些参数的存储存储过程。
PROCEDURE PR_SUMMARY_IN(theAccountId in varchar2,
theAwardId in number,
theDueDate in varchar2,
theSubmittedDate in varchar2,
theReportDescription in varchar2,
theFormId in varchar2,
theReturnCode out number)
AS
v_submitted_date date;
BEGIN
IF theSubmittedDate IS NOT NULL THEN
v_submitted_date := to_date(theSubmittedDate,'MM/DD/YYYY');--error here
ELSE
v_submitted_date := NULL;
END IF;
insert into abc (.....) values (....)
end
参数值如下
'3407840001'
8714898
'05/09/2016'
'05/09/2016'
'Test'
'1'
当我从 SQLPlus 运行 这个过程时,它工作,但是当我从 ASP 代码调用它时,它抛出一个错误
ORA-20502: ORA-01858: a non-numeric character was found where a numeric was expected.
下面是ASP代码截图
due_date = Request.Form("due_date" & i)
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = "'" & due_date & "'"
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = "'" & submitted_date & "'"
END IF
report_description = Request.Form("report_description" & i)
IF Len(report_description) = 0 THEN
theReportDesc = NULL
ELSE
theReportDesc = "'" & Replace(report_description,"'","''") & "'"
END IF
form_id = Request.Form("form_id" & i)
IF Len(form_id) = 0 THEN
theFrmId = NULL
ELSE
theFrmId = "'" & Replace(form_id,"'","''") & "'"
END IF
cmd.CommandType = 4
cmd.CommandText = "deadlines_summary.PR_SUMMARY_IN"
cmd.Parameters.Append cmd.CreateParameter("theAccountId", 12, 1, 100, Request.Form ("aid"))
cmd.Parameters.Append cmd.CreateParameter("theAwardId", adNumeric, 1, 100, award_id)
cmd.Parameters.Append cmd.CreateParameter("theDueDate", 12, 1, 100, theDueDt)
cmd.Parameters.Append cmd.CreateParameter("theSubmittedDate", 12, 1, 100, theSubmittedDt)
cmd.Parameters.Append cmd.CreateParameter("theReportDescription", 12, 1, 100, theReportDesc)
cmd.Parameters.Append cmd.CreateParameter("theFormId", 12, 1, 100, theFrmId)
cmd.Parameters.Append cmd.CreateParameter("theReturnCode", 131, 2, 10)
IF Len(report_description) > 0 THEN
set rs = cmd.execute
END IF
有什么建议吗
出于测试目的,我在 SP 中将局部变量声明为 varchar2,并以 mm/dd/yyyy 格式分配值“12/09/2016”。
低于记录。之前和之后。
如果值是硬编码的,则不使用单引号。想知道怎么做?
CREATED_ON----------MSG--------------------------------------------------------------------------------
05/09/2016 1.1 theDueDate '12/09/2016' tmp_theDueDate 12/09/2016 v_due_date
05/09/2016 1.2 theSubmittedDate '11/09/2016' tmp_theSubmittedDate 11/09/2016 v_submitted_date
05/09/2016 2.1 theSubmittedDate '11/09/2016' tmp_theSubmittedDate 11/09/2016 v_submitted_date 2016-11-09 00:00:00
05/09/2016 2.2 theDueDate '12/09/2016' tmp_theDueDate 12/09/2016 v_due_date 2016-12-09 00:00:00
根据 this page,ADO 不支持参数类型 adVariant
(即 12)。
您应该使用常量以使您的代码更具可读性,例如
Const adUseClient = 3
Const adOpenStatic = 3
Const adCmdText = 1
Const adCmdStoredProc = 4
Const adVarChar = 200
Const adNumeric = 131
Const adChar = 129
Const adBigInt = 20
Const adInteger = 3
Const adParamInput = 1
Const adParamOutput = 2
Const adParamInputOutput = 3
Const adParamReturnValue = 4
cmd.Parameters.Append cmd.CreateParameter("theAccountId", adVarChar, adParamInput, , Request.Form ("aid"))
cmd.Parameters.Append cmd.CreateParameter("theAwardId", adNumeric, adParamInput, , award_id)
cmd.Parameters.Append cmd.CreateParameter("theDueDate", adVarChar, adParamInput, 100, theDueDt)
cmd.Parameters.Append cmd.CreateParameter("theSubmittedDate", adVarChar, adParamInput, 100, theSubmittedDt)
cmd.Parameters.Append cmd.CreateParameter("theReportDescription", adVarChar, adParamInput, 100, theReportDesc)
cmd.Parameters.Append cmd.CreateParameter("theFormId", adVarChar, adParamInput, 100, theFrmId)
cmd.Parameters.Append cmd.CreateParameter("theReturnCode", adNumeric, adParamOutput)
也许试试这个:
cmd.CommandType = adCmdText
cmd.CommandText = "{CALL deadlines_summary.PR_SUMMARY_IN(?,?,?,?,?,?,?)}"
数字参数不需要大小值。
您还应该尝试使用参数类型 adDate
而不是将日期转换为字符串值。
使用绑定参数时必须删除引号,即使用 theSubmittedDt = submitted_date
而不是 theSubmittedDt = "'" & submitted_date & "'"
。
我们开始吧。我是如何通过更改下面的代码
来制作上面的代码 运行
来自
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = "'" & due_date & "'"
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = "'" & submitted_date & "'"
END IF
到
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = due_date
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = submitted_date
END IF
发送不带引号的参数值并且有效。需要找到根本原因和这种奇怪的行为。谢谢大家的建议。
我遇到了一个很奇怪的问题,可能是我漏掉了什么。
场景如下,我们有一个 ASP 应用程序,它使用 Oracle 11G 作为后端数据库。
我们正在调用接受这些参数的存储存储过程。
PROCEDURE PR_SUMMARY_IN(theAccountId in varchar2,
theAwardId in number,
theDueDate in varchar2,
theSubmittedDate in varchar2,
theReportDescription in varchar2,
theFormId in varchar2,
theReturnCode out number)
AS
v_submitted_date date;
BEGIN
IF theSubmittedDate IS NOT NULL THEN
v_submitted_date := to_date(theSubmittedDate,'MM/DD/YYYY');--error here
ELSE
v_submitted_date := NULL;
END IF;
insert into abc (.....) values (....)
end
参数值如下
'3407840001'
8714898
'05/09/2016'
'05/09/2016'
'Test'
'1'
当我从 SQLPlus 运行 这个过程时,它工作,但是当我从 ASP 代码调用它时,它抛出一个错误
ORA-20502: ORA-01858: a non-numeric character was found where a numeric was expected.
下面是ASP代码截图
due_date = Request.Form("due_date" & i)
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = "'" & due_date & "'"
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = "'" & submitted_date & "'"
END IF
report_description = Request.Form("report_description" & i)
IF Len(report_description) = 0 THEN
theReportDesc = NULL
ELSE
theReportDesc = "'" & Replace(report_description,"'","''") & "'"
END IF
form_id = Request.Form("form_id" & i)
IF Len(form_id) = 0 THEN
theFrmId = NULL
ELSE
theFrmId = "'" & Replace(form_id,"'","''") & "'"
END IF
cmd.CommandType = 4
cmd.CommandText = "deadlines_summary.PR_SUMMARY_IN"
cmd.Parameters.Append cmd.CreateParameter("theAccountId", 12, 1, 100, Request.Form ("aid"))
cmd.Parameters.Append cmd.CreateParameter("theAwardId", adNumeric, 1, 100, award_id)
cmd.Parameters.Append cmd.CreateParameter("theDueDate", 12, 1, 100, theDueDt)
cmd.Parameters.Append cmd.CreateParameter("theSubmittedDate", 12, 1, 100, theSubmittedDt)
cmd.Parameters.Append cmd.CreateParameter("theReportDescription", 12, 1, 100, theReportDesc)
cmd.Parameters.Append cmd.CreateParameter("theFormId", 12, 1, 100, theFrmId)
cmd.Parameters.Append cmd.CreateParameter("theReturnCode", 131, 2, 10)
IF Len(report_description) > 0 THEN
set rs = cmd.execute
END IF
有什么建议吗
出于测试目的,我在 SP 中将局部变量声明为 varchar2,并以 mm/dd/yyyy 格式分配值“12/09/2016”。
低于记录。之前和之后。
如果值是硬编码的,则不使用单引号。想知道怎么做?
CREATED_ON----------MSG--------------------------------------------------------------------------------
05/09/2016 1.1 theDueDate '12/09/2016' tmp_theDueDate 12/09/2016 v_due_date
05/09/2016 1.2 theSubmittedDate '11/09/2016' tmp_theSubmittedDate 11/09/2016 v_submitted_date
05/09/2016 2.1 theSubmittedDate '11/09/2016' tmp_theSubmittedDate 11/09/2016 v_submitted_date 2016-11-09 00:00:00
05/09/2016 2.2 theDueDate '12/09/2016' tmp_theDueDate 12/09/2016 v_due_date 2016-12-09 00:00:00
根据 this page,ADO 不支持参数类型 adVariant
(即 12)。
您应该使用常量以使您的代码更具可读性,例如
Const adUseClient = 3
Const adOpenStatic = 3
Const adCmdText = 1
Const adCmdStoredProc = 4
Const adVarChar = 200
Const adNumeric = 131
Const adChar = 129
Const adBigInt = 20
Const adInteger = 3
Const adParamInput = 1
Const adParamOutput = 2
Const adParamInputOutput = 3
Const adParamReturnValue = 4
cmd.Parameters.Append cmd.CreateParameter("theAccountId", adVarChar, adParamInput, , Request.Form ("aid"))
cmd.Parameters.Append cmd.CreateParameter("theAwardId", adNumeric, adParamInput, , award_id)
cmd.Parameters.Append cmd.CreateParameter("theDueDate", adVarChar, adParamInput, 100, theDueDt)
cmd.Parameters.Append cmd.CreateParameter("theSubmittedDate", adVarChar, adParamInput, 100, theSubmittedDt)
cmd.Parameters.Append cmd.CreateParameter("theReportDescription", adVarChar, adParamInput, 100, theReportDesc)
cmd.Parameters.Append cmd.CreateParameter("theFormId", adVarChar, adParamInput, 100, theFrmId)
cmd.Parameters.Append cmd.CreateParameter("theReturnCode", adNumeric, adParamOutput)
也许试试这个:
cmd.CommandType = adCmdText
cmd.CommandText = "{CALL deadlines_summary.PR_SUMMARY_IN(?,?,?,?,?,?,?)}"
数字参数不需要大小值。
您还应该尝试使用参数类型 adDate
而不是将日期转换为字符串值。
使用绑定参数时必须删除引号,即使用 theSubmittedDt = submitted_date
而不是 theSubmittedDt = "'" & submitted_date & "'"
。
我们开始吧。我是如何通过更改下面的代码
来制作上面的代码 运行来自
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = "'" & due_date & "'"
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = "'" & submitted_date & "'"
END IF
到
IF Len(due_date) = 0 THEN
theDueDt = NULL
ELSE
theDueDt = due_date
END IF
submitted_date = Request.Form("submitted_date" & i)
IF Len(submitted_date) = 0 THEN
theSubmittedDt = NULL
ELSE
theSubmittedDt = submitted_date
END IF
发送不带引号的参数值并且有效。需要找到根本原因和这种奇怪的行为。谢谢大家的建议。