2016-05-09 6 views
1

Ich bin mit einem sehr seltsamen Problem konfrontiert möglicherweise habe ich etwas verpasst.Classic ASP Aufruf von Oracle gespeicherte Prozedur mit OraOleadb Treiber

Hier ist das Szenario, wir haben eine ASP-Anwendung, die Oracle 11G als Backend-Datenbank verwendet.

Wir rufen eine gespeicherte Prozedur auf, die diese Parameter akzeptiert.

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 

und die Parameterwerte wie unten

'3407840001' 
8714898 
'05/09/2016' 
'05/09/2016' 
'Test' 
'1' 

Wenn ich diese Prozedur SQLPlus leite, es funktioniert, aber wenn ich es von ASP-Code nenne, es wirft einen Fehler

ORA-20502: ORA-01858: Ein nichtnumerisches Zeichen wurde gefunden, wenn ein numerischer Wert erwartet wurde.

Im Folgenden finden Sie ASP-Code Snapshot

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 

Irgendwelche Vorschläge

Für Testzwecke bitte ich lokale Variable als varchar2 in SP und zugewiesenen Wert '12/09/2016' in mm erklärt haben/TT/JJJJ-Format.

und bekam unter log. Vorher und nachher.

Wenn Wert hart codiert, behandelt es ohne Anführungszeichen. Wie fragst du dich?

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 
+1

Übergeben Sie den Parametertyp, der den Parametern der gespeicherten Prozedur entspricht? Können Sie Ihren ASP-Code einfügen, der einen Befehl erstellt und Parameter hinzufügt und so weiter? – shahkalpesh

+1

Könnten Sie Konstanten wie 'adVarchar' anstelle von 12 verwenden (was' adVariant' ist)? Was nützt 10 für Ausgangsparameter? Warum ist 'Request.Form (" aid ") nicht in Anführungszeichen gesetzt? – shahkalpesh

+0

@shahkalpesh, ich habe meine Frage mit einigen gefunden aktualisiert. 1.1, 1.2 ist vor dem Szenario und 2.1.2.2 ist nach dem Szenario. Hardcoded Wert anders behandelt – Prathyush

Antwort

2

Gemäße this page, Parameterart adVariant (d 12) nicht durch ADO unterstützt.

Sie sollten Konstanten verwenden, um Ihren Code lesbarer zu machen, z.

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) 

Vielleicht versuchen diese:

cmd.CommandType = adCmdText 
cmd.CommandText = "{CALL deadlines_summary.PR_SUMMARY_IN(?,?,?,?,?,?,?)}" 

Numerische Parameter benötigen keine Größenwert.

Sie sollten auch versuchen, den Parametertyp adDate zu verwenden, anstatt die Daten in Zeichenfolgenwerte zu konvertieren.

Sie müssen die Anführungszeichen entfernen, wenn Sie bind Parameter verwenden, d. H. Einfach theSubmittedDt = submitted_date anstelle von theSubmittedDt = "'" & submitted_date & "'" verwenden.

+0

gleichen Fehler mit dem obigen Code. – Prathyush

+0

Siehe meine aktualisierte Antwort –

+0

Entschuldigung, ich konnte Ihren Beitrag nicht sehen und geantwortet haben. Aber wie auch immer, ich werde deinen Post theSubmittedDt = submitted_date statt theSubmittedDt = "'" & submission_date & "'" als Antwort markieren. Danke vielmals. Aber kannst du mir warum dieses Verhalten wenn möglich sagen. – Prathyush

-1

Also hier gehen wir. Einige, wie ich es geschafft, über Code zu machen läuft von unten Code ändern

VON

 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 

TO

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 

Senden Parameterwert ohne Anführungszeichen und arbeitet. Brauchen Sie die Ursache und dieses seltsame Verhalten. Danke für Vorschläge Jungs.