Arşiv

Posts Tagged ‘database’

pl/sql de identity kullanımı


Merhabaora2

Oracle database 12c ile gelen yeni özellik olan identity özelliğini inceleyelim. Bu yeni gelen özellik ile artık bir tablo içinde kullandığımız id bilgisinin sıralı olarak artması için sequence oluşturup buradan sıradaki değeri alıp kullanmamıza gerek kalmayacak. Bu işlem yerine tablomuzdaki id bilgisini oluştururken bu alana identity özelliği vermemiz yeterli olacaktır. Bu işleyişi daha iyi kavramak için eski yöntem olan sequence oluşturup tabloda nasıl sıralı id değeri alıdğımıza bakalım ve sonrasında aynı işlemi identity kullanarak yapalım.

İlk olarak normal yöntem kullanacağımız tablomuzu oluşturalım.

create table oracle12c_sequence
(
id number not null,
aciklama varchar2(100)
);
create sequence oracle12c_seq
minvalue 0
maxvalue 999999999
start with 1
increment by 1
nocache;

Tablomuz ve kullanacağımız sequence hazır. Şimdi bu tablodaki id alanına sıralı değer atmak için iki yöntem kullanabiliriz. İlk olarak bir trigger yazar ve bu trigger içinde id alanına sequence sıradaki değerini alabiliriz ya da tabloya insert işlemi yapmadan önce sequence sıradaki değerini alıp tabloya insert aşamasında kullanırız. Ben ikinci yöntem olan insert öncesinde sequence sıradaki değerini alıp tabloya insert işlemini yapacağım.

declare
  vId number;
begin
  begin
    select oracle12c_seq.nextval into vId from dual;
  
    insert into oracle12c_sequence
      (id, aciklama)
    values
      (vId, 'Id biz ekledik.');
    commit;
  exception
    when others then
      dbms_output.put_line('Hata:' || sqlerrm);
  end;
end;

Kod satırlarında da görüldüğü insert işlemini yaptık ve tablomuza kaydımızı ekledik. şimdi ise yeni gelen özelliğimiz olan identity özelliğini kullancağımız tablomuzu oluşturalım ve normal bir insert işlemi yapıp sonuçlarına bakalım.

create table oracle12c_identity
(
id number generated always as identity,
aciklama varchar2(100)
);

id number generated always as identity satırında da görüldüğü gibi identity kullanımı bu şekilde. Tablomuzu bu özellik ile oluşturduktan sonra tablo scriptine baktığımızda aşağıdaki gibi olduğunuz görürüz. Identity tanımı yaptğımız kolon için sistem tarafından otomatik bir sequence oluşturulur ve her yeni insert işleminde bu sequence sıradaki değeri kullanılır.

create table oracle12c_identity
(
  id       number default "SMT"."ISEQ$$_93068".nextval not null,
  aciklama varchar2(100)
);

Tablomuzun yeni yapısını gördüğümüze göre insert işlemine geçebiliriz.

begin
  insert into oracle12c_identity
    (id, aciklama)
  values
    (null, 'Id identity tarafından eklendi.');
  commit;
exception
  when others then
    dbms_output.put_line('Hata:' || sqlerrm);
end;

Öncelikle yukarıdaki gibi bir insert işlemi yaptığımızda sistem bize Hata:ORA-32795: cannot insert into a generated always identity column hatası verecektir. Bu hatanın sebebi identity olarak belirlenen bir alana dışarıdan insert işlemi yapılamadığındandır. Mevcut kodumuzu aşağıdaki gibi değiştirdiğimizde ise sağlıklı olarak insert işlemimizi yapabiliriz.

begin
  insert into oracle12c_identity
    (aciklama)
  values
    ('Id identity tarafından eklendi.');
  commit;
exception
  when others then
    dbms_output.put_line('Hata:' || sqlerrm);
end;

Oracle database 12c ile gelen bu yeni özellik sayesinde artık program içerisinde ya da trigger kontrolü ile bir id ataması işlemini bizim yapmamıza gerek kalmayışıdır. Özel durumlar dışında sistem bizim yerimize id alanını sıradaki değer ile doldurmaya devam edecektir.
Oracle database 12c ile gelen diğer özelliklerin bazıları hakkında da buradan bilgi alabilirsiniz.
Kolay gelsin.

oracle database 12c kurulum

01 Eylül 2013 2 yorum

Merhaba

Bildiğiniz üzere Oracle Database 12c artık yayınlandı. Bende yeni database kendi makinama kurarken birde kurulumu anlatmak istedim ve bu makaleyi hazırladım. Oracle en son database olan 12c yi buradan indirebilirsiniz.

İndirme işleminden sonra zip dosyasından çıkardığımız dosya içinde bulunan setup ile kurulumu başlatabiliriz. Kurulum ilk başladığında sırasıyla sistem kontrolü yapan işlem;

ora1

İlk kurulum öncesi gelen logo

ora2

Kurulum işlemleri başlıyor; Daha fazlasını oku…

oracle forms ile tnsnames.ora parse işlemi.


Merhaba

Çoğu zaman uygulama geliştirirken bir database ihtiyacımız olur. Bu database bazen bir Notepad , Access ya da Mysql vb. bazende daha Oracle gibi bir database olur.
Database bağlantılı hazırladığımız uygulamalar her zaman sabit bir db ye bağlanmak zorunda değildir. Uygulama ihtiyacına ya da çalışma durumuna göre farklı db erişimi yapmak zorunda olabilir. Bu gibi durumlar için son kullanıcının işlem yapacağı db seçimini kolaylaştırmak için bir parser yardımı ile hazırlanan db listesi işimizi görür.
Ben şuan evde Oracle 10g XE database kullanıyorum ve örneğimi bu db üzerinden vereceğim.Bilindiği gibi Oracle db erişim bilgilerini “tnsnames.ora” dosyasında tutar ve burada belirtilen database/lere bağlantı kurar.
Üzerinde çalışma yaptığım iki farklı db bulunduğu için bu parse işlemi hazırladığım uygulamalarda da bana çok kolaylık sağladı umarım sizin içinde faydalı olur.
Artık parse işlemine ve örnek kodlarımıza bakalım.Öncelikle “tnsnames.ora” dosyası içindeki db bilgilerini parse edecek ve bize sadece db bilgilerini verecek olan fonksiyonumuzu hazırlayalım.

CREATE OR REPLACE FUNCTION tns_listesi(tns VARCHAR2) RETURN VARCHAR2 IS
  tns_liste VARCHAR2(32000);
BEGIN
  tns_liste := tns;
  tns_liste := REPLACE(tns_liste, chr(10), NULL);
  tns_liste := regexp_replace(tns_liste, '\)([[:alnum:]])', chr(10) || '\1');
  tns_liste := regexp_replace(tns_liste, '=.*\)', NULL);
  tns_liste := REPLACE(REPLACE(tns_liste, chr(10), ','), chr(32), NULL);
  RETURN(tns_liste);
END tns_listesi;

Hazırladığımız bu fonksiyon “tnsnames.ora” dosyası içindeki tüm bilgileri string olarak alıp parse işlemini yapıyor. Örnek olarak fonksiyonu uygulama içinde kullanmadan önce bir declare ile test işlemimizi yapalım. Sistemimizde “DB_1” , “DB_2” , “DB_3” şeklinde üç adet db olduğunu varsayalım ve doğru parse işleminin olup olmadığını kontrol edelim.

DECLARE
  tns VARCHAR2(4000);
BEGIN
  tns := '
DB_1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.0.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

DB_2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.20)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

DB_3 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.30)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
';

  dbms_output.put_line(tns_listesi(tns));
END;

Örnek declare komutumuzu çalıştırdığımızda ise dbms_output ile çıktıyı görebiliriz. Çıktı sonucu olarak ise bize aşağıdaki sonuç gelecektir.

DB_1,DB_2,DB_3

Ben bir sonraki işlemde kullanım için db isimlerini “,” ile ayırdım. Bu işlemi siz istediğiniz şekilde değiştirebilirsiniz. Şimdi Oracle Forms uygulaması içinde bir prosedür oluşturup parse işlemimizi uygulamamıza dahil edelim.

PROCEDURE db_listele IS
  i            NUMBER;
  tnsstr       VARCHAR2(4000);
  tns          VARCHAR2(100);
  text_file    text_io.file_type;
  text_buffer  VARCHAR2(32000);
  text_buffer2 VARCHAR2(32000);
  uzun         NUMBER;
BEGIN

  i := 1;
  clear_list('BLOCK_TNS.TNS_LIST');

  text_file := text_io.fopen('C:\ORACLEXE\APP\ORACLE\PRODUCT\10.2.0\SERVER\NETWORK\ADMIN\TNSNAMES.ORA', 'r');

  BEGIN
    LOOP
      text_io.get_line(text_file, text_buffer);
      text_buffer2 := text_buffer2 || text_buffer || chr(10);
    END LOOP;
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  END;

  tnsstr := tns_listesi(text_buffer2);

  WHILE instr(tnsstr, ',') > 0 LOOP
    tns    := substr(tnsstr, 1, instr(tnsstr, ',') - 1);
    tnsstr := substr(tnsstr, instr(tnsstr, ',') + 1, 2048);
    add_list_element('BLOCK_TNS.TNS_LIST', i, tns, tns);
    i := i + 1;
  END LOOP;

END;

Yazdığımız prosedür içini inceleyecek olursak öncelikle db nin kurulu olduğu lokasyondan “tnsnames.ora” içindeki metini okuyup bir değişkene attıktan sonra bu değeri parse işlemi için yazdığımız fonksiyona gönderiyoruz. Parse işleminden sonra bize gelen db isimlerini ise sırası ile gezerek ve ayrıştırma işlemi için kullandığmız “,” yardımı ile her db ismini ayrı ayrı uygulamamızda bulunan “TNS_LIST” nesnesi içine ekliyoruz.
Artık bu işlemden sonra sistemde bulunan tüm db adlarını elde ettiğimize göre uygulamız üzerinde son kullanıcı ve hatta kendimiz için bu seçimi kullanarak istediğimiz db için bağalntı işlemi oluşturabiliriz.

Kolay gelsin.

c# console application oracle database connection and execute query örnek

04 Şubat 2011 2 yorum

Merhaba,
C# ile bir veri tabanı bağlantı kurmak ve bu bağlantı sayesinde basit bir sorgu çalıştırmak için yapmamız gereken işlemleri adım adım inceleyelim. Öncelikle ben bu işlem için bir console uygulaması ve oracle veri tabanı kullanacağım. C# da yeni bir console uygulaması için proje oluşturduktan sonra oracle veri tabanı bağlantısı için Oracle.DataAccess.dll nesnesini kullanacağız. Bu nesneyi projemize referans olarak eklemeliyiz. Oracle.DataAccess.dll nesnesini projemizde referans olarak ekledikten sonra uygulamamızı hazırlayabiliriz.

using System;
using Oracle.DataAccess.Client;
using System.Data;

namespace ConsoleDBConnection
{
    class Program
    {
        static void Main(string[] args)
        {
            OracleConnection conn = new OracleConnection();
            string txtQuery = "select sysdate from dual;";
            OracleCommand cmd = new OracleCommand(txtQuery);
            string username;
            string password;
            string dbname;

            Console.WriteLine("Console Application Oracle Bağlantısı Uygulaması\n");

            #region Connection String

            Console.WriteLine("Kullanıcı Adı Giriniz");
            username = Console.ReadLine();
            Console.WriteLine("Şifre Giriniz");
            password = Console.ReadLine();
            Console.WriteLine("Database Adı Giriniz");
            dbname = Console.ReadLine();
            Console.WriteLine("\n");

            conn.ConnectionString =
                          "Data Source=" + dbname + ";" +
                          "User id=" + username + ";" +
                          "Password=" + password;

            #endregion

            Console.WriteLine("Bağlantı Kurmak İçin Bir Tuşa Basın\n");
            Console.ReadLine();

            #region Open the connection

            try
            {
                conn.Open();
                Console.WriteLine("Oracle Database Bağlantısı Başarı İle Yapıldı !\n");
                Console.WriteLine("Sistem Saatini Sorgulama İçin Bir Tuşa Basın\n");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }

            #endregion

            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;

            #region Execute Query

            try
            {
                OracleDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("Sorgu Sonucu : "+reader.GetDateTime(0)+"\n");
                    Console.WriteLine("Çıkmak İçin Bir Tuşa Basın !");
                    Console.ReadLine();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }

            #endregion

        }
    }
}

Uygulamamız artık hazır. Uygulamayı çalıştırıp doğru bir şekilde veri tabanı bağlantısı yapıp yapılmadığı ve istenilen sorgunun çalıştırılıp çalıştırılmadığını kontrol edelim.

Ekran görüntülerinden de anlaşılacağı gibi başarılı bir şekilde veri tabanı bağlantımızı yaptık ve hazırladığımız sorguyu çalıştırıp sonucunu görebildik.
Kolay gelsin.