2016-07-19 7 views
0
aufgerufen wird

Unten ist meine Stored-Prozedur, die beim Aufruf aus dem SQL-Editor funktioniert. Beim Aufruf von Code funktioniert jedoch nur die erste Anweisung (truncate). Der Einsatz funktioniert nicht. Kann mir bitte jemand helfen. Danke im Voraus.Oracle Insert-Abfrage in Stored Procedure funktioniert nicht, wenn von Code hinter

SP:

create or replace PROCEDURE GETALARMLIST 
(
pEqCode    ESPC_O_ALARM_DATA.EQCODE%TYPE, 
pOccMinTime   ESPC_O_ALARM_DATA.OCCTIME%TYPE, 
pOccMaxTime   ESPC_O_ALARM_DATA.OCCTIME%TYPE, 
displayparam   OUT SYS_REFCURSOR 
) 

AS 
BEGIN 
EXECUTE IMMEDIATE 'TRUNCATE TABLE tempalarmlist'; 

INSERT INTO tempalarmlist(OCCDATE,FIRSTOCCTIME,COUNT) 
SELECT substr(a.OCCTIME, 1, 4) || '/' || substr(a.OCCTIME, 5, 2) || '/' || substr(a.OCCTIME, 7, 2),min(OCCTIME), count(*) 
FROM ESPC_O_ALARM_DATA a WHERE EQCODE = pEqCode AND a.OCCTIME > pOccMinTime AND a.OCCTIME < pOccMaxTime 
GROUP BY substr(a.OCCTIME, 1, 4) || '/' || substr(a.OCCTIME, 5, 2) || '/' || substr(a.OCCTIME, 7, 2) 
ORDER BY substr(a.OCCTIME, 1, 4) || '/' || substr(a.OCCTIME, 5, 2) || '/' || substr(a.OCCTIME, 7, 2); 


UPDATE tempalarmlist 
SET 
ALMID=(select ALMID from ESPC_O_ALARM_DATA where ESPC_O_ALARM_DATA.OCCTIME = tempalarmlist.FIRSTOCCTIME and ESPC_O_ALARM_DATA.EQCODE = pEqCode), 
ALMCODE =(select ALMCODE from ESPC_O_ALARM_DATA where ESPC_O_ALARM_DATA.OCCTIME = tempalarmlist.FIRSTOCCTIME and ESPC_O_ALARM_DATA.EQCODE = pEqCode), 
ALMTXT= (select ALMTXT from ESPC_O_ALARM_DATA where ESPC_O_ALARM_DATA.OCCTIME = tempalarmlist.FIRSTOCCTIME and ESPC_O_ALARM_DATA.EQCODE = pEqCode); 


OPEN displayparam FOR SELECT * FROM tempalarmlist; 

END GETALARMLIST; 

Code:

public static DataTable GetAlarmList(string datasource, string eqCode, string OccMinTime, string OccMaxTime){ 
      OracleConnection objConn = new OracleConnection(); 
      objConn.ConnectionString = System.Configuration.ConfigurationManager.AppSettings[datasource]; 

      OracleCommand objCmd = new OracleCommand(); 
      objCmd.Connection = objConn; 
      objCmd.CommandType = CommandType.StoredProcedure; 
      objCmd.CommandText = "GETALARMLIST"; 

      objCmd.Parameters.Add("pEqCode", eqCode); 
      objCmd.Parameters.Add("pOccMinTime", OccMinTime); 
      objCmd.Parameters.Add("pOccMaxTime", OccMaxTime); 
      objCmd.Parameters.Add("displayparam", OracleType.Cursor).Direction = ParameterDirection.Output; 

      DataTable dtAlarmList = new DataTable(); 
      try 
      { 
       objConn.Open(); 
       OracleDataAdapter oda = new OracleDataAdapter(objCmd); 
       oda.Fill(dtAlarmList); 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

      finally 
      { 
       objConn.Close(); 
      } 
      return dtAlarmList; 
     } 
+0

"Funktioniert nicht" ist nicht genug Informationen, um Ihre Frage zu beantworten. Wenn beim Ausführen ein Fehler auftritt, geben Sie bitte an, was es ist. –

+0

Hallo Peter, ich bekomme keinen Fehler. Der SP führt die INSERT-Anweisung nicht aus. –

+0

Gibt es etwas, was ich ändern sollte? Bitte schlage vor, da ich ein Neuling für Oracle bin. –

Antwort

1

Weder dein gespeicherte Prozedur noch Ihren Code COMMIT Betrieb enthalten, so dass Ihre Einfügung gerade rollt zurück (Abschneiden Tabelle nicht rückgängig gemacht werden kann, so dass Sie sehen seine Wirkung sowieso). Es sieht so aus, als hätte Ihr SQL-Editor die Autocommit-Option aktiviert, aber die Verbindungsparameter Ihres Programms nicht. Also, haben Sie mehrere Möglichkeiten:

  1. explizite COMMIT in Ihre gespeicherte Prozedur
  2. Anruf objConn.commit() nach Ihrer Anfrage ausführt.
  3. Setzen Sie die Option autocommit auf Ihre Verbindung (siehe Details here).
+0

Ja. Das Hinzufügen der COMMIT-Anweisung hat mein Problem gelöst. Vielen Dank! –

+0

Ich bin froh, dass es dir geholfen hat. Sie können die Antwort als korrekt für andere Personen markieren, um zu wissen, dass sie sich darauf verlassen können. –