Showing posts with label oracle. Show all posts
Showing posts with label oracle. Show all posts

Howto: Affected Rows in Sql-Server and Oracle?

How to get the affected rows (processed rows) from an update Query?

IMMEDIATLY after statement
In Oracle use: SQL%ROWCOUNT
In SQL Server use: @@RowCount


When doing Synchronization of tables this is very useful!!!


Synchronization PseudoCode

       INSERT INTO xxx VALUES SELECT FROM yyy
       EXCEPTION
       WHEN OTHERS
          UPDATE xxx SELECT FROM yyy
Bad Example - catch Exceptions, do something on Exception that is expected (and happens very often)
       CREATE OR REPLACE
       PROCEDURE sample IS
          v_rows_processed integer := 0;
       BEGIN
           UPDATE sample
              SET testno = 1;
              WHERE test   = 'PL/SQL';
           v_rows_processed := SQL%ROWCOUNT;
           IF v_rows_processed := 0
           THEN
               /* Insert Statement */
           END IF;
        END sample;.
Good example - Use processed rowcount in that synch case



thx to my co-worker PK. ps: In Sql-Server @@RowCount works even with SET NOCOUNT OFF. SET NOCOUNT ON says that SQl-Server should print the messages: "rows affected" and "rows returned"

odp.net 1. Schritte und Fazit

#1
mit Enterprise Library 3 funzt odp.net nicht

wird nicht unterstützt
es fehlt di Oracle.DataAccess.Client.OracleClientFactory
ist erst in oracle client 11 drinnen

tried to install dll in GAC mit gacutil
but wrong version of Oracle.DataAccess.dll
when i open my .dll in reflector then i cant see a OracleClientFactory.
there is no Oracle.DataAccess.Client.OracleClientFactory in Oracle.DataAccess, Version=1.102.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342



#2
Default Werte von Storeds werden nicht unterstützt
like:
PNUM_FROM_INDEX NUMBER := NULL,
PNUM_TO_INDEX NUMBER := NULL,
wenn Parameter weggelassen werden kommt 06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to wenn Parameter dazu und .Value nicht gesetzt -> wert = null in db auch mit oracle 10g dbms funzt nicht!

Solution Param must be added to command, but it will not have db's default value in the next case: PNUM_TO_INDEX NUMBER := 100,

#3 beim aufruf im DAO ist die gleiche reihenfolge der params wie in plsql-signatur einzuhalten
auch mit oracle 10g

#4
Parameter weglassen mit Oracle10g
Test auf oracle 10G funzt auch nicht
{"ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'SPC_RA_PG_TESTDATA'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored"}
und wenn Parameter übergeben und .Value nicht setzen auch nicht!

#5
DateTime.MaxValue
Probleme mit Select, Insert OK
Fehler wenn dieses wieder geholt werden will (Select)

-----------------------------------------
was ändert sich?
in plsql
- kein TO_CLOB von xmltype
- XMLTYPE ist XMLTYPE und nicht CLOB
- reihenfolge der parameter


in DAO
getten von Out Parameter
// HACK: BEFORE: recordCount = Convert.ToInt64(countParam.Value);
recordCount = (long)((Oracle.DataAccess.Types.OracleDecimal)(countParam.Value)).Value;

Enterprise Library problem behoben mit:


using (Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connectionString))
{
command.Connection = conn;
//Siag.DataAccess.Configuration.ConnectionProcessorConfigurationSection.Open(conn as System.Data.Common.DbConnection);
conn.Open();
Lesen (SELECT) von BLOB CLOB und XMLTYPE
immer über Storeds

resultItem.SetLargedatablobWithoutStatusChange(reader.IsDBNull(indexLargedatablob) ? null : (byte[])reader.GetOracleBlob(indexLargedatablob).Value);
resultItem.SetLargedateclobWithoutStatusChange(reader.IsDBNull(indexLargedateclob) ? null : reader.GetOracleClob(indexLargedateclob).Value);
resultItem.SetXmlcontentWithoutStatusChange(reader.IsDBNull(indexXmlcontent) ? null : reader.GetOracleXmlType(indexXmlcontent).GetXmlDocument());
Schreiben

param = new Oracle.DataAccess.Client.OracleParameter("PXML_PGTD_XMLCONTENT", Oracle.DataAccess.Client.OracleDbType.XmlType); if (toPersist.Xmlcontent != null) { param.Value = toPersist.Xmlcontent.InnerXml; } command.Parameters.Add(param);


Mapping zwischen Oracle Datatype - .net Datatype - .net reader Get Method http://download.oracle.com/docs/html/B10961_01/features.htm

Oracle Native Datatype
CLOB - Character data can store up to 4 gigabytes (4 GB).
BLOB - Unstructured binary data can store up to 4 gigabytes.


 

Unable to load DLL oramts.dll - Oracle DB with Transcations

To use the Oracle Client with Transactions (TransactionScope) you must install: Oracle Services For MTS Client.Net_9207\Disk1 Start SETUP -> Oracle Services For MTS ... MTS = Microsoft Transaction Server Then you can use code like this with Oracle DBMS

using(System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
{
    finally
   {
          if (conn != null)
          {
              conn.Close();
          }
   }
   scope.Complete();
}

Call a Oracle function in .net c# with the Enterprise Library Application Block

we got the following function: fnc_get_package_version in the package: PCK_MY_APPLICATION

here is the code to call that function from c# with the Enterprise Library Application Block.

string returnValue = "";
 Database database = this.GetDatabase();

 DbCommand dbCommand = 
    database.GetStoredProcCommand("PCK_MY_APPLICATION.fnc_get_package_version");

 OracleParameter returnParam = new OracleParameter("return", OracleType.VarChar);
 returnParam.Size = 10;
 returnParam.Direction = ParameterDirection.ReturnValue;
 dbCommand.Parameters.Add(returnParam);

 int affected = database.ExecuteNonQuery(dbCommand);
 Debug.WriteLine(
   "affected rows: " + affected + "   returnParam.Value: " + returnParam.Value);

 returnValue = returnParam.Value.ToString();
 dbCommand.Dispose();

 return returnValue;

Info Oracle Euro € Symbol Character Set

select * from NLS_DATABASE_PARAMETERS
where Parameter = 'NLS_CHARACTERSET'

WE8ISO8859P1

(is the Western European 8-bit ISO 8859 Part 1 character set)

dies sagt aus:WE = Western Europa
8Bit für Speicherung von 1 Zeichen
dess hoasst: VARCHAR2(30) -> man konn a 30 Zeichen speichern



ISO 8859-1 =
Western European (Albanian, Basque, Breton, Catalan, Danish, Dutch, English, Faeroese, Finnish, French, German, Greenlandic, Icelandic, Irish Gaelic, Italian, Latin, Luxemburgish, Norwegian, Portuguese, Rhaeto-Romanic, Scottish Gaelic, Spanish, Swedish)


Das Eurozeichen € wird im Zeichensatz WE8ISO8859P15 durch den Wert 164 und im Microsoft Zeichensatz WE8MSWIN1252 durch den Wert 128 repräsentiert.

Oracle ermöglicht das Konvertieren von Zeichen eines Zeichensatzes in Zeichen eines neuen Zeichensatzes. In diesem Fall ergibt sich ein übergeordneter Zeichensatz, der mindestens alle Zeichen des Ausgangszeichensatzes umfasst. Werden Zeichen eingegeben, die nicht im Zeichensatz der Datenbank enthalten sind, akzeptiert Oracle diese zwar, ersetzt sie jedoch durch eine interne Codierung, die in keiner der vorhandenen Zeichensatztabellen zu finden ist.

Der Zeichensatz US7ASCII enthält keine Codes für Zeichen mit Akzenten. Auch das kürzlich eingeführte Eurozeichen € wird von dem in Westeuropa weit verbreiteten Zeichensatz we8iso8859p1 nicht unterstützt.

Pdf mit weiteren Infos

Oracle und primary keys die mit Trigger und Sequence gesetzt werden

Bessere lösung zu Problem mit PrimaryKey in Oracle werden mit Trigger gsetzt.
Selber no net probiert.

 /* retrieve Oracle sequence value as output parameter */

INSERT INTO oratable values(myseq.NEXTVAL, 'bob'); myoutparm := myseq.CURRVAL;

Von MigratingDataAccessCode Seite 4

Oracle Datenbank mit .net und C#

Gutes Tutorial in Italienisch dass den Datenzugriff auf Oracle Datenbanken durchleuchtet. Wobei der Provider von Microsoft und der Provider von Oracle ODP.NET beschrieben und verglichen werden.
Tutorial ADO.NET & Oracle

Client-Server; Master-Detail Tabelle ..... Fill und Update DeadLock

Ich habe folgendes Problem:
 Ich besitze einen Windows-Forms-Client mit meinem DataSet, das ich beim Start der Anwendung mit Daten vom Server fülle.

--------------------
oracleDataAdapterMaster.Fill(datasetTest);
oracleDataAdapterClient.Fill(datasetTest);
--------------------

 Beim Beenden der Applikation speichere ich die gemachten Änderungen wieder zurück in die Datenbank und zwar per:
(Reihenfolge wichtig)
--------------------
oracleDataAdapterMaster.Update(datasetTest);
oracleDataAdapterDetail.Update(datasetTest);
--------------------

 Nur funktioniert das natürlich nicht wenn ein MasterDatensatz mit samt seinen Details gelöscht wurde.
Denn zuerst will der DataAdapter die MasterTabelle schreiben (delete, update,insert), aber es existieren noch DetailDatensätze in der DetailTabelle.

Denn in der DB wurde eine Beziehung mit referent. Integrität definiert und wir wollen kein

ON DELETE CASCADE

  Lösung: (von Stephan Kerbei)

Die Lösung könnte sein, das DataSet zu splitten. Z.B.so:
 --------------------

// macht ein neues DS, in dem nur die "neuen" Rows aus dem alten DS stehen.

DataSet Dummy = grossesDataSet.GetChanges(DataRowState.Added);
 myAdapter.Update(Dummy);
 // macht ein neues DS, in dem nur die gelöschten Rows aus dem alten DS stehen.
Dummy = grossesDataSet.GetChanges(DataRowState.Deleted); 
myAdapter.Update(Dummy);

--------------------
 Persönliche Meinung (Stephan Kerbei):
  Der DataAdapter ist prima, wenn man "mal eben schnell" was machen will. Für größere, professionelle Anwendungen taugt er nicht. Zum einen ist er sehr langsam, zum anderen gibt es Aufgabenstellungen, die er nicht in den Griff kriegt. Oft ist das Arbeiten mit einem Command-Objekt die bessere Lösung.

Wie übergibt man einen Datum-Parameter an ein Oracle Select Command? UNABHÄNGIG von den Systemeinstellungen

//Select Statement
string dauerSelectCommand = " SELECT SUM(*) FROM myTable WHERE Datum > :PVon" ;

 // neuen OracleCommand instantieren
System.Data.OracleClient.OracleCommand dauerSelect = new System.Data.OracleClient.OracleCommand(dauerSelectCommand, oracleConnection1);

 // WICHTIG!! CultureInfo auf true setzen damit Systemeinstellungen verwendet werde
 // the Boolean specifies whether to use the user-selected culture settings from the system.
System.Globalization.CultureInfo myCIintl = new System.Globalization.CultureInfo( "", true );

 // Datum erzeugen DateTime myDatum = new DateTime( );
myDatum = Convert.ToDateTime(dateTimePickerNullableVon.Value,myCIintl);

 // Parameter dem Command übergeben und dieses dann ausführen
z.B. mit
ExecuteScalar dauerSelect.Parameters.Add( new System.Data.OracleClient.OracleParameter("PVon", myDatum ));

Latest Posts

Popular Posts