PLSQL-TSQL ile Dosya Kontrolü, Boyut Öğrenmek

PL/SQL ile dosya kontrolü yapmak, boyutunu öğrenmek

PL/SQL ile bir oracle directorysinde dosya var mı kontrolü ve dosyanın boyutunu öğrenelim.
PLSQL ile dosyayı okuyacağımız dizinin oracle tarafında directory olarak tanımlanmış olması ve ilgili kullanıcının bu dizine read hakkı olması gerekiyor.

Önce directory’leri create edelim ve HR userına yetki verelim.(SYS)

SQL> create or replace directory hr_dir as '/home/oracle';
Directory created.
SQL> grant read, write on directory hr_dir to hr;
Grant succeeded.

Fonksiyonumuzu create edelim.(HR)

create or replace function FileExists(
p_DirName in varchar2,
p_FileName in varchar2
) return number
is
l_file_loc bfile;
begin
l_file_loc := bfilename(upper(p_DirName), p_FileName);
return dbms_lob.fileexists(l_file_loc);
end FileExists;

Fonksiyonumuzu directory ismi ve dosya ismi vererek test edelim.(HR)

SQL> select HR.FileExists1('hr_dir','deneme.txt') dosya_varmi from dual;
DOSYA_VARMI
-----------
1
SQL> select HR.FileExists1('hr_dir','deneme_test.txt') dosya_varmi from dual;
DOSYA_VARMI
-----------
0

Dosyamızın boyutunu plsql kodumuzda öğrenmek istersek;

 DECLARE
 v_fexists      BOOLEAN;
 v_file_length  NUMBER;
 v_block_size   BINARY_INTEGER;
 BEGIN
  UTL_FILE.FGETATTR('hr_dir', 'deneme_test.txt', v_fexists, v_file_length, v_block_size);
  DBMS_OUTPUT.PUT_LINE (v_file_length);
END;

T-SQL ile dosya kontrolü yapmak, boyutunu öğrenmek

create FUNCTION dbo.fc_FileExists(@path varchar(8000))
RETURNS BIT
AS
BEGIN
     DECLARE @result INT
     EXEC master.dbo.xp_fileexist @path, @result OUTPUT
     RETURN cast(@result as bit)
END;
GO

Fonksiyonumuzu test edelim.

select dbo.fc_FileExists('C:\deneme_test.txt');
-----
1
select dbo.fc_FileExists('D:\notlar\deneme_test.txt');
-----
0

Linux Üzerinde Ssh-Keygen Yapılandırması

Linux Üzerinde Ssh-Keygen Yapılandırması

Ssh-Keygen yapısında private key ve onu tamamlayan public key olmak üzere iki anahtar bulunur.Kullanıcı private keyini source sunucuda, public keyini target sunucuda bulundurursa bu iki anahtarın eşleşmesi ile şifreler kullanılmadan target sunucuya giriş yapabilir.

Örneğimizde; Oracle Ent. linux 6.5 kurulu iki sunucu arasında password gerektirmeden ssh bağlantısı yapmaya çalışacağız. Yedek kopyalama vb schedule işlemlerde lazım olabiliyor. Oracle RAC kurulumunda bu işlem zaten yapılıyor, nodelar birbirine trusted bir şekilde bağlanabiliyor, ama şu anki durumumuzda iki ilişkisiz server üzerinde yapacağız.

Os: Oracle Ent. Linux 6.5
Server 1: omerlinux
Server 2: omerlinuxcopy
user: oracle( her iki sunucuda)

Adımlar:

1- Home dizini altında .ssh folderı oluşturulur, yetkileri verilir.(Her iki sunucuda oracle userı ile)

[oracle@omerlinux ~]$ pwd
/home/oracle
[oracle@omerlinux ~]$ mkdir .ssh
[oracle@omerlinux ~]$ chmod 700 .ssh

2- id_rsa.pub dosyası oluşturulur.(gelen sorulara enter yapılır geçilir,her iki sunucuda oracle userı ile)

[oracle@omerlinux ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/oracle/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/oracle/.ssh/id_rsa.
Your public key has been saved in /home/oracle/.ssh/id_rsa.pub.
The key fingerprint is:
8f:63:61:23:39:c4:a2:bc:f6:6e:ee:7a:a0:84:3c:2c oracle@omerlinux.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|     .           |
|    . o          |
| . . o .         |
|+ o   + S        |
|E=..   + =       |
|o.+.    + .      |
|.. .o  . .       |
|  .B=            |
+-----------------+

3- id_rsa.pub dosyasından authorized_keys dosyası oluşturulur.(Her iki sunucuda oracle userı ile)

[oracle@omerlinux ~]$ cd /home/oracle/.ssh/
[oracle@omerlinux .ssh]$ cat id_rsa.pub >> authorized_keys
[oracle@omerlinux .ssh]$ ls
authorized_keys  id_rsa  id_rsa.pub

4- Sunucularda oluşturulan authorized_keys dosyası öteki sunucuya yeni isim ile kopyalanır.(Her iki sunucuda oracle userı ile)

Kopyalama işleminde oracle user şifresi girilir, bu makaledeki adımlar bittikten sonra şifre girmemize gerek kalmayacak. omerlinux makinesindeki authorized_keys dosyası omerlinuxcopy makinesine authorized_keys_1 adıyla kopyalanır. omerlinuxcopy makinesindeki authorized_keys dosyası omerlinux makinesine authorized_keys_2 adıyla kopyalanır.

[oracle@omerlinux .ssh]$ scp authorized_keys omerlinuxcopy:/home/oracle/.ssh/authorized_keys_1
The authenticity of host 'omerlinuxcopy (192.168.1.250)' can't be established.
RSA key fingerprint is 99:99:e0:7c:c7:c2:d6:2c:46:46:7e:9d:bf:82:94:72.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'omerlinuxcopy,192.168.1.250' (RSA) to the list of known hosts.
oracle@omerlinuxcopy's password: 
authorized_keys                                                             100%  410     0.4KB/s   00:00

5- Öteki sunucudan gelen authorized_keys_1 içindeki text lokal sunucunun authorized_keys dosyasına yazılır.İki sunucuda da bu işlem yapılmalıdır. 1. Sunucunun authorized_keys içeriği 2. sunucunun authorized_keys dosyasına kopyalanmalı ve tersi de yapılmalıdır. Sonunda her iki sunucuda da aşağıdaki gibi bir authorized_keys dosyası oluşmalıdır.

[oracle@omerlinux .ssh]$ cat authorized_keys
ssh-rsa 
AAAAB3NzaC1yc2EAAAABIwAAAQEA4eA8swmNSFEApCmSyhhe15QPFY+NTAwMuqXePu8zfcpFNSG95HPGzKn9V2K4gwRPgy57X3F1hivzRJ1Gd0seTDL
liyUpdA/QgPE+M1jwlG0T4w1PbELsqQhn16+S4DqP94WpG3jrkw7S7vytehA1zQ/b36M7M378Eez/DJFx3WPLHEieBEDNx0ExuFiltYqf2OR3/qSWui
OBNqBPsFvzrVVeJVzCFvitzMNW/U0PU4Sdj7vLo5k2YNdAEFuqLD6P7DroCPXFLT0WzqMvlc29I3JSZOg55GODptQceZ88XpY8UqrPbI0Gvm2OqAbOZ
CEktfJwMbFWjPbBK0WiN6BdQQ== oracle@omerlinux.localdomain
ssh-rsa 
AAAAB3NzaC1yc2EAAAABIwAAAQEAts1bAjVXyQD+7Y6ipO7bQaFpCFK6u3S4yZbC047b3cX7plr+m4lMhfFQOvkr9xqTB8SPTf5GlVWwhOGqjikDUq+
QZOGCUD06zJPIMKZ3fPAmJBucFfuibOC0F2oc7indZAEarVW0W5cZ6VZkBmLYsI3WStQAWMAZHKOLlJccsCIqeZe+fr2eAMeVw9b6DT6XKOiD3/A477
DT5d2g6V594pGTS2Il5D7fvpXtKJIv91C8ytfpaFRaWtcGe9x+Mg8zzze2UeOnUgWTu1PWDMqV+4e45tE5lUnOIM/cd6sqj9mIsj/gYg8rKwZP2kKjV
AagNnNCd5WB06tnscImGQP8hw== oracle@omerlinuxcopy.localdomain

6- Sunucularda network servisi restart edilir.(Her iki sunucuda root userı ile)

[oracle@omerlinux .ssh]$ 
[oracle@omerlinux .ssh]$ su - root
Password: 
[root@omerlinux ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

7- Sonuç test edilir. 1. sunucudan 2. sunucuya dosya kopyalanır, 2. sunucudan 1. sunucuya dosya kopyalanır, şifre girmenize gerek kalmadan yapabilmemiz gerekiyor.

[root@omerlinux ~]# su - oracle
[oracle@omerlinux ~]$ pwd
/home/oracle
[oracle@omerlinux ~]$ touch copy1_test.txt
[oracle@omerlinux ~]$ ls
copy1_test.txt  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
[oracle@omerlinux ~]$ scp copy1_test.txt omerlinuxcopy:/home/oracle/
copy1_test.txt                                                              100%    0     0.0KB/s   00:00    
[oracle@omerlinux ~]$

Görüldüğü gibi şifresiz trusted bağlantı sağlanmış oldu. Biz makalemizde iki sunucu içinde ssh-keygen ayarlarını yaptık istenirse tek taraflı da yapılabilir, source sunucuda oluşturulan authorized_keys dosyasının içeriği target sunucunun authorized_keys dosyası içine yazılırsa işlem tamamdır, örnekte iki sunucu içinde bu işlemi yaptık.

Umarım faydalı olur.

Ekran görüntüleri aşağıdaki gibidir.

 

MongoDb Database Klonlama

MongoDb Database Klonlama

Mongodb bu konuda db.copyDatabase fonksiyonu ile işleri çok kolaylaştırmış durumda.
Örneğimizde “omer” adlı database’i aynı host üzerinde “clone” ismiyle birebir kopyalayalım.
SourceDb(omer) > CloneDb(Clone)
db.copyDatabase fonksiyonun genel kullanımı aşağıdaki şekildeki gibidir.

db.copyDatabase(fromdb, todb, fromhost, username, password, mechanism)

fromhost, username, password başka bir hosttan klonlama yapmak istersek burada devreye giren parametreler, biz aynı host üzerinde klonlama yapacağımız için bu parametreleri boş geçiyoruz.

> db.copyDatabase("omer","clone")
{ "ok" : 1 }
> show dbs
clone  0.000GB
local  0.000GB
omer   0.000GB
omer2  0.000GB
>

Hepsi bu kadar.

Mongodb aynı hossta database kopyalama

Mongodb database klonlama

PLSQL Metni Tersten Yazdırmak

PL/SQL Metni Tersten Yazdırmak

Verilen bir metni tam tersten yazdırmak için oracle’ın kendi reverse fonksiyonunu kullanabiliriz,
Eğer daha farklı işlemler yaptırmak için kendi fonksiyonunuza ihtiyaç duyarsanız fonksiyon ve prosedür yazalım.Bu fonksiyon-prosedür ne işimize yarayacak demeyin, bir yerlerde ihtiyaç oluyor.

Oracle Reverse fonksiyonu nasıl kullanılır?

select reverse('122323') from dual;
323221
 
select reverse('www.OmerAcar.com.tr') from dual;
rt.moc.racAremO.www
 
select reverse('ReverseTextTest') from dual;
tseTtxeTesreveR

Metni ters çevirme işlemini bir de fonksiyon ve prosedüre ile yapalım.

– Metni ters çevirmek için pl/sql fonksiyon

CREATE OR REPLACE FUNCTION TerstenYazFunc(metin_ IN varchar2) 
  RETURN VARCHAR2 IS
  sonuc_metin_ varchar2(50);
BEGIN   
        FOR i in reverse 1..length(metin_) LOOP
                 sonuc_metin_ := sonuc_metin_||''||substr(metin_, i, 1);
        END LOOP;
        return(sonuc_metin_);
END;
 
--Fonksiyonu test edelim.
select TerstenYazFunc('Deneme12345') from dual;
54321emeneD

– Metni ters çevirmek için pl/sql procedure.

CREATE OR REPLACE PROCEDURE TerstenYazProc(metin_ IN varchar2) IS
        sonuc_metin_ varchar2(50);
BEGIN
        FOR i in reverse 1..length(metin_) LOOP
                 sonuc_metin_ := sonuc_metin_||''||substr(metin_, i, 1);
        END LOOP;
        dbms_output.put_line(sonuc_metin_);
END;
/
 
--Prosedürü test edelim.
set serveroutput on;
 
BEGIN
TerstenYazProc('Deneme12345');
END;
 
anonymous block completed
54321emeneD

ASM Spfile Farklı Diske Taşımak

ASM Spfile’ı Farklı Bir ASM Diske Taşımak.

ASM Spfile’ı farklı bir ASM disk gruba nasıl taşıyabiliriz? Hem RAC hem single ortamda örnekle yapalım.
RAC ve single instance için aslında aynı işlemler yapılıyor, işlem sonunda kapatıp açmak dışında
bir fark yok. Örneğimizde ASM spfile +DATA diskinde bulunuyor, spfile’ı yeni eklediğimiz(eklendiğini varsayıyorum) +DATANEW diskine taşıyacağız.

Ortamlar:
Solaris 10
Oracle 11.2.0.4 RAC

Mevcut +ASM spfile neredeymiş öğrenelim.

-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/grid
-bash-3.2$ export ORACLE_SID=+ASM
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysasm
 
SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 29 13:42:26 2017
 
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 Automatic Storage Management option
 
SQL> show parameter spfile;
 
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATA/asm/asmparameterfile/reg
istry.253.938787283

Spfile’dan geçici bir pfile create edelim.(/tmp/ altına)

SQL> create pfile='/tmp/initASM.ora' from spfile;
 
File created.

Bu geçici pfile’dan yeni diskimize Spfile create edelim.
(ismini ve pathini ASM otomatik verecek,+DATANEW yazmamız yeterli)

SQL> create spfile='+DATANEW' from pfile='/tmp/initASM.ora';
 
File created.
 
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Automatic Storage Management option

ASM Instance’ını kapatıp açalım, RAC ve Single Instance ortamlarda ayrı ayrı yaptım..

RAC ortamlarda:

-bash-3.2$ crsctl stop has
[oracle@localhost ~]$ crsctl start has
CRS-4123: Oracle High Availability Services has been started

Single Instance ortamlarda :

-- Database(ler) kapatılır.
-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/db
-bash-3.2$ export ORACLE_SID=test
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysdba
SQL> shutdown immediate;
 
--ASM kapatılır
-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/grid
-bash-3.2$ export ORACLE_SID=+ASM
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysasm
SQL> shutdown immediate;
 
--ASM açılır..
-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/grid
-bash-3.2$ export ORACLE_SID=+ASM
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysasm
SQL> startup;
 
-- Database(ler) açılır.
-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/db
-bash-3.2$ export ORACLE_SID=test
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysdba
SQL> startup;

ASM Spfile’ın yeni lokasyonu kontrol edilir..

-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/grid
-bash-3.2$ export ORACLE_SID=+ASM
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ asmcmd
ASMCMD> spget
+DATANEW/asm/asmparameterfile/registry.313.236767881

Ya da;

-bash-3.2$ export ORACLE_HOME=/oragrid/app/product/11.2.0.4/grid
-bash-3.2$ export ORACLE_SID=+ASM
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH
-bash-3.2$ sqlplus / as sysasm
 
SQL*Plus: Release 11.2.0.4.0 Production on Wed Mar 29 13:42:26 2017
 
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 Automatic Storage Management option
 
SQL> show parameter spfile;
 
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATANEW/asm/asmparameterfile/reg
istry.313.236767881

Görüldüğü gibi ASM spfile yeni ASM diskine taşınmış oldu..

Faydalı olması dileğiyle!

IFS ERP-Satış Siparişi Fiyat Güncellemek

IFS ERP-Satış Siparişi Fiyat Güncellemek

Aşağıdaki plsql blok ile, IFS satış siparişinin fiyatları fiyat listesi ile yeniden güncellenmiş olur, production ortamlarda denemeden önce test ortamlarında sonuçlarını görünüz.Tabi statüsü planned ve released olan satırlar için geçerlidir. Currency TL olarak alınmıştır, dövizli satışlarda kur ve yabancı para değerlerini hesaplayıp göndermek gerekir.

DECLARE
info_ VARCHAR2(2000);
objid_ VARCHAR2(2000);
objversion_ VARCHAR2(2000);
attr_ VARCHAR2(2000);
BEGIN
FOR rec_ IN (
 
SELECT k.*,
NVL((SELECT fl.sales_price
FROM IFSAPP.SALES_PRICE_LIST_PART fl
WHERE fl.price_list_no='Fiyat Listesi No'
AND fl.catalog_no =k.catalog_no),0) fiyat ,
k.sale_unit_price satıs_fiyati
FROM customer_ordeR_line k
WHERE k.order_no IN ('&SIP_NO')
AND k.sale_unit_price=0
 
) LOOP
 
Client_Sys.Clear_Attr(attr_);
Client_Sys.Add_To_Attr('SALE_UNIT_PRICE',rec_.fiyat,attr_);
Client_Sys.Add_To_Attr('BASE_SALE_UNIT_PRICE',rec_.fiyat,attr_);
Client_Sys.Add_To_Attr('CURRENCY_RATE',1,attr_);
 
IFSAPP.Customer_Order_Line_api.Modify(attr_,rec_.order_no,rec_.line_no,rec_.rel_no,rec_.line_item_no);
 
END LOOP;
END;

IFS ERP- Toplu Sipariş İptal Etmek

IFS ERP- Toplu Sipariş İptal Etmek

IFS ERP satış siparişlerinde topluca iptal etmeniz gerekirse aşağıdaki scriptleri kendinize göre uyarlayıp kullanabilirsiniz. Lütfen kullanmadan önce test ortamlarında yazdığınız scriptin sonuçlarını görün.

1. Satırı Olmayıp Başlığı Planlı Statüsünde Bekleyenlerin İptali.

DECLARE 
BEGIN 
FOR rec_ IN (
SELECT k.order_no,k.Date_Entered
 FROM  IFSAPP.customer_order_tab k
WHERE  k.date_entered > SYSDATE-10 
AND    k.Rowstate LIKE 'Plan%'
AND    ( SELECT COUNT(*) FROM customer_ordeR_line cl
            WHERE cl.order_no=k.order_no)=0
           ) LOOP
IFSAPP.Customer_order_api.Set_Cancelled(rec_.order_no);
END LOOP;
END;

2. Tüm Satırları İptal Olup Başlığı İptal Olmayan Siparişlerin İptali

Bu case normalde olmaması gereken bir durumdur, manuel update edilmiş kayıtlar vardır, ve sipariş başlığı unutulmuştur, temizlenmesi gerekir.

DECLARE 
BEGIN 
FOR rec_ IN (
SELECT k.order_no
 FROM  IFSAPP.customer_order_tab k
WHERE  k.date_entered > SYSDATE-10 
AND    k.Rowstate LIKE 'Releas%'
AND    (SELECT COUNT(*) FROM IFSAPP.customer_ordeR_line cl
            WHERE cl.order_no=k.order_no
              AND cl.objstate='Cancelled')= 
       (SELECT COUNT(*) FROM IFSAPP.customer_ordeR_line cl
            WHERE cl.order_no=k.order_no)
             ) LOOP
IFSAPP.Customer_order_api.Set_Cancelled(rec_.order_no);
END LOOP;
END;

Umarım faydalı olur.

Databasede Tablo Kolonu Arama-Bulma

Databasede Tablo Kolonu Arama-Bulma

Bir kolon hangi tablolarda bulunuyor, tipi ve boyutu nedir, nasıl arayıp buluruz beraber bakalım.
Örneğimizde “musteri_no” kolonu hem oracle hem mssql üzerinde hangi tablolarda geçiyor select çekerek
listeleyelim. Tabi biz burada müşteri no bilgisinin sadece “musteri_no” adlı kolonda geçtiğini varsayıyoruz, yazılımcı ya da database tasarımsıcısı arkadaş hem “musteri_no” hem “customer_no” gibi kolonlar kullanmış olabilir, bu ihtimalleri de göz önünde bulundurmak ve alternatif isimleri de kontrol etmek gerekir. Veritabanı yapısını öğrenmek, tablolar hakkında bilgi sahibi olmak, tablo ilişkilerini çıkarmak amaçlı faydalı olacaktır.

Oracle Tablo Kolonu Arama-Bulma

* Oracle’da aranacak kolon adını küçük harfle yazınız.(musteri_no)

SELECT 'COLUMN' type,owner,table_name,column_name,column_id,data_type
FROM sys.dba_tab_cols
where column_name like '%musteri_no%';

MSSQL Tablo Kolonu Arama-Bulma

* Mssql belirtilen database’de aranan kolonu bulmak

Use DBADI 
go 
SELECT COLUMN_NAME, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%musteri_no%'

MSSQL Tüm Databaselerde Kolon Arama-Bulma

* Tüm MSSQL instance databaselerini aramak için EXEC sp_MSforeachdb kullanıyoruz.

-- MSSQL instancedaki tüm dbler üzerinde kolon aramak
EXEC sp_MSforeachdb 'Use ?;
SELECT DB_ID() DATABASE_ID,DB_NAME(db_id()) DATABASE_NAME,TABLE_NAME,COLUMN_NAME,DATA_TYPE
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE ''%musteri_no%'''

Oracle ve Mssql Database Size Sorgulamak

Oracle ve Mssql Database Size Sorgulamak

Bu makalede Oracle ve MSSQL de database size nasıl hesaplarız, beraber bakalım..

Oracle Database Size Sorgulamak

Oracle veritabanı boyutunu aşağıdaki sql ile bulabiliriz, bunun dışında Enterprise managar ya da Grid control ile görüntülemek de mümkün.Tablespace bazında toplam alan, kullanılan alan ve kullanım yüzdesini hesaplar.

Oracle Tablespace Size Query.

SELECT DF.TABLESPACE_NAME TABLESPACE,
DF.TOTALSPACE TOTAL_MB,
TOTALUSEDSPACE USED_MB,
(DF.TOTALSPACE-TU.TOTALUSEDSPACE) FREE_MB,
ROUND(100 * ((DF.TOTALSPACE-TU.TOTALUSEDSPACE)/DF.TOTALSPACE),2) PCT_FREE
FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024)) TOTALSPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) DF,
(SELECT ROUND(SUM(BYTES)/(1024*1024)) TOTALUSEDSPACE,
TABLESPACE_NAME
FROM DBA_SEGMENTS
GROUP BY TABLESPACE_NAME) TU
WHERE DF.TABLESPACE_NAME = TU.TABLESPACE_NAME
UNION ALL
SELECT TABLESPACE_NAME,
(BYTES_USED+BYTES_FREE)/1024/1024 TOTAL_MB,
BYTES_USED /(1024*1024) USED_SIZE,
BYTES_FREE /(1024*1024) FREE_SIZE,
ROUND(BYTES_FREE/(BYTES_USED+BYTES_FREE),2) PCT_FREE
FROM V$TEMP_SPACE_HEADER
ORDER BY 5 ASC;

Temp datafile’da dahil tüm datafile’ların toplam boyutu, kullanılan datafile alanı, allocate edilmiş ama kullanılmayan boş alanın boyutunu da aşağıdaki sql ile bulabiliriz.

Oracle Datafile Size Query

SELECT TABLESPACE_NAME,
FILE_ID,
(INCREMENT_BY * 8) / 1024 EXTEND_SIZE_MB,
FILE_NAME,
TOTAL_SIZE_MB,
TOTAL_SIZE_MB - FREE_SPACE_MB USED_SPACE_MB,
FREE_SPACE_MB,
ROUND(FREE_SPACE_MB / TOTAL_SIZE_MB * 100) FREE_PCT,
STATUS,
ONLINE_STATUS
FROM (SELECT B.TABLESPACE_NAME,
B.FILE_ID,
B.FILE_NAME,
(B.BYTES / 1024 / 1024) TOTAL_SIZE_MB,
ROUND((SELECT SUM(A.BYTES) / 1024 / 1024
FROM DBA_FREE_SPACE A
WHERE A.FILE_ID = B.FILE_ID)) FREE_SPACE_MB,
B.STATUS,
B.ONLINE_STATUS,
B.INCREMENT_BY
FROM DBA_DATA_FILES B);

Oracle Redo log gruplarını ve boyutlarını görmek istersek aşağıdaki sql işimizi görecektir.

Oracle Redo Log Size Query.

select group#,thread#,(bytes/1024/1024)Size_mb,status,archived from v$log ORDER BY 1,2;

MSSQL Database Size Sorgulamak

Aşağıdaki sql ile Mssql database’lerin boyutunu öğrenebiliriz.(*8 Blok size)

with db_size
as
( select database_id, type, size * 8/1024 size
from sys.master_files)
select
name,
(select sum(size) from db_size where type = 0 and db_size.database_id = db.database_id) DataFileSizeMB,
(select sum(size) from db_size where type = 1 and db_size.database_id = db.database_id) LogFileSizeMB
from sys.databases db

TSql Plsql iki tarih arasındaki zaman farkı

PL/SQL İki Tarih Arasındaki Farkı Bulmak

Plsql’de iki tarihin farkını aldığımızda default olarak gün farkını verir, eğer saat, dakika, saniye cinsinden elde etmek istersek bir takım hesaplamalar yapmamız gerekli.(saat-dakika-saniye hesaplamaları)
Bu işlemler nerelerde kullanılır; bu personel ne kadar süredir çalışıyor, bu sipariş ne kadar süredir bekliyor vs gibi soruların cevaplarını bulabiliriz.

Şimdi bir örnekle gösterelim.

10 gün öncesi ile şu an arasındaki farkı bulalım, SYSDATE fonksiyonu plsql’de şimdiki tarihi verir.

select
ROUND(months_between(sysdate,(sysdate-10))/12,1) yil_farki,
ROUND(months_between(sysdate,(sysdate-10)),1) ay_farki,
(sysdate - (sysdate-10)) gun_farki,
(sysdate - (sysdate-10)) * 24 saat_farki,
(sysdate - (sysdate-10)) * 24 * 60 dakika_farki,
(sysdate - (sysdate-10)) * 24 * 60 * 60 saniye_farki,
(sysdate - (sysdate-10)) * 24 * 60 * 60 * 1000 milisaniye_farki
from dual;

Sorgumuzun çıktısı aşağıdaki gibidir..

yil_farki ay_farki gun_farki saat_farki dakika_farki saniye_farki milisaniye_farki
0 0,3 10 240 14400 864000 864000000

MSSQL (T-SQL) iki tarih arasındaki farkı bulmak

Mssqlde iki tarih arasındaki fark nasıl alınır, bunu da bir örnekle açıklayalım, t-sql de bunun için hazır bir fonksiyon mevcut, DATEDIFF fonksiyonunu kullanacağız, örnek için ele alacağımız iki tarih içinde GETDATE() fonskiyonunu kullanacağız. GETDATE() fonksiyonu T-SQL de şu anki zamanı döndürür.
DATEDIFF genel kullanımı DATEDIFF ( datepart , startdate , enddate )  şeklindedir.

declare @ilktarih datetime =getdate()-10  --10 gün önceki zaman
declare @sontarih datetime =getdate()     --Şimdiki zaman
 
Select DATEDIFF(YEAR,@ilktarih,@sontarih) yil_farki,
DATEDIFF(MONTH,@ilktarih,@sontarih) ay_farki,
DATEDIFF(DAY,@ilktarih,@sontarih) gun_farki,
DATEDIFF(HOUR,@ilktarih,@sontarih) saat_farki,
DATEDIFF(MINUTE,@ilktarih,@sontarih) dakika_farki,
DATEDIFF(SECOND,@ilktarih,@sontarih) saniye_farki,
DATEDIFF(MILLISECOND,@ilktarih,@sontarih) milisaniye_farki

Sorgumuzun çıktısı aşağıdaki gibidir..

yil_farki ay_farki gun_farki saat_farki dakika_farki saniye_farki milisaniye_farki
0 0 10 240 14400 864000 864000000