【问题标题】:Classic ASP calling Oracle stored procedure with OraOleadb Driver使用 OraOleadb 驱动程序调用 Oracle 存储过程的经典 ASP
【发布时间】: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


【解决方案1】:

根据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 & "'"

【讨论】:

  • 对不起,我没有看到你的帖子并回复了。但无论如何,我都会将您的帖子 theSubmittedDt = submit_date 而不是 theSubmittedDt = "'" & submit_date & "'" 标记为答案。非常感谢。但是如果可能的话,你能告诉我为什么会出现这种行为吗?
  • 这是绑定参数的主要目的(即cmd.Parameters.Append cmd.CreateParameter...),你不必关心任何引用机制。
【解决方案2】:

所以我们开始吧。我如何通过更改下面的代码来运行上面的代码

来自

       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

发送不带引号的参数值并且有效。需要找到根本原因和这种奇怪的行为。谢谢大家的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多