【发布时间】:2016-10-06 20:56:53
【问题描述】:
我面临一个非常奇怪的问题,可能是我错过了什么。
这是一个场景,我们有一个使用 Oracle 11G 作为后端数据库的 ASP 应用程序。
我们正在调用一个接受这些参数的存储存储过程。
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:在需要数字的地方发现了一个非数字字符。
下面是 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
【问题讨论】:
-
你是否传入了适合存储过程参数的参数类型?你能粘贴你的构建命令和添加参数等的asp代码吗?
-
您可以使用
adVarchar等常量来代替12(即adVariant)吗?输出参数 10 有什么用?为什么Request.Form ("aid")不用引号括起来? -
@shahkalpesh,我已经用一些发现更新了我的问题。 1.1, 1.2 在场景之前,2.1,2.2 在场景之后。硬编码值被区别对待
标签: oracle asp-classic