Hurriyet

Sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Sql etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

5 Ocak 2015 Pazartesi

Oracle Database: SqlPlus Backspace Fix - Deleting Characters in SqlPlus- Sqlplus'taki Silme Problemi

Deleting problem is a pain for most of the SQL users. The ability to delete becomes a bliss in sqlplus
In default settings, when you mistype a key in sqlplus and you try to delete them, you encounter "^H" problem. That is something like below

 SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 5 11:47:04 2015  
   
 Copyright (c) 1982, 2013, Oracle. All rights reserved.  
   
   
 Connected to:  
 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production  
 With the Partitioning, OLAP, Data Mining and Real Application Testing options  
   
 SQL> select * instasada^H^H^H^H  

It means that when you mistype instance and try to correct it by deleting the wrong characters, you end up with "^H" strings all over.

 The reason why was explained by Erman Arslan in his following post.

Erman Arslan's Oracle Blog: Linux -- SQLPLUS backspace (^H) problem & fix - vt100,vt220

Before, we were solving it with ctrl+backspace key combination.  However if you dont want to deal with you just apply the solution below.

I just wanted to share it because I know that many people experience this problem.

The solution is to add this to " stty erase ^H " the .bash_profile which is found in the user directory (e.g. /home/applmgr/.)


 # .bash_profile  
   
 # Get the aliases and functions  
 if [ -f ~/.bashrc ]; then  
     . ~/.bashrc  
 fi  
   
 # User specific environment and startup programs  
   
 PATH=$PATH:$HOME/bin  
   
 export PATH  
   
 export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH  
   
   
 stty erase ^H 


Like the example above , we added the stty string to bash profile and then we were able to delete the wrong characters with ease.

References:
1- Erman Arslan's Blog :
http://ermanarslan.blogspot.com.tr/2015/01/linux-sqlplus-backspace-h-problem-fix.html?utm_source=feedburner&utm_medium=email&utm_campaign=Feed:+ErmanArslansOracleBlog+(Erman+Arslan%27s+Oracle+Blog)

26 Mart 2014 Çarşamba

Oracle Veritabanı: Bash Script İçerisinde SQL*PLUS ile Değer Girmek - Prompting For Input In Bash Script With SQL*Plus

Önceki yazımızda(Oracle Veritabanı: SQL*PLUS ve Script Etkileşimi - Interaction Between SQL*PLUS and Bash Shell Scripts - Execution of SQL Scripts) Bash Shell'de, SQL script'leriyle nasıl etkileşim haline geçebileceğimizi belirttik. Bu yazımızda da yazdığımız bir Bash Shell script'inin içinde çağırdığımız sql script'ine bir değer atamanın nasıl yapıldığını göstereceğiz.

--------------
#!/bin/bash
ls
sqlplus -s berke/berke <set serveroutput on;
declare
x char;
z char;
begin
select '&x' into z from dual;
dbms_output.put_line(z);
end;
/
exit;
EOF
ls
--------------

Yukarıdaki script içeriğimizde dual tablosundan bir select çekip orada da hangi değeri istediğimizi x değişkenine atıyoruz. Bu script'i çalıştırdığımızda ise bunu başaramıyoruz çünkü bize declare ile başlattığımız programımızın sonundaki yani "/" işaretinden sonraki ilk kelimeyi kendisine değer olarak almaktadır. Bu durumda x değişkenine exit kelimesi atanır.(x=exit)  Biz burada kendimize bir değer sorulmasını istiyorsak bunu yapmanın 2 yolu vardır. İlki sql kodunu burada yazmaktansa bir script olarak çalıştırmaktır.  2'si ise dışardan değer olarak almaktır.

1- SQL Script'ini Shell Script İçerisinden Çağırmak:

İlk aşamada bash script'imizi aşağıdaki gibi oluştururuz.

------------
#!/bin/bash
ls
sqlplus -s apps/apps @deneme.sql
-----------

Deneme.sql adlı SQL script'imizi bize girdi(input) sorması için aşağıdaki gibi oluştururuz.

------------------
set serveroutput on;
select '&x' from dual;
exit;
-----------------

Örnek çıktısı aşağıdaki gibidir.

------------------------
Enter value for x: 10
old   1: select '&x' from dual
new   1: select '10' from dual

'1
--
10
------------------------

2- Dışardan Değer Atamak:

Buradaki mantığımızda script'imizin içerisinde kullanacağımız değeri script'e girmeden önce belirleriz. sonrasında SQL*Plus'a bağlandıktan sonra "$"'ı kullanaraktan o parametremizin değerini işleyebiliriz.

------------------------
#!/bin/bash
echo "Deger giriniz: \c"
read y
echo "Degerimiz: "$y
sqlplus -s apps/apps << EOF
set heading off;
set feedback off;
select $y from dual;
exit;
EOF
------------------------


Örnek Çıktı:
------------------------
Deger giriniz \c
10
Degerimiz: 10

        10
------------------------
Modülerliği Arttırmak:

Script'imizi modüler yapmak içinse programımız tam bittiği anda değerlerimizi yerleştirebiliriz. Örneğin aşağıdaki programımızda 2 kere değer isteyen sonra da bu değerleri kullanan algoritma bulunmaktadır. Değişkenleri sürekli değiştirmektense programımızın sonuna program içerisinde herhangi bir yerde kullanılacak "a" ve "b" parametreleri için değerleri yerleştirebiliriz. Bu durumda a parametresinin değeri C  ve b parametresini değeri D olur.(a='C' ve b='D')

---------------
ls
sqlplus -s apps/apps <set serveroutput on;
declare
d varchar2(10);
f varchar2(10);
begin
select '&a' into f  from dual;
DBMS_OUTPUT.PUT_LINE(f);
select '&b' into d from dual;
dbms_output.put_line(d);
end;
/
C
D
exit;
EOF
---------------

Yukarıdaki script ile bash shell script'imizin içine değerlerde yapacağımız küçük değişikliklerle programımızın yönünü değiştirebiliriz.

Scriptimizin sonucu aşağıdaki gibidir.
---------------
Enter value for a: old   7: select '&a' into f  from dual;
new   7: select 'C' into f  from dual;
Enter value for b: old   9: select '&b' into d from dual;
new   9: select 'D' into d from dual;
C
D

PL/SQL procedure successfully completed.
---------------


Referanslar:


http://www.unix.com/shell-programming-scripting/24394-sqlplus-here-document-eof-vs-eof.html
http://www.oracle-base.com/articles/misc/oracle-shell-scripting.php

http://www.java2s.com/Tutorial/Oracle/0540__Function-Procedure-Packages/OutputtotheSQLplus.htm

19 Aralık 2013 Perşembe

Oracle E-Business Suite: SYSADMIN Yetkisinin Verilmesi - Giving The SYSADMIN Responsibility To Users

Her kullanıcıya "sysadmin"  yetkisini verilmesi:

 select user_name, user_id  
 from fnd_user  
 where user_name like '&username'  
 /  
   
 insert into fnd_user_responsibility(  
 USER_ID,  
 APPLICATION_ID,  
 RESPONSIBILITY_ID,  
 LAST_UPDATE_DATE,  
 LAST_UPDATED_BY,  
 CREATION_DATE,  
 CREATED_BY,  
 LAST_UPDATE_LOGIN,  
 START_DATE,  
 DESCRIPTION,  
 WINDOW_WIDTH,  
 WINDOW_HEIGHT,  
 WINDOW_XPOS,  
 WINDOW_YPOS,  
 NEW_WINDOW_FLAG)  
 values (  
 &apps_user_id, -- change this to your APPS user_id and you will have SYSADMIN Responsibility  
 1,  
 20420,  
 sysdate,  
 0,  
 sysdate,  
 1,  
 1060,  
 sysdate,  
 'System Admin',  
 5.896,  
 5.427,  
 -.042,  
 -.24,  
 'R');  


Oracle E-Business Suite: Oracle Application Kurulumu ile ilgili Bilgiler SQL - Application Info SQL

Oracle E-Business Suite Kurulumu ile ilgili bilgileri gösteren script:

 prompt --> Determining information about this Product Group  
   
 select product_group_id, product_group_name, release_name,   
   product_group_type, argument1  
  from fnd_product_groups;  
   
 prompt --> Multi-Org installed?  
 select multi_org_flag from fnd_product_groups;  
   
 prompt --> Uygulamada birden çok dil yüklü mü?  
 select multi_lingual_flag from fnd_product_groups;  
   
 prompt --> Lisanslanmış Ürünler  
   
 select decode(a.APPLICATION_short_name,  
   'SQLAP','AP','SQLGL','GL','OFA','FA',  
   a.APPLICATION_short_name) apps,  
   o.ORACLE_username, fpi.status, fpi.install_group_num,  
   fpi.product_version, fpi.sizing_factor,   
   fpi.tablespace, fpi.index_tablespace, fpi.temporary_tablespace  
 from fnd_oracle_userid o, fnd_application a, fnd_product_installations fpi  
 where fpi.application_id = a.application_id(+)  
  and fpi.oracle_id = o.oracle_id(+)  
 order by 1,2  
 /  
   
 prompt --> Kayıtlı Uygulamalar
   
 select application_id, application_short_name,  
    basepath  
 from fnd_application  
 order by application_id  
 /  
   
 prompt --> Kayıtlı Oracle Schema'larını Bulmak için  
   
 select oracle_id, oracle_username, install_group_num, read_only_flag  
 from fnd_oracle_userid  
 order by 1  
 /  
   
 prompt --> Kurulu olan dilleri bulmak için  
   
 select decode(installed_flag,'I','Installed','B','Base','Unknown')   
   installed_flag,  
   language_code, nls_language from fnd_languages  
 where installed_flag in ('I','B')  
 order by installed_flag  
 /  

Aşağıdaki raporda kurulu uygulamaların düzenli bir şekilde gösterilmesi amacıyla yaratılmıştır.

SELECT report_headings.report_date,  
     report_headings.sid_name,  
     fa.application_id appn_id,  
     decode(fa.application_short_name,  
        'SQLAP', 'AP', 'SQLGL', 'GL', fa.application_short_name ) appn_short_name,  
     substr(fat.application_name,1,50)||  
        decode(sign(length(fat.application_name) - 50), 1, '...') Application,  
     fa.basepath Base_path,  
     fl.meaning install_status,  
     nvl(fpi.product_version, 'Not Available') product_version,  
     nvl(fpi.patch_level, 'Not Available') patch_level,  
     to_char(fa.last_update_date, 'DD-Mon-YY (Dy) HH24:MI') last_update_date,  
     nvl(fu.user_name, '* Install *') Updated_by  
  FROM applsys.fnd_application fa,  
     applsys.fnd_application_tl fat,  
     applsys.fnd_user fu,  
     applsys.fnd_product_installations fpi,  
     apps.fnd_lookups fl,  
     ( SELECT to_char(sysdate, 'DD-Mon-YY HH24:MI') report_date,  
         vd.name sid_name  
       FROM v$database vd ) report_headings   
  WHERE fa.application_id = fat.application_id  
   and fat.language(+) = userenv('LANG')  
   and fa.application_id = fpi.application_id  
   and fpi.last_updated_by = fu.user_id(+)  
   and fpi.status = fl.lookup_code  
   and fl.lookup_type = 'FND_PRODUCT_STATUS'  
 UNION ALL  
 SELECT report_headings.report_date,  
     report_headings.sid_name,  
     fa.application_id,  
     fa.application_short_name,  
     substr(fat.application_name,1,50)||  
        decode(sign(length(fat.application_name) - 50), 1, '...'),  
     fa.basepath,  
    'Not Available',  
    'Not Available',   
    'Not Available',  
     to_char(fa.last_update_date, 'DD-Mon-YY (Dy) HH24:MI'),  
     nvl(fu.user_name, '* Install *')   
  FROM applsys.fnd_application fa,  
     applsys.fnd_application_tl fat,  
     applsys.fnd_user fu,  
        ( SELECT to_char(sysdate, 'DD-Mon-YY HH24:MI') report_date,  
          vd.name sid_name  
       FROM v$database vd ) report_headings   
  WHERE fa.application_id = fat.application_id  
   and fat.language(+) = userenv('LANG')  
   and fa.last_updated_by = fu.user_id(+)  
   and fa.application_id not in   
     ( SELECT fpi.application_id  
       FROM applsys.fnd_product_installations fpi )  
  ORDER by 5 

Referanslar:

1-http://www.piper-rx.com/pages/reports_free/fadm001_10.trd

22 Haziran 2012 Cuma

Oracle Veritabanı: ASM - Automatic Storage Management

ASM Nedir?

Asm veritabanındaki verileri bütün disk üzerine dağıtan, veri şebekesini yaratıp bunun düzenlemesiyle ilgilenen yapıdır. Asm verinin otomatik düzenlemesiyle ilgilenir ve disklerin ayarlanmasını sağlar.

ASM Oracle database'inde 10g sürümüyle gelen bir özelliktir. ASM database datafile'larının, controlfiles'larının ve logfile'larının yönetimini kolaylaştırır. Bunu yapmak için de komutları sql benzeri bir yapıda kurar. Bu şekilde dba'lere kolaylık sağlar.

ASM sistemi disklerin kontrolünü alır ve bunları dba'lere logical partitionlar halinde ayırma kolaylığını sağlar. Dba'ler bu şekilde  daha fazla sistem bilgisi edinmeye gerek duymazlar.

Diskler daha rahat bir şekilde eklenebilir. Tek bir komutla yeni eklene diskler sistemde gözükür ve bu diskler üzerinde mirroring ve striping işlemleri yapılır.

Yine ASM sayesinde I/O'lar bütün diskler üzerine eşit dağıtılır. Bu işlem "Striping" olarak tabir edilir. Bir data birden fazla diskte parçalı olarak saklanabilir.

Yukarıda anlattığımız striping konusunu tamamlayan bir başka özellikte "Mirroring"'dir. Her türlü bilgi kaybolma ihtimaline karşı başka disklerde mirror edilir; yani kopyalanır ve bu kopya  başka disklere dağıtılır. Bu şekilde disklerden bir tanesi bozulursa; bu bozukluktan dönme şansı doğar.

Veriler diskler arasında değiştirilebilir, dizinler başka yerlere taşınabilirler.

Aynı diskler birden fazla veritabanı tarafından paylaşılabilir.

ASM Nereye Kurulmalıdır?

ASM best practice olarak kurulumların başka bir Oracle Home'a mümkünse farklı bir diske yapılmasını tavsiye eder. Böylece "Upgrade" işlemleri veritabanını etkilemez.

ASM Kurulu Bir Database'de Instance Nasıl Başlatılır?

İlk önce +ASM instance'ı açılır. Aşağıdaki gibi giriş yapıldıktan sonra sysasm yani asm yöneticisi  veya sysdba, database yönetcisi olarak giriş yapılabilinir.


 export ORACLE_SID=+ASM  
 $ sqlplus "/ as sysdba"  




ASM'de Diskgroup Nasıl Yaratılır?

ASM'e diskgroup'ları aşağıdaki "create diskgroup" syntax'ı şeklinde eklenebilinir. Diskgroup'u önce bir tane diskten oluşturup sonra bu disk grubuna başka diskler ekleriz ve bu disk gruplarının elemanlarını arttırırız.

Bu örneğimizde oluşturduğumuz disk grubunun adı disk5'tir. External Redundancy diyerek yedekleme işini engelleriz.

ASM yedekleme seviyeleri:

  • High  : 2 kere yedeklenir.
  • Normal : 1 bir kere yedeklenir.
  • External : 0, hiç yedeklenmez.

ORCL:VOL5 diskin adıdır.


 SQL> create diskgroup disk5 external redundancy disk 'ORCL:VOL5';  
 Diskgroup created.  
 SQL> select group_number,disk_number,mode_status,name from v$asm_disk;  
 GROUP_NUMBER DISK_NUMBER MODE_STATUS  NAME  
 ------------ ----------- -------------- -------------------------------------  
       0      5 ONLINE  
       1      0 ONLINE     VOL1  
       1      1 ONLINE     VOL2  
       1      2 ONLINE     VOL3  
       1      3 ONLINE     VOL4  
       2      0 ONLINE     VOL5 

Genel olarak Oracle 2 tane disk grubunun olmasını tavsiye eder. Bir tanesi datafile'ların yönetimi için kullanılacak olandır. Diğeri de backupların bulunacağı ayrıca datafile'ların yedekleneceği bir disk grubudur. Aşağıda bununla ilgili bir örnek vardır.

 CREATE DISKGROUP data  EXTERNAL REDUNDANCY DISK '/dev/d1', '/dev/d2', '/dev/d3', ....;  
   
 CREATE DISKGROUP recover EXTERNAL REDUNDANCY DISK '/dev/d10', '/dev/d11', '/dev/d12', ....;  

Diskgroup'lara Disk Nasıl Eklenir?

Yukarıdaki örneğimizden yola çıkarak data disk grubumuza diskimizi aşağıdaki ifadeyle ekleyebiliriz. Disk'i ekledikten sonra bu disk'i isimlendirirsek bizim için kullanımı daha kolay olur. Bu /dev/d15 ismi disk Linux sistemi tarafından atanan isimdir. Bu ismi kullanırız disk'i atarken.


ALTER DISKGROUP data ADD DISK
     '/dev/d15' NAME VOL15;

Diskgroup'lardan Disk Nasıl Drop Edilir?

Disk'ler aşağıdaki ifadeyle drop edilir. Logical olarak yarattığımız, diskimize referans olarak kullandığımız VOL15 ismini silmek için kullanabiliriz.


 ALTER DISKGROUP data DROP DISK VOL15;  

ASM'deki Disk Kullanım Miktarı Nasıl Bulunur?

Aşağıdaki sorguyu kullanabilmemiz için +ASM instance'ına girmemiz gerekir.


 export ORACLE_SID=+ASM  
 $ sqlplus "/ as sysdba" 

Bu şekilde ASM tablolarına erişim sağlarız. Sonra aşağıdaki komutu gireriz.


 SQL> SELECT name, free_mb, total_mb, free_mb/total_mb*100 "%" FROM v$asm_diskgroup;   
   
 NAME               FREE_MB  TOTAL_MB     %  
 --------------------          ----------------  --------------------- -----------  
 DATA                219314  1638400 13.3858643  
 REDOLOG1            86178   102400 84.1582031  
 REDOLOG2            86178   102400 84.1582031  

Bir başka yöntemde hazır ASM instance'ındayken asmcmd command line'ına girip orada lsdg komutunu çalıştırmaktır.

 ASMCMD> lsdg  
 State  Type  Rebal Unbal Sector Block    AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name  
 MOUNTED EXTERN N   N     512  4096 1048576   11264   9885        0      9885       0 DATA/  
 MOUNTED EXTERN N   N     512  4096 1048576   10240   9906        0      9906       0 RECOVER/  

Automatic File Management Nasıl Sağlanır?

Automatic File Management'ı db_create_file_dest,db_recovery_file_dest ve db_recovery_file_dest_size parametrelerini ekleriz. Bu şekilde database file'ları artık ASM diskgruplarımızda yaratılmaya başlanır.


ALTER SYSTEM SET db_create_file_dest = '+DATA' scope=SPFILE;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE = 100G scope=SPFILE;
ALTER SYSTEM SET db_recovery_file_dest = '+RECOVER' scope=SPFILE;


ASM ile İlgili Tablo ve View'lar


 V$ASM_DISK - ASM diskleri  
 V$ASM_DISK_STAT  
 V$ASM_DISKGROUP - ASM diskgroupları  
 V$ASM_DISKGROUP_STAT
 V$ASM_OPERATION  



Referans:
http://www.dba-oracle.com/t_asm_external_redundancy.htm
http://docs.oracle.com/cd/B28359_01/server.111/b31107/asmdiskgrps.htm#OSTMG137
http://www.orafaq.com/wiki/ASM_FAQ
http://www.oracle-base.com/articles/10g/automatic-storage-management-10g.php


İlişkili Alt İfadeler (Correlated Subqueries)

İlişkili alt sorgular özel bir sorgu bir biçimidir. 2 sorgunun birbirleriyle ilişkili hale getirilmesidir. 2 veya daha fazla tablo arasında karşılaştırma yapmak istediğimizde yararlı olabilir.

Örneğin:

select <kolon1>,<kolon2>
from <tablo1> Outer_table
where <kolon1> operator (select  <kolon1>,<kolon2> from <tablo2>
                                            where <ifade1>=Outer_table.<ifade2>);

Burada outer_table ifadesi aslında bir alias (takma ad)'dır.

Bu sorgularda ayrıca inceleyeceğimiz 1 tane operatör vardır. Bu da "exists" operatörüdür. "Exists" operatörü sorgumuzun sonucunda herhangi bir cevap alıp alamadığımızı kontrol eder. Eğer bir cevap bulunursa alt sorgu çalıştırılmaya devam edilmez ve üst sorgunun sonucu döndürülür. Eğer ki cevap bulunamazsa  alt sorgunun sonuna kadar ilerleme devam ettirilir ve bulunmadığı takdirde de üst sorgu çalıştırılmaz ve hiçbir sonuç bulunamadığına dair bir ifade döndürülür.

Select first_name from departments d
where exists( Select 'Berke' from employees where first_name=d.first_name);

Üstteki ifadede Oracle "Berke" ismini veri tabanında arayacak. Bulamaması halinde üstteki sorguyu çalıştıramayıp , sonuç döndüremeyecek. Halbuki "exists" operatörü yerine "not exists" operatörü bulunsaydı; o zaman da direk üst ifade çalıştırılıp, bellirli bir sonuç döndürülecekti. Bu haldeki ifade de aşağıdaki sorguya benzeyecekti.

"Select first_name from departments;"

21 Haziran 2012 Perşembe

"Date" Yönetimi


Oracle'da date zaman zaman karıştırılabilen biraz kompleks bir yapıdır. Bunu çözmenin en kolay yolu hepsini detaylı bir şekilde yazıp görmektir. Hepsini incelersek:

Current_date : date tipindedir. Session zamanını gösterir.
Current_timestamp: timestamp with time zone tipindedir.Session zamanını gösterir.
Localtimestamp: timestamp tipindedir. Session zamanını ve tarihini gösterir.
DBtimezone : Veritabanının bulunduğu server'ın zamanını gösterir.

-Mevcut tarih durumunu nasıl görebiliriz?

Select sysdate from dual;

select snap_id, begin_interval_time, end_interval_time from dba_hist_snapshot where  begin_interval_time> sysdate-(2/24) order by 1;
#Son 2 saat içinde alınan snapshotlar. Sysdate'den saat yukarıdaki gibi çıkartılır.



-Mevcut tarih formatını nasıl değiştirebiliriz? 


Alter session set nls_date_format ='DD-MON-YYYY HH24:MI:SS';

-Yukarıda belirttiğimiz tipler tam olarak neyi simgeliyor?

Timestamp --> Yıl , ay, gün, saat, dakika, saniye ve saliseleri gösterir.
Timestamp with time zone --> Yıl , ay, gün, saat, dakika, saniye ve saliseleri gösterir. Ayrıca bulunan zaman bölgesinin saatini ,dakikasını ve bölgesini gösterir.

 -Başka hangi zaman tipleri bulunmaktadır?

interval year to month -->Yıl , ay
interval day to second -->Gün, saat, dakika, saniye

  -Hangi zamanla ilgili fonksiyonlar bulunmaktadır?

İlk fonksiyonumuz "extract "'dır. Bu fonksiyonda herhangi bir zaman tipli kolon veya veri tipli bir değerden değişken çıkartabiliriz.

select extract(month from hire_date) from employees;

İkinci göstereceğimiz fonksiyon ise "to_timestamp"'dir. Bu da bizim belirleyeceğimiz bir zaman bilgisini veri tipine çevirmemizi sağlar.

Select to_timestamp('2012-06-18 11:00:00','YYYY-MON-DD HH:MI:SS') from dual;

Diğer 2 fonksiyon ise to_yminterval ve to_dsinterval 'dır. Bunlar içlerine konan bir karakter dizisini ilk fonksiyonda interval year to month tipine , diğerinde ise interval day to second tipine dönüştürürler.


Insert İfadeleri

Insert ifadeleri genellikle ETL processlerinde çok kullanılan ifadelerdir. Tek bir dml ifadesinden daha kullanışlı ve fonksiyonel olduğu için kullanılırlar. Bu ifadelerde 4 tarz durum bulunmaktadır.

1- Unconditional insert
2- Conditional insert first
3- Pivoting insert
4- Conditional insert all

Conditional insert first:

Oracle veritabanı böyle bir ifadeyle karşılaştığında ilk önce şartları gözden geçirir. Bu şartları gözden geçirirken de "when" koşullarına bakar.  Buna göre de yapılacak kayıt ekleme işlemi gerçekleştirilir. Bu işlem değerlendirilirken de karşılaşılan ilk doğru şarta bakılır.

insert first
         when  salary <5000 then
                  into sal_low --tablo adı--  values (employee_id,last_name,salary)
         else
                  into sal_high --tablo adı--  values (employee_id,last_name,salary)
select employee_id,first_name,salary  from employees;

Conditional insert all:

Bu şartlı ifadede ise farklı şartların farklı  durumlara  yol açması nedeniyle farklı tablolara kaydın yapılması sağlanmaktadır.

insert first
         when  salary <5000 then
                  into sal_low --tablo adı--  values (employee_id,last_name,salary)
          when job_id is not null then
                  into sal_high --tablo adı--  values (employee_id,last_name,salary)
select employee_id,first_name,salary  from employees;

UnConditional insert all:

Bu ifade de hiçbir şart yoktur. Alınan değerler direk tablolara nakledilirler. Bu tarz bir ifadeyi bilgilerin çoğaltılması gerekirken veya aynı bilgiyi içeren tablolar bulunup da bunlara bilgi aktarmamız gerektiğinde kullanabiliriz.

insert all
               into --tablo_adı-- values(employee_id,last_name,salary)
               into --tablo_adı2-- values(employee_id,last_name,salary)
select employee_id,first_name,salary  from employees; 

 Pivoting insert :

Pivotlama insert'ü bir tablonun bir boyutta pivotlanıp çevrilmesi demektir. Yukarıdaki örnekten farkı ise bilgilerin hep aynı tabloya kaydedilmesidir. Bu şekilde farklı bir bakış açısı getirilir.




insert all
               into --tablo_adı-- values(employee_id,last_name,salary)
               into --tablo_adı-- values(employee_id,last_name,salary)
select employee_id,first_name,salary  from employees;

20 Haziran 2012 Çarşamba

Şema Nesnelerinin Yönetimi

Şema nesneleri; önceki konularda bahsedildiği üzere table, index, sequence gibi nesneleriydi. O zaman ilk olarak table değişiklikleriyle başlayalım.

Table üzerinde yeni sütunlar eklenebilinir, sütunlar silinebilinir veya sütunlara sabit bir değer atanabilinir. Bunların syntax'ını göstermek istersek:

Sütun eklemek ---- Alter table tablo_adı add ( kolon_adı veri_tipi [default değer]);  


Sütun çıkarnak ---- Alter table tablo_adı drop ( kolon_adı); 


Sütun değiştirmek için ----  Alter table tablo_adı modify ( kolon_adı veri_tipi [default değer];

Sütun adını değiştirmek ----Alter table tablo_adı rename column eski kolon adı to yeni kolon adı; 


KISITLAR

Kısıtlar bizim tablolarımız üzerinde belirli kurallara uymamızı sağlar. Bu kurallara örnek verirsek; bir kolonun "null" değerler içermemesi, "unique" olması yani değerlerin birbirinden ayrı olması  gibi  kurallar olabilir.

Kısıt eklenmesi:

alter table tablo_adı modify kolon_adı kısıt;  
 (alter table employees modify employee_id primary key;)

 alter table tablo_adı add kısıt_adı foreign key sütun adı references referans yaptığımız tablo ve sutun adı; 

Bu kısıtların kontrol edilidiği bir zaman var bulunmakta mıdır?

Bunun için de ayrı bir özellik konulmuştur. Bunlar: initially deferred  veya initially immediate.
Initially deferred : "transaction" bitimini bekler. Yani bir commit veya rollback gibi bir ifade ile sonlanır.
Initially immediate : Her sorgu sonunda kontrol edilir.


Kısıt çıkarılması:

 alter table tablo_ad; drop constraint kısıt_adı;  

Kısıt devre dışı bırakılması ve devreye sokulması:

 alter table tablo_adı (disable|| enable) constraint kısıt_adı; 


Tablo silinmesi:

 Drop table tablo_adı purge;  

Bir tablonun "drop" edilmesi o tabloyu hemen yok etmez. Onun yerine tablo sadece yeniden adlandırılır ve çöp kutusuna atılır. Ancak purge ifadesi kullanılırsa o tablo çöp kutusundan da silinir.

 Delete tablo_adı;  

Bu sorguyla birlikte tablo içeriği silinir. Tablo yapısı sabit kalır.

Flashback Table Kullanılması:

Öncelikle söylenmesi gereken şey, bir nesne eğer çöp kutusunda ise; o nesne geri getirilebilinir. Peki bu nasıl gerçekleştirilir?

Flashback table ifadesi ile birlikte gerekli veriler sunularak yanlışlıkla veya bilinçli bir şekilde silinmiş veriler geri getirilebilinir.

 flashback table tablo_adı to (timestamp|| scn);  

ya da çöp kutusu sorgulanarak aşağıdaki ifade çalıştırılabilinir.

flashback table tablo_adı to before drop; 

Çöp kutusu nasıl sorgulanır?

 select * from recyclebin; 


Scn nasıl bulunur ve nedir?


 select current_scn from v$database;

Scn açılımı system change number'dır. Scn'ler her sistem değişikliğinde verilirler.


External Tables

External tables yani veritabanı dışında bulunan tablolar sadece okunabilir olan , üzerine DML ( Data modification language) transaction'ları yapılamayan yapılardır. Şirketlerde veriler sadece veritabanında bulunmayıp aynı zamanda text dosyalarında, müzik dosyalarında ya da daha farklı formatlarda tutulabilinmektedir.

Şimdi bu tabloların oluşturulması için gereken adımları görelim. Bu tabloların veritabanı tarafından görülmesi için directory( dosya) tanımlanması gerekir.

Create or replace directory dosya_adı as dizin;  
 (Create or replace directory dosya as '/home/oracle/Desktop/Dosya';) 

Şimdi de dosyalarımızı içerecek external table yaratmamız lazım.

 create table tablo (sütun adı data_tipi)  
 organization external  
     (type Oracle_Loader  
      default directory <dosya>  
      access parameters  
           (records delimeted by newline nobadfile nologfile fields terminated by ','  
                (sütun adı (1..20) veritipi)  
     location('lokasyon');-- dosyanın bulunduğu yer  
   
   
     )



 create table tablo (sütun adı data_tipi)  
 organization external  
     (type Oracle_Loader  
      default directory dosya  
      
     location('lokasyon');-- dosyanın bulunduğu yer  
   
   
     )  
 as select * from dosya_adı;  



19 Haziran 2012 Salı

Kullanıcı Erişiminin Kontrolü

Kullanıcı erişimi bir veritabanı için en önemli olan durumlardan biridir. Yetki ve izinlerin dağıtılması ve bunun önemli verileri tehlikeye atılmadan yapılmasına büyük firmalarda dikkat edilir. Peki bu veritabanındaki izinler nelerdir?

1-Sistem güvenliği ile ilgili izinler
2-Veri güvenliği ile ilgili izinler

Sistem izinleri ; herhangi özel bir durumu gerçekleştirmek için gereken izinlerdir. Bununla birlikte veri güvenliği için gereken izinler veritabanı içindeki verilerin ve objelerin içeriğinin oluşturulması veya değiştirilmesini sağlayan izinlerdir.

Bu izinleri anlattıktan sonra; bu izinlerin kime verildiğini bahsetmemiz lazım. Bu izinler tabiki de kullanıcılarımıza atanır. Kullanıcılar nasıl oluşturulur o zaman?

  Create User kullanıcı_ad identified by şifre;  



Yukarıdaki syntax ile istediğimiz kullanıcıyı bir veritabanı yöneticisi olarak oluşturabiliriz. Tabiki bu konuda izinlerimizde olmalı. Bu izinlerin nasıl verildiğini görmek istersek; o da şu şekilde oluyor:

  grant yetki to kullanıcı;  



Yetkilere örnek vermek gerekirse  bu bir oturum açma izni veya herhangi bir tablo yaratma izni olabilir; çünkü bir kullanıcı yaratmamız bize bütün yetkileri sağlamaz. Bunun için yaratılan kullanıcılara izinlerin düzgün ve ayarlı bir şekilde verilmesi gerekir.

Şimdi de bu rollerin nasıl daha düzgün verilebileceğinden bahsedelim. Örneğin bir toplulukta aynı işi yapan bir sürü çalışan var. Bu çalışanlara çalıştıkları göreve göre izinlerin teker teker verilmesi yerine direk bir role tanımlanıp bu kullanıcılara dağıtılabilinir. Hemen örneğini yaparsak;

 Create role rol_adı;  

  grant yetki to rol_adı;  grant rol_adı to kullanıcı_adı;  





Rollerden bahsettikten sonra obje izinleri ve bunların ne işe yaradığını anlatabiliriz. Obje yani veritabanı nesneleri ve bunlar üzerine olan yetki ve izinler çok çeşitlilik göstermektedir. Bu nesnelerin sahipleri ancak bu izinleri dağıtabilir.

Veritabanı nesnelerine örnek verirsek " table, index, view, sequence " gibi biri sürü nesne söylenebilinir.Verilme şekli şu şekildedir:

Grant yetki on nesne to kullanıcı    
  ; -- hangi nesne üzerine verecek isek; örneğin bir employees tablosu olabilir 

Kaldırılması ise yine benzer bir şekilde yapılmaktadır.

 Revoke yetki  on nesne  from kullanıcı;