经典ASP使用OraOleadb Driver调用Oracle存储过程

时间:2016-05-09 12:50:54

标签: oracle asp-classic

我面临一个非常奇怪的问题,可能是我错过了什么。

这是一个场景,我们有一个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:找到了数字所在的非数字字符。

下面是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

2 个答案:

答案 0 :(得分:2)

根据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,而不是将日期转换为字符串值。

使用bind参数时必须删除引号,即只使用theSubmittedDt = submitted_date代替theSubmittedDt = "'" & submitted_date & "'"

答案 1 :(得分:-1)

所以我们走了。一些我如何通过更改下面的代码

设法使上面的代码运行

       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

发送没有引用的参数值并且有效。需要得到根本原因和这种奇怪的行为。感谢您的建议。