In großen Datenbanksystemen spielen gespeicherte Prozeduren und Trigger eine wichtige Rolle. Unabhängig davon, ob es sich um eine gespeicherte Prozedur oder einen Trigger handelt, handelt es sich um eine Sammlung von SQL-Anweisungen und Flusskontrollanweisungen.
ORACLE-Code
CREATE OR REPLACE PROCEDURE gd_CURSOR(MYCS1 OUT SYS_REFCURSOR,MYCS2 OUT SYS_REFCURSOR,a out varchar)as BEGIN a:='test'; OPEN MYCS1 FOR SELECT 1 from dual; OPEN MYCS2 FOR SELECT 2 from dual; END;
C#-Code
/// <summary> /// 执行oracle存储过程返回多个结果集 /// </summary> /// <param name="strProcName">存储过程名称</param> /// <param name="ResultCount">返回个数</param> /// <param name="paras">参数</param> /// <returns>任意对象数组</returns> public object[] ExcuteProc_N_Result(string strProcName, int ResultCount, params OracleParameter[] paras) { using (OracleConnection conn = new OracleConnection("User ID=用户名;Password=密码;Data Source=数据库;")) { OracleCommand cmd = new OracleCommand(strProcName, conn); if (paras != null && paras.Length > 0) { for (int j = 0; j < paras.Length; j++) { if (paras[j].Value == null) { paras[j].Value = DBNull.Value; } } } cmd.Parameters.AddRange(paras); cmd.CommandType = CommandType.StoredProcedure; conn.Open(); cmd.ExecuteNonQuery(); int i = 0; //int nOutputParametersCount = 0; object[] objResult = new object[ResultCount]; foreach (OracleParameter p in cmd.Parameters) { if (p.Direction == ParameterDirection.Output || p.Direction == ParameterDirection.InputOutput) { if (p.Value is OracleDataReader) { OracleDataReader reader = p.Value as OracleDataReader; objResult[i++] = ConvertDataReaderToDataTable(reader); } else { objResult[i++] = p.Value; } } } return objResult; } } /// <summary> /// 将DataReader 转为 DataTable /// </summary> /// <param name="DataReader">OleDbDataReader</param> protected DataTable ConvertDataReaderToDataTable(OracleDataReader reader) { DataTable objDataTable = new DataTable("TmpDataTable"); try { int intFieldCount = reader.FieldCount;//获取当前行中的列数; for (int intCounter = 0; intCounter <= intFieldCount - 1; intCounter++) { objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter)); } //populate datatable objDataTable.BeginLoadData(); //object[] objValues = new object[intFieldCount -1]; object[] objValues = new object[intFieldCount]; while (reader.Read()) { reader.GetValues(objValues); objDataTable.LoadDataRow(objValues, true); } reader.Close(); objDataTable.EndLoadData(); return objDataTable; } catch (Exception ex) { throw new Exception("转换出错出错!", ex); } }
Aufrufmethode
OracleParameter[] oracleParameter = new OracleParameter[]{ new OracleParameter("MYCS1",OracleType.Cursor), new OracleParameter("MYCS2",OracleType.Cursor), new OracleParameter("a",OracleType.VarChar,200), }; oracleParameter[0].Direction = ParameterDirection.Output; oracleParameter[1].Direction = ParameterDirection.Output; oracleParameter[2].Direction = ParameterDirection.Output; object[] xxx = ExcuteProc_N_Result("gd_CURSOR", 3, oracleParameter);
Der obige Inhalt stellt die gespeicherten Oracle-Prozeduren in asp.net durch Code vor.
Als nächstes werde ich Ihnen die gespeicherte Oracle-Prozedur (Bild und Text) anhand der zweiten Methode vorstellen.
Bitte beachten Sie die folgenden Methoden und Schritte
Schritt 1: Konfigurieren Sie die Datenbank, die über den mit ORACLE gelieferten Net Manager verbunden werden muss, z. B. COST
Schritt 2: Öffnen Sie das PL/SQL-Datenbanktool, geben Sie den richtigen Benutzernamen und das richtige Passwort ein und klicken Sie auf OK, um den Benutzer einzugeben, der die gespeicherte Prozedur erstellen muss
Schritt 3: Verstehen Sie das Format allgemeiner gespeicherter Prozeduren
Erstellen oder ersetzen Sie den gespeicherten Prozedurnamen der Prozedur (Param1-Eingangstyp, Param2-Ausgangstyp)
als
Variablentyp 1 (Wertebereich);
Variablentyp 2 (Wertebereich);
Beginnen
Anweisungsblock
Ausnahme – Ausnahmebehandlung
Wenn andere dann
Rollback;
Ende;
Schritt 4: Geben Sie die zu erstellende gespeicherte Prozedur in die SQL-Eingabeschnittstelle ein
create or replace procedure sp_demo(param1 in varchar2,param2 out varchar2) /* * 存储过程实例 */ as cnt int; rst varchar2(100) Begin Select count(*) into cst from Tab_Demo where Col_Value = param1; If (cst > 0) then --判断条件 param2 := '有匹配的值'; Else param2 := '无匹配的值'; End if; Exception When others then Rollback; End;
Wie unten gezeigt
Schritt 5: Testen Sie die gerade geschriebene gespeicherte Prozedur
exec sp_demo('male');
ENDE
Notizen
Sie können eine gespeicherte Prozedur nicht innerhalb einer anderen gespeicherten Prozedur löschen, Sie können nur eine andere gespeicherte Prozedur aufrufen
Wenn Sie die Prozedur „Erstellen“ oder „Ersetzen“ verwenden, achten Sie beim Erstellen der gespeicherten Prozedur darauf, dass sie nicht denselben Namen wie die vorhandene gespeicherte Prozedur unter dem Benutzer hat, da sonst die aktuelle gespeicherte Prozedur überschrieben wird
Gespeicherte Prozedurparameter haben keinen Wertebereich, in bedeutet eingehend, out bedeutet Ausgabe
Das Obige stellt die gespeicherten Oracle-Prozeduren auf zwei Arten vor. Ich hoffe, dass es für alle hilfreich ist.