Menu

14 Eylül 2010 Salı

JAXB (Java Xml Binding)

JAXB (Java Xml Binding – https://jaxb.dev.java.net/) frameworkü kullanılarak Xml–>Java, Java–>Xml mapping işlemlerini gerçekleştirmek mümkündür. Bu yazılımcıya, Xml dosyalarının ihtiva ettiği verileri Java sınıflarıyla modelleme imkanı sunmakta ve verilerın işlenmesini kolaylaştırmaktadır.

Simdi daha once`den olusturmus oldugumuz schema1.xsd dosyasini kullanarak,  Xml–>Java mapping islemini yapacagiz... XJC kutuphanesinden yararlanarak yukaridaki bahsettigimiz islemleri gerceklestirmeye calisacagiz...



NOT : CLASSPATH ayarlarini oldugunu varsayarak yapilmistir, bundan onceki konumuzda, classpath icin gereken ayarlamalardan bahsedilmektedir....

JAXB tarafından oluşturulan sınıflar aşağıda yer almaktadır.
Student
package gensrc;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 *
Java class for student complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *
 * <complexType name="student">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="exams" type="{}exam" maxOccurs="unbounded" minOccurs="0"/>
 *         <element name="fullName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "student", propOrder = {
    "exams",
    "fullName",
    "id"
})
public class Student {

    @XmlElement(nillable = true)
    protected List exams;
    protected String fullName;
    protected Long id;

    /**
     * Gets the value of the exams property.
     *
     *
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a set method for the exams property.
     *
     *

     * For example, to add a new item, do as follows:
     *

     *    getExams().add(newItem);
     * 

     *
     *
     *
     * Objects of the following type(s) are allowed in the list
     * {@link Exam }
     *
     *
     */
    public List getExams() {
        if (exams == null) {
            exams = new ArrayList();
        }
        return this.exams;
    }

    /**
     * Gets the value of the fullName property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *    
     */
    public String getFullName() {
        return fullName;
    }

    /**
     * Sets the value of the fullName property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *    
     */
    public void setFullName(String value) {
        this.fullName = value;
    }

    /**
     * Gets the value of the id property.
     *
     * @return
     *     possible object is
     *     {@link Long }
     *    
     */
    public Long getId() {
        return id;
    }

    /**
     * Sets the value of the id property.
     *
     * @param value
     *     allowed object is
     *     {@link Long }
     *    
     */
    public void setId(Long value) {
        this.id = value;
    }

}



Exam.java

package gensrc;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;


/**
 *
Java class for exam complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType name="exam">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="examDate" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
 *         <element name="examScore" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "exam", propOrder = {
    "examDate",
    "examScore",
    "name"
})
public class Exam {

    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar examDate;
    protected String examScore;
    protected String name;

    /**
     * Gets the value of the examDate property.
     *
     * @return
     *     possible object is
     *     {@link XMLGregorianCalendar }
     *    
     */
    public XMLGregorianCalendar getExamDate() {
        return examDate;
    }

    /**
     * Sets the value of the examDate property.
     *
     * @param value
     *     allowed object is
     *     {@link XMLGregorianCalendar }
     *    
     */
    public void setExamDate(XMLGregorianCalendar value) {
        this.examDate = value;
    }

    /**
     * Gets the value of the examScore property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *    
     */
    public String getExamScore() {
        return examScore;
    }

    /**
     * Sets the value of the examScore property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *    
     */
    public void setExamScore(String value) {
        this.examScore = value;
    }

    /**
     * Gets the value of the name property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *    
     */
    public String getName() {
        return name;
    }

    /**
     * Sets the value of the name property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *    
     */
    public void setName(String value) {
        this.name = value;
    }

}


ObjectFactory

package gensrc;

import javax.xml.bind.annotation.XmlRegistry;


/**
 * This object contains factory methods for each
 * Java content interface and Java element interface
 * generated in the gensrc package.
 * An ObjectFactory allows you to programatically
 * construct new instances of the Java representation
 * for XML content. The Java representation of XML
 * content can consist of schema derived interfaces
 * and classes representing the binding of schema
 * type definitions, element declarations and model
 * groups.  Factory methods for each of these are
 * provided in this class.
 *
 */
@XmlRegistry
public class ObjectFactory {


    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: gensrc
     *
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link Exam }
     *
     */
    public Exam createExam() {
        return new Exam();
    }

    /**
     * Create an instance of {@link Student }
     *
     */
    public Student createStudent() {
        return new Student();
    }
}


Simdide olusan class`larimi kullanarak, classlarimiza uygun XML data oluturalim 

import gensrc.Exam;
import gensrc.Student;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Main {
   
    public static void main(String[] args) throws Exception {

        Student student = new Student();
        student.setFullName("Ertugrul Aslan");
        student.setId(new Long(3123123));
        Exam e = new Exam();
        e.setExamDate(null);
        e.setExamScore("PASS");
        e.setName("Matematik");
        student.getExams().add(e);

        e = new Exam();
        e.setExamDate(null);
        e.setExamScore("PASS");
        e.setName("Fizik");
        student.getExams().add(e);

        Marshaller marshaller =  null;

        marshaller = JAXBContext.newInstance(Student.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        StringWriter writer = new StringWriter();
        marshaller.marshal(student, writer);

        System.out.println(writer.getBuffer().toString());

    }
}
 


Java Class`larindan XML Schema yaratmak

Bu yazimizda Java Class`larimi kullanarak nasil XSD, file`lari yaratigimizi gorecegiz..

Oncelikle, birbiri ile iliskili 2 tane java class, olusturalim.. Student ve Exam adinda

import java.util.List;
/**
 *
 * @author ErtugrulA
 */
public class Student {

    private Long id;
    private String fullName;
    private List exams;

    public List getExams() {
        return exams;
    }

    public void setExams(List exams) {
        this.exams = exams;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

import java.util.Date;

/**
 *
 * @author ErtugrulA
 */
public class Exam {

    private String name;
    private Date examDate;
    private String examScore;

    public Date getExamDate() {
        return examDate;
    }

    public void setExamDate(Date examDate) {
        this.examDate = examDate;
    }

    public String getExamScore() {
        return examScore;
    }

    public void setExamScore(String examScore) {
        this.examScore = examScore;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Simdi bu class`larimi kullanarak, xsd file`mizi olusturalim..
Bunun icin ilk once classpath ayarlarini yapmamiz gerekmektedir...
Ben class path`de asagidaki lokasyonlari gosterdim.. Burada dikkat edilmesi gereken, bize tools.jar file`ini bende, c:\program files\java\lib\tools.jar icerisinde ariyordu, bende bu folderi kopyalayip buraya attmisdim,
C:\Program Files\Java\jdk1.6.0_13\bin;C:\Program Files\sges-v3\glassfish\bin;
bundan sonra asagidaki yollari izleyecegiz...


Yukaridaki islemlerden sonra, bizim gosterdigimiz yoldaki generated klosorunun, icine class`larimizin yapisina uygun olarak schema1.xsd olusturuldu....

STARTUP ve SHUTDOWN


Öncelikli olarak, STARTUP ile başlayalım. Startup, Oracle'da "Instance"ı ve veritabanını açmaya yarayan komuttur. Çeşitli durumlarda ve şekillerde instance'ın öncelikli olarak açılabilmesi için sonuna ek komutlar alabilir.
Başlamadan küçük bir hatırlatma. "select open_mode from v$database" dersek veritabanının hangi aşamada açıldığını görebiliriz.

Kapalı durumda olan veritabanına bir SYSDBA kullanıcısı ile bağlanalım.

                          C:\> SQLPLUS / AS SYSDBA
                              Connected to an idle instance.

                          SQL> STARTUP; 

Şuan veritabanı öncelikle "NOMOUNT" moduna geçer. Ardından MOUNT ve son olarak OPEN.

NOMOUNT AŞAMASI: Oracle giriş parametre dosyasını okuyor (INITORA, SPFILE). Veritabanının hangi parametrelerle ve boyutlarla açılmasını gerektiğini algılar. Bu durumda Oracle Background Process'leri de çalıştırılır.
Bu kısmı "STARTUP QUIET" diyerek görmeden geçebiliriz.

                                  SQL> STARTUP NOMOUNT QUIET;
                                     ORACLE instance started.

Veritabanımız şuan da nomount modunda bekliyor. Henüz veritabanını açmadık.

MOUNT AŞAMASI: Veritabanı bu aşamada Control dosyalarını okur. Bu dosyalardan, datafile gibi kritik dosyaların yerlerini algılar fakat henüz açmaz. Bu yerlerin algılanmasıda tamamlandıktan sonra artık veritabanımız BG Process'leri ve Control dosyaları ile açılmaya hazırdır.

                      SQL> ALTER DATABASE MOUNT; -VEYA- STARTUP MOUNT; 

Veritabanımız nomount aşamasında ise ilkini, değilse ikincisini yazabiliriz.
Database mounted.

OPEN AŞAMASI
: Şuan veritabanı datafile'lara girişini yaptı ve kullanıma hazır hale getirdi. Kullanıcılar bağlanabilir durumda.

                       SQL> ALTER DATABASE OPEN; -VEYA- STARTUP;

Veritabanımız mount aşamasında ise ilkini, değilse ikincisini yazabiliriz.
Database opened.

Özetlemek gerekirse;

1) STARTUP; --> Önce nomount sonra mount ve son olarak open aşamalarını veritabanını taşır (eğer herhangi bir sorun ile karşılaşılmazsa).

2) STARTUP NOMOUNT; --> Veritabanını nomount aşamasına getirir.
MOUNT; --> Veritabanını mount aşamasına alır.
(Default)OPEN; --> 1'inci durum ile aynıdır.

Bunlara ek olarak ise;

                 1) STARTUP [MOUNT/NOMOUNT/OPEN] RESTRICT;

Veritabanını restricted modda açmamıza yarar. Yetkili kullanıcılar dışında hiçbir kullanıcı bağlamaz. RESTRICTED SESSION yetkisi olanlar bağlanabilir. Açık veritabanında ise restricted session'ı şu şekilde açıp kapatabiliriz.

                 SQL> ALTER DATABASE ENABLE RESTRICTED SESSION;
                 SQL> ALTER DATABASE DISABLE RESTRICTED SESSION;

2) STARTUP [MOUNT/NOMOUNT/OPEN] FORCE; --> Veritabanını "SHUTDOWN ABORT" yaparak kapatır, istenilen şekilde açar. Bu şekilde açılan veritabanının herhangi bir başlangıç paramatresi olmasına gerek yoktur.

3) STARTUP [MOUNT/NOMOUNT/OPEN] EXCLUSIVE; --> Öncelikle belirtelim, startup mount exclusive deprecated edildi ve desteklenmiyor. Bu komut ise veritabanının sadece bu session tarafından mount veya open edilebileceğini gösterir.

Sırada SHUTDOWN komutları var. Detaylı olarak inceleyelim.

                C:\> SQLPLUS / AS SYSDBA
                    Connected to:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -                  ProductionWith the Partitioning, OLAP and Data Mining options

Şuan da bağlıyız. Yapabileceğimiz SHUTDOWN olanakları şunlardır;

1) SHUTDOWN [NORMAL]; --> Veritabanını "temiz" şekilde kapatır. Bütün kullanıcıların bağlı oldukları sessionlardan çıkmalarını bekler. Ardından instance'ı ve veritabanını güvenli bir şekilde kapatır. Bu sırada buffer_cache'de yazılmayı bekleyen dirty buffer'lar datafile'lara yazılır. Temiz olarak veritabanını kapatılır. Genelde kullanılmayan bir kapatma metodudur. Yeni kullanıcı kabul edilmez.

2) SHUTDOWN IMMEDIATE; --> Veritabanına bağlı olan bütün kullanıcıları atar ve commit edilmemiş işlemleri rollback yapar. Yeni kullanıcıların girmesini engeller. Shutdown normal'de olduğu gibi datafile'lara veriler yazılır. Veritabanı güvenle ve temiz olarak kapatılır.

3) SHUTDOWN ABORT; --> Veritabanını kapatmanın en hızlı ve aynı zamanda veritabanı için en zor yoludur. Veritabanı anında kapatılır ve bütün işlemler sonra ki Startup'ı bekler. Aslında bu kapatma türü Oracle'ı fazla etkilemez. Bu yöntem kesinkle ilk olarak kullanılacak yöntem olmamalıdır. Temiz bir kapatma metodu Oracle'da önemli rol oynar.

4) SHUTDOWN TRANSACTIONAL; --> Bu kapatma yöntemi ise bazı durumlar çok kritik olarak kullanılabilir. Önemli bir işlem yapılırken girilecek bir shutdown immediate komutu update veya insert yapan kişinin bütün işlemlerini rollback edebilir. Eğer tek kullanıcı ile çalışıyorsak ve işlemini bitirmesini bekliyorsak bu kapatma yöntemini uygulamalıyız. Kullanıcılar COMMIT ettikleri zaman veritabanından atılırlar ve temiz kapatma gerçekleşir. Commit edilmeyen sessionları bekleriz, bu komut ile. Yeni kullanıcılar kabul edilmez.

Genel olarak Oracle veritabanını bu komutlar ile kapatıp açabiliriz. Bu seçimleri yapmak tamamen DBA'in sorumluluğundadır. Hangi durumda hangi metodun kullanılacağına iyi karar vermek gerekebilir.

PFILE / SPFILE Detaylar

Eger sisteminizde SPFILE`mi yoksa PFILE  oldugunu ogrenmek istiyorsak..

    SQL > SELECT DECODE(value, NULL, 'PFILE', 'SPFILE') "Init File Type" FROM sys.v_$parameter WHERE name = 'spfile';

Sisteminiz SPFILE ile calisiyorsa, SPFILE`in lokasyonunuda saptayabilirsiniz. Bunun icin yine V$PARAMETER goruntusunde yaralariniz..
            
       SQL > SELECT value FROM SYS.V_$parameter WHERE name = 'spfile'

Asagidaki kodu kullanarak, spfile icindeki parameterelerin degerlerini gorebiliriz. Mesala db_files(kac tane datafile) yaratabiliriz, butun bilgilerini gorebiliriz..

      SQL > select * from v_$parameter where name='db_files'

  Veritabanini PFILE ile acmak
 
Diyelimki elimizde bir spfile yedegi var ve bu dosya olmasi gereken adreste degil. Ustelik dosya adi formatida farkli. Peki bu durumda ne yapabiliriz. Hemen aklimiza gelecek cozum, dosyanin spifile.ora seklinde yeninden isimlendirilmesi ve ardindan $ORACLE_HOME\dbs altina atilmasi olabilir. Dogru bir yontemdir, Fakat herzaman uygulayamayiz. Cunku dosya lokasyonlarini degistiremeyecegimiz durumlarla karsilasabilir. Ornegin spfile`in bulundugu klasorun yedegi aliniyordur ve bu nedenle yerinden oynamamisi gerekir. Bu gibi durumlarda az evvelki yontemi ne yazikki kullanamayiz isin kotusu bole durumlarda bos bir dosya yaratip sadece asagidaki girmeniz gerekir.

SPFILE=/klasor/adresi/spfile_adi.ora

Dosyanin sonunun .ora olmasi gerekmez. Onceki SPFILE dosyasi nerdeyse onun gosterilmesidir. Yukaridaki satiri /tmp/calistir.txt isimli bir metin dosyasinda yazdiginiz artik farkli lokasyondaki spfile`i kullanmaya hazirsiniz demektir.
Bunda sonra yapmaniz gereken /tmp/calistir.txt dosyasini bir pfile gibi kullanmaktir.

        SQL>STARTUP PFILE ='/tmp/calistir.txt'

Parametre dosyalarinin okunma sirasi

Oracle veritabanin default olarak okumaya calistigi $ORACLE_HOME/dbs klasorunun altidir.
Okuma sirasi asagidaki gibi gerceklesir.

                         1. SPFILE.ora         1.2 SPFILE turu
                         2. SPFILE.ora

                         3.INIT.ora                 3.4 PFILE turu

                         4.INIT.ora

Yukarida`da fark edebileceginize gibi bakma sirasi once spfile`in varligina, daha sonra pfile dosya turlerine bakilmaktadir

SPFILE degerlerini degistirmek

Oracle veritabani bir cok parametrenin online olarak degismesine olanak vermektedir. Bunun anlami, parametre deigisikliklerinin gecerli olmasi icin isletim sisteminin yeninde baslatilmasina gerek olmamasidir. Bu oldukca yarali ve gerekli bi ozellik.

   SQL> ALTER SYSTEM SET timed_statistics= TRUE SCOPE BOTH SID ='*';

Bizi burada encok ilgilendiren kisimlari, ALTER SYSTEM SET dedikden sonra parametre adi belirtip yeni deger veriyoruz. SCOPE kisminda 3 deger verilebilir.
- MEMORY ; Ayarlanan deger sadece gecerli olan oracle instance icin ayarlanacaktir. Bunun anlami, veritabani yeninde baslatildiginda girmis oldugunuz degerin kaybolacagidir. Ancak oracle kapanana kadar kalir.
-SPFILE ; Girdiginiz deger veritabanin bir sonraki baslamasinda gecerli olacaktir.
-BOTH ; veritabani verilen deger hem hemen uygulamaya alinacak, hemde oracle`in bundan sonraki acilislarinda da gecerliligini koruyacaktir. Bir nevi (MEMORY+SPFILE) diyebiliriz..
Eger SCOPE degerini girmesseniz, BOTH olarak verilecektir.

Oracle Parametre Dosyalari

Oracle`in calisabilmesi icin gerek duydugu temel bazi ogeleri parametre dosyalarinda tutariz. Oracle ilk basladiginda oarametre dosyalarini okur ve sisteme dair bir cok ayara burdan ulasir. Ayni anda calisabilecek islem adedi (*.process) arsiv dosyalarinin lokasyonun neresi olacagi(*.log_archive_dest) kac dakikada bir arsive cikarilacagi (*.archive_log_target) control file`larin lokasyonlari (*.control_files). background dump, user dump, gibi klasorlerin nerelerde konumlandirildigi vb. bilgileri parametre dosyalari icinde saklanir. Bu degiskenlere parametre denmektedir. ve hep birlikte parametre dosyalasini olustururlar. Ancak parametre dosyasi okunup gerekli bilgi alindikdan sonra, contorl file`lara erisilip, Oracle datafile`lar kullanilmaya baslar..
  Oracle`da 2 cesit parametre dosyasi vardir, bunlardan birisi bizim uzerinde degisiklik yapabilecegimiz metin tabanli olan PFILE(parameter file)`dir. Digeri ise binary bicimde oldugu icin uzerinde degisiklik yapamayacagimiz SPFILE(Server Parameter File)`dir.

    Oracle PFILE(Parameter File)
Oracle parameterelerini tutan PFILE bir metin dosyasidir, icerisine girip, diledigimiz degisiklikleri yapabiliriz.PFILE init.ora yada init.ora seklinde gecer ve $ORACLE_HOME\database\ altina bakmamiz gerekebilir. Burada olarak belirttigimiz, veritabanimiza ait olan Oracle System ID`dir.

Oracle SPFILE(Server Parameter File)
init.ora ile tanisdigimiz pfile`in kullanimi yaklasik 10 yildir var olan bir yapi. SPFILE mantigi daha sonra ortaya cikmistir. ikisi arasindaki en buyuk fark, PFILE bir metin dosyasi oldugundan kolayca degisiklik yapmak mumkunken, spfile`i bu sekilde degistirmenin, mumkun olmamisidir. Bu elbette olumsuz bir durum, fakat SPFILE kullanmanin ciddi avantajlari bulunuyor.
Oracle`in ciddi otomatik performans iyilestirme yontemleri icin SPFILE kullanimi taysiye edilmektedir. Ayrica RMAN sayesinde, SPFILE`larinizin otomatik olarak yedeklenmesi saglanabilir, sizin kopyalamaniza gerek kalmaz. Her yedek alinmasinda SPFILE`in yedegi alinacaktir.
Daha onemli bi konuya deginelim parameterlerin degismesi

            SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSEC=10;

Eger parametre dosyasi olarak SPFILE kullaniyorsaniz, yukarida girdiginiz deger hep gecerli olacaktir. Veritabani tekrar basladiginda yine eger ayar girmenz gerekmez, cunku spfile dosyasina girmis oldugunuz deger tutulur. Bu durum, PFILE ile saglamak mumkun degildir. Yaptiginiz bir degisikligi PFILE`a girmeyi unutursaniz, problem yaratabilir. halbuki SPFILE icin boyle bi problem olmadigini goruyoruz.
PFILE ile ayni sekilde SPFILE`larin tutuldugu klasor yine $ORACLE_HOME\database atilir.
  ( spfile.ora )

SPFILE`den PFILE yaratma

Database`de bir karar alindi ve bir takim degisiklikler yapmamiz gerekiyor diye dusunelim. Ornegin arsive cikilacak dosyalari /data1/archive yerine artik /data3/archive altina kopyalamamiz gereksin.
Bu gibi durumda spfile`i bir pfile` donusturmek ardindan pfile`dan tekrar spfile yaratmak gerekir.

Adim Adim asagidakileri uyguluyoruz..

1. Burada, oracle ile spfile (server parameter file)`den nasil pfile(parameter file) yaratacagimizi gorecegiz.


Ama burada suna, dikkat etmemiz gerekiyor, pfile yaratirken, baglanti yaptigimiz kullanicinin SYSDBA rolunun olmasi gerekmektedir. Normal DBA rolu olan bi kullanici ile yaparsak. Asagidaki hatayi aliriz..

ORA-01031: insufficient privileges

2. PFILE dosyasini acip log_archive_dest parametresinden ilgili degisiklikleri yapiyoruz.

3. Calismakta olan bir veritabaninin spfile`ni ezemeyecegimize icin database`i kapatiyoruz.

                     SQL> SHUTDOWN IMMEDIATE;

4. Degisiklik yaptigimiz pfile`i kullanarak yeni bir spfile olusturuyoruz.

                   SQL> CREATE SPFILE FROM PFILE ='D:\TEST.TXT'

5. Database`i aciyoruz

                  SQL> ALTER DATABASE OPEN; 


SPFILE`i direk olarak degistiremedigimiz icin, onu bir pfile`a donusturup, ilgili degisiklikleri yaptik ve sonrasinda yeni bir SPFILE yarattik. Biraz zahmetli bir is, ancak her parametre degisiminde boyle bir sey yapilmasi gerekmiyor. Cogu durumda veritabani yeniden baslatilmadan bir cok parametreyi degistirebniliyorsunuz. Ancak veritabani kapatip, alter system olmaksizin parametre degistirmek isterseniz yukaridaki adimlari izleminiz gerekmektedir.

 

13 Eylül 2010 Pazartesi

Apex document

http://www.inside-oracle-apex.com/overview/

12 Eylül 2010 Pazar

Oracle Hatalari

ORA-12560 : TNS protocol Adapter..

Cozum : Oracle SID ayarini degistirmemiz gerektigidir..

C:\ SET ORACLE_SID = DBNAME;


ORA-12638: credential retrieval failed tips

Cozum : \oracleapp\product\11.2.0\dbhome_1\NETWORK\ADMIN

bu path yol icindeki sqlnet.ora file`nin icindeki 

Bu degeri - SQLNET.AUTHENTICATION_SERVICES= (NTS)

Bununla degistirin -
SQLNET.AUTHENTICATION_SERVICES= (NONE)



ORA-HATASI HATANIN SEPEBİ ÇÖZÜM ÖNERİSİ
ORA-00001 Unique constraint violated. (Invalid data has been rejected) Bir UPDATE ya da INSERT cümlesi varolan bir anahtar (key) bilgisini girmeye çalışıyor. çözüm için ya veritabanındaki “unique constraint” kuralı kaldırılmalı ya da yapılmaya çalışılan girişteki anahtar (key) girilmemelidir.
ORA-00600 Internal error (contact support) Oracle uygulamalarının üretebileceği istisnai hatalar için kullanılan genel hata numarasıdır. Oracle uygulaması tarafından öngörülemeyen bir hata ile karşılaşıldığında üretilir. Uygulama hatası olarak rapor edilmelidir. İlk argüman dahili hata numarasıdır.
ORA-00942 Table or view does not exist Sorgulanan tablo veya view bulunamıyor. Kullanıcıların sahip olduğu tablolar Data Dictionary sorgulanarak bulunabilir. Tabloya erişim için gerekli yetki bulunmuyor olabilir. Tablo ya da view’ün var olup olmadığını kontrol edin. Tablo ya da view adınının doğru yazılıp yazılmadığını kontrol edin.
ORA-01017 Invalid Username/Password Veritabanında kullanıcı bulunmuyor ya da girilen şifre yanlış. Kullanıcının varolup olmadığını kontrol edin. Bunun için “select username from all_users” sorgusu kullanılabilir.
ORA-01031 Insufficient privileges Uygun olmayan yetki ile geçerli kullanıcı adı ya da şifresi değiştirilmek istendiğinde karşılaşılır. Ayrıca bu hata işletim sistemi seviyesinde gerekli yetkiler verilmediği halde veritabanı kurulumu yapılmaya çalışılırsa alınmaktadır. Veritabanı yöneticisinin gerekli yetkileri vermesi gereklidir.
ORA-01033 ORACLE initialization or shutdown in progress Bu hata oracle’ın başlatılma ve durdurulma işlemi sırasında işlem yapılmak istendiğinde alınmaktadır. Ayrıca arızalanan bir disk sebebiyle oracle veritabanının asılı kalması durumunda da alınmaktadır. Sistemde arızalı disk bulunup bulunmadığı kontrol edilir. “Control File” oluşturulduktan sonra “alter database open” komutu çalıştırılarak veritabanı açılır.
ORA-01034 Oracle not available (the database is down) Aşağıdaki durumlarda bu hata alınabilir; SGA kendisine verilenden daha fazla boş alana ihtiyaç duyuyor olabilir. İşletim sistemi üzerinde Instance’ı gösteren değişken yanlış tanımlanmış olabilir. Oracle bu hatayla birlikte gelen diğer hata mesajlarını inceleyerek çözüm bulunmasını daha sonra oracle’ın başlatılarak istenen işlemin tekrar denenmesini tavsiye etmektedir. Ayrıca uygulamasının doğru link edilip edilmediği kontrol edilmelidir.
ORA-01403 No data found Hiçbir sonuç döndürmeyen SELECT INTO sql cümlesi çalıştırıldığında ya da UTL_FILE paketi kullanılarak dosyanın sonundan okuma yapıldığında bu hata ile karşılaşılır. Çözüm için ilgili veri üzerinde çalışan işlem durdurulmalıdır.
ORA-01555 Snapshot too old (Rollback has been overwritten) Bir okuyucu tarafından okunmak istenen Rollback kayıtlarının üzerine başka yazıcılar tarafından veri kaydedilmiş ise bu hata ile karşılaşılır. Eğer otomatik undo yönetimi kullanılıyorsa UNDO_RETENTION değeri artırılmalı, kullanılmıyorsa daha büyük rollback segmentleri kullanılmalıdır.
ORA-03113 End-of-file on communication channel (Network connection lost) Sunucu işlemi ile kullanıcı işlemi arasındaki bağlantı koptuğunda karşılaşılmaktadır. Bir network probleminin bulunup bulunmadığı kontrol edilir. SQL NET ayarlarına bakılır. Hata anında oluşturulan trace dosyası kontrol edilmelidir.
ORA-03114 Not connected to ORACLE Bu hata bağlantı kurulamadığı halde oracle’a çağrı yapıldığında gerçekleşir. Genellikle kullanıcı uygulamasının veritabanına oturum açmadığı durumlarda oluşmaktadır. Buna ek olarak ALTER SYSTEM KILL SESION ya da ALTER SYSTEM DISCONNECT SESSION komutları IMMEDIATE parametresi ile çalıştırıldığı durumlarda veritabanı kullanıcıyı beklemeden oturumu kapattığı için kullanıcıdan gelen isteklere bu hatayı döndürür. yapılan işlem tekrar denenir aynı hata ile karşılaşılırsa uygulama kapatılıp açılarak veritabanına tekrar logon olunması sağlanabilir.
ORA-12154 TNS:could not resolve service name” Herhangi bir isimlendirme metodu kullanılarak yapılmaya çalışılan bağlantılarda bağlantı tanımlayıcısı çözümlenemiyor ise bu hata alınablir. Yerel isimlerndirme (Local Naming) metodu (TNSNAMES.ORA dosyası) kullanılıyorsa: 1- Oracle Net profilinde (SQLNET.ORA dosyası) bulunan NAMES.DIRECTORY_PATH değerlerinin birinin içerisinde “TNSNAMES” bilgisi var mı kontrol edilir. 2- İlgili dizinin içerisinde TNSNAMES.ORA dosyası var mı kontrol edilir. 3- TNSNAMES.ORA dosyasının içerisinde “connect identifier” olarak kullanılan “net service name” var mı kontrol edilir. 4- TNSNAMES.ORA dosyasının içinde yazım hatası var mı kontrol edilir. (Kapatılmamış parantezler gibi) Dizin İsimlendirme (Directory Naming) metodu kullanılıyorsa: 1- Oracle Net profilinde (SQLNET.ORA dosyası) bulunan NAMES.DIRECTORY_PATH değerlerinin birinin içerisinde “LDAP” bilgisi var mı kontrol edilir. 2- LDAP dizin sunucusunun açık ve erişilebilir olduğu kontrol edilir. 3- LDAP dizini içerisinde “connect identifier” olarak kullanılan “net service name” ya da “database name” var mı kontrol edilir.
ORA-12203 TNS:unable to connect to destination” Yanlış ağ adresi girildiğinde ve girilen network adresi oracle tarafından dinlenilmiyorsa oluşur. Ayrıca ağ üzerinden veri taşıma problemleri bulunuyorsa gerçekleşir. Bağlantı açıklayıcısında “net service name” karşılığı olan ADDRESS alanının doğru girilip girilmediği kontrol edilmelidir. Sunucu tarafında Listener hizmetinin çalışıp çalışmadığı kontrol edilmelidir.
ORA-12500 TNS:listener failed to start a dedicated server process Listener hizmeti bir “Dedicated Server Process” ini çalıştıramıyorsa gerçekleşir. Tracing hizmeti ADMIN seviyesinde açıldıktan sonra işlem tekrar çalıştırılır. ORACLE_HOME/bin dizini içerisinde Oracle Server çalıştırılabilir dosyasının bulunup bulunmadığı ayrıca çalıştırma (execute) yetkisinin olup olmadığı kontrol edilir. Oracle değişkenlerinin LISTENER.ORA dosyasında belirtilip belirtilmediği kontrol edilir. Ayrıca çağırılan “Oracle Protocol Adapter” doğru olarak bağlanmış mı kontrol edilmelidir.
ORA-12545: Connect failed because target host or object does not exist Belirtilen adres yanlış ya da bağlanılmaya çalışılan program bulunmuyor. Girilen adres parametresinin doğruluğundan emin olunmalıdır. En çok karşılaşılan node name parametresinin yanlış girilmesidir. Eğer protokol TCP/IP ise TNSNAMES.ORA içerisindeki host name parametresine IP adresi yazılarak denenebilir.
ORA-12560 TNS:protocol adapter error Genel Protokol Bağdaştırıcı hatası gerçekleşti. Protokol tanımında kullanılan adresler kontrol edilmelidir. Ayrıca tracing aktif edildikten sonra işlem tekrarlanarak detaylar incelenmelidir.

Cok sutunlu altsorgular

Altsorgunun SELECT kisminda birden fazla sutun yer aliyorsa bunlara cok sutunlu alt sorgular denir. Cok sutunlu alt sorugular  genelde sutunlarin karsilastirilmasinda kullanilir yada UPDATE  cumlelerinde kullanilir.

Asagidaki sorgudaki her departmende en yuksek maasi alan employee listelenmistir..

select concat(first_name,' '|| last_name) AS fullname, salary, department_id from employees
    WHERE (department_id, salary) IN
          (SELECT department_id, max(salary)
              FROM employees GROUP BY department_id)
    ORDER BY salary DESC


FULLNAME                                       SALARY                 DEPARTMENT_ID         
---------------------------------------------- ---------------------- ----------------------
Steven King                                          31944                  90                    
John Russell                                          18634                  80                    
Nancy Greenberg                                 15982.65               100                   
Shelley Higgins                                     15982.65               110                   
Den Raphaely                                      14641                  30                    
Hermann Baer                                     13310                  70                    
Alexander Hunold                               11979                  60                    
Adam Fripp                                        10914.2                50                    
Susan Mavris                                      8651.5                 40                    
Pat Fay                                              7986                   20                    
Jennifer Whalen                                  5856.4                 10                    

11 rows selected

Grup Fonksiyonlar

Grup fonksiyonlari tek kayit fonksiyonlarinda farkli olarak bir veya daha fazla girdi degeri alir. Girdi degerleri sorgu calisip tum kayitari cekilmeden belli olmaz. Tek kayit fonksiyonlarinda girdi sayisi SQL cumlesinin ayristirilma islemi sirasinda bilinir. Bu ozelligi grup fonksiyonlarini kullanimi ve sonuclari yonuyle tek kayit fonksiyonlarinda ayrilir.
  • Grup fonksiyonlari genelde NULL deger almaz ve genelede NULL deger dondurmezler. Ornegin COUNT ve SUM fonksiyonlarina NULL degerler girdigimizde 0 (sifir) dondururler.
  • Grup fonksiyonlari SQL cumlelerinin SELECT yada HAVING kisimlarinda yer alabilir. SELECT kisminda kullanildigi zaman genelde GROUP BY ifadesi ile birlikte kullanilir. Eger GROUP BY ifadesinde gruplamanin neye gore yapilacagi belirtilmez ise gruplama islemi icin kayitlarin tamami kullanilir.
  • Group fonksiyonalari SQL cumlelerinin WHERE kisminda kullanilmaz.
Bir sonraki dersimizde en cok kullanilan grup fonksiyonlarini ayri ayri degerlendirecez.

AVG

AVG(DISTINCT|ALL
) fonksiyonunda p sayisal bir ifadedir. AVG fonksiyonu aritmetik ortalamayi verir. Eger DISTINCT yada ALL kullanilmaz ise varsayilan degeri ALL`dir.

SELECT department_id, AVG(salary) FROM employees
      GROUP BY department_id
      ORDER BY AVG(salary)



DEPARTMENT_ID          AVG(SALARY)           
---------------------- ----------------------
50                     4625.964444444444444444444444444444444444
30                     5523.65               
10                     5856.4                
60                     7666.56               
20                     7986                  
40                     8651.5                
                          9317                  
100                    11448.375             
80                     11920.2794117647058823529411764705882353
70                     13310                 
110                    13514.975             
90                     25732.6666666666666666666666666666666667

12 rows selected

COUNT

COUNT(DISTINCT|ALL
) fonksiyonunda p herhangi bir ifadedir. COUNT  fonksiyonu sorguda donen kayit sayisini bize dondurur. NULL degerler sayilmaz. * kullanildigi zaman tum kayitlar sayilacagi belirtilmis olur.

SELECT COUNT(*) KAYIT_SAYISI,
       COUNT(DISTINCT department_id) DEPARTMEN_SAYISI,
       COUNT(ALL department_id) NULL_OLMAYAN_KAYIT_SAYISI
FROM employees

 KAYIT_SAYISI           DEPARTMEN_SAYISI       NULL_OLMAYAN_KAYIT_SAYISI
---------------------- ---------------------- -------------------------
107                    11                     106     

MAX - MIN

MAX(DISTINCT|ALL
) fonksiyonunda p herhangi bir ifadedir. MAX fonksiyonu sorguda donen en buyuk ifadeyi verir. MIN ise en kucuk ifadeyi verir.
  • p ifadesi tarih/zaman veritipinde ise sonuc DATE veritipidir. Tarih degerleri icin en buyuk tarih en son tarihdir.
  • p ifadesi sayisal bir ifade ise sonuc NUMBER veritipidir. En buyuk sayisal deger doner.
  • p ifadesi karakter bir ifade ise sonuc VARCAHR2 veritipidir. En buyuk deger veritabani karakter kumesine gore siralanmis en buyuk ifadedir.
Yukaridaki ifadeler ayni sekilde MIN fonksiyonu icinde gecerlidir.

SELECT MAX(salary),
                MAX(last_name),
                MAX(hire_date)
FROM employees


MAX(SALARY)            MAX(LAST_NAME)            MAX(HIRE_DATE)           
---------------------- ------------------------- -------------------------
31944                  Zlotkey                   21-04-08     


SELECT MIN(salary),
               MIN(last_name),
               MIN(hire_date)
FROM employees


MIN(SALARY)            MIN(LAST_NAME)            MIN(HIRE_DATE)           
---------------------- ------------------------- -------------------------
2795.1                 Abel                      13-01-01 
 

GROUP BY ile Verilerin Gruplandirilmasi

SQL cumlelerinde verilerin nasil gruplandirilmasini istedigimizi GROUP BY ifadesi ile belirtiriz. Bunula ilgili olarak asagidakilere dikkat etmemiz gerekmektedir.
  • SQL cumlesinin SELECT kisminda kullanilan gruplama ifadeleri ve sabit degerler haricindeki tum sutunlar GROUP BY ifadesinde yer almalidir.
  • Eger GROUP BY ifadesi kullanilmaz ise SELECT kisminda sadece grup fonksiyonlari ve sabit degerler kullanilabilir. Gruplama tum kayitlar uzerinden yapilir.
  • SQL cumlesi calistirildiginda once veriler cekilir, daha sonra GROUP BY ifadesine gore gruplandirilir.
  • GROUP BY ifadesi kullanildigi zaman Oracle otomatik olarak kayitlari artan (ASC) sekilde siralar.
  • Sutun takma adlari GROUP BY ifadesinde kullanilmaz.
  • GROUP BY ifadesinde birden fazla sutun yada ifade kullanilabilir. Bu durumda tum kayitlar veritabaninda cekildikden sonra ilk once GROUP BY ifadesinde yeralan ilk sutun/ifadeye gore siralama yapilir. Daha sonra sirasiyla digerlerine gore gruplama yapilir.Sonuc olarak grup icinde grup olmus olur.
Asagidaki ornekde EMPLOYEES tablosundaki kayitlar HIRE_DATE (ise giris tarihl)`lerine gore gruplanarak ayni tarihte ise girmis kac kisi oldugu bulunmustur. Birinci SQL cumlesinde GROUP BY ifadesi kullanilmadigi halde  HIRE_DATE SQL cumlesinin SELECT kisminda kullanildigi icin hata vermistir. Ama ikini SQL`de bu hata giderilerek GROUP BY ifadesi ilave edilmis ve SQL calistirilmitir.
SELECT hire_date, count(*) FROM employees
SQL Error: ORA-00937: not a single-group group function

SELECT hire_date, count(*) FROM employees
      GROUP BY hire_date


HIRE_DATE                 COUNT(*)             
------------------------- ----------------------
07-12-02                  2                     
10-08-07                  1                    
08-03-08                  5                     
17-10-03                  1                    
15-10-07                  1                    
29-01-08                  3                     
30-01-05                  1                    
23-11-07                  1                    
04-03-04                  1                    
21-04-08                  2    

Tek kayit Fonksiyonlar

Fonksiyonlar, sifir yada daha fazla parametre alan ve sonucta sadece bir deger donduren programlardir. Oracle ile birlikte bircok hazir fonksiyon gelmektedir. Fonksiyonlari 5 grupda toplayabiliriz. 
  • Karekter Fonksiyonlari
  • Sayisal Fonksiyonlar
  • Tarinh Fonksiyonlari
  • Donusturme Fonksiyonlari
  • Diger Fonksiyonlar
Tek Kayit fonksiyonlari SQL ya da PL/SQL cumleleri icerisinde dahil edilebilir. Tek Kayit fonksiyonlarinin SQL cumlelerii icerisinde yer alabilecegi bolumler asagida kisaca listelenmistir.
  • SELECT cumlelerinin SELECT, WHERE ve ORDER BY kisimlarinda
  • UPDATE cumlelerinin SET kisminda
  • INSERT cumlelerinin VALUES kisminda
  • DELETE cumlelerinin WHERE kisminda
Not: Tek Kayit Fonksiyonlari SQL cumlelerinin HAVING kisminda kullanilmaz. HAVING kisminda sadece grup fonksiyonlarini kullanilir.

SQL cumlelerinde fonksiyonlari kullanirken bu fonksiyonlari ic ice yazma imkanimiz vardir. Yani bir fonksiyonun diger bir fonksiyona parametre olarakk verebiliriz. Ayrica tek kayit fonksiyonlari grup fonksiyonlari icerisine yazilabilecegi gibi, grup fonksiyonlari da tek kayit fonksiyonlari icine yazilabilir.

SELECT fonksiyon1(fonksiyon2(column1)) FROM table_name