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

PHP: Oracle SQL Injection

 Cross-Site Scripting: Persistent web güvenliği açısından çok önemli ve dikkat edilmesi gerken bir durumdur. PHP kodu ile Oracle SQL de injection engellemek için aşağıdaki yöntemi kullanabilirsiniz. Bir oracle bağlantısı kurabilmek için ilk olarak sorgu hazırlanır.

query="select * from tablo where userID=:user"

$user="username";

$parse = oci_parse($connectora, $query);

oci_bind_by_name($parse, ':user', $username);

$r = oci_execute($parse)

XSS

ORACLE SQL: IP Adresinin Dahil Olduğu IP Bloğunu Bulma

 Database'de bulunan bir tablonun ilgili kolonunda listelenmiş network blokları içinde (IP_Adresi/Subnet) bir IP adresinin hangi bulağa ait olduğunu bulmak için aşağıdaki sorgu kullanılabilir

Burada database kolonunda bulunan veri ör:IP_RANGE=192.168.1.0/30 şeklinde arana IP adresi ör:IP_Adresi=192.168.1.3 olabilir. Bu durumda sorgumuz;

WITH subnet_table AS (
  SELECT IP_RANGE,  regexp_substr(IP_RANGE, '(.*)/', 1, 1, null, 1) as network, 
         to_number(regexp_substr(IP_RANGE, '/(.*)', 1, 1, null, 1)) as subnet_mask_length
  FROM Tablo_adi
)
SELECT IP_RANGE, network, subnet_mask_length
FROM subnet_table
WHERE 
to_number(regexp_substr('IP_Adresi', '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 2)) * 65536 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 3)) * 256 +
to_number(regexp_substr('IP_Adresi', '\d+', 1, 4))
BETWEEN 
to_number(regexp_substr(network, '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr(network, '\d+', 1, 2)) * 65536 +
to_number(regexp_substr(network, '\d+', 1, 3)) * 256 +
to_number(regexp_substr(network, '\d+', 1, 4))
AND 
to_number(regexp_substr(network, '\d+', 1, 1)) * 16777216 +
to_number(regexp_substr(network, '\d+', 1, 2)) * 65536 +
to_number(regexp_substr(network, '\d+', 1, 3)) * 256 +
to_number(regexp_substr(network, '\d+', 1, 4)) + power(2, 32 - subnet_mask_length) - 1
ORDER BY subnet_mask_length DESC

Bu sorguda;

subnet_table : Tablonun kolonunda bulunan IP_RANGE=192.168.1.0/30 şeklindeki veriyi network=192.168.1.0 ve subnet_mask_length=30 şekline dönüştürür.

Sorgu ise IP_Adresi ve subnet_table'dan gelen network bilgilerini Decimal IP adresine dönüştürerek en küçün network IP'sinden en büyük network IP'si aralığında IP_Adresi bilgisinin olup olmadığına bakar.


subnet_table kısmı aşağıdaki gibi de yazılabilir.

select substr(IP_RANGE,1,length(IP_RANGE)-3) AS network, substr(IP_RANGE,-2,2) AS subnet_mask_length FROM Tablo_adi

veya

select substr(IP_RANGE, 1, INSTR(IP_RANGE, '/') - 1) as network, SUBSTR(IP_RANGE, INSTR(IP_RANGE, '/') + 1) as subnet_mask_length FROM Tablo_adi



Oracle SQL Bir Hücreye 4000 Karkterden Fazla Veri Yazmak

 Oracle SQL'de bir hücreye 4000 karekterden fazla veri yazmayı istiyorsanız kolon tipi olarak CLOB kullanmalısınız. VARCHAR2 ve benzeri kolonlara maximum 4000 karekter veri yazabilirsiniz. 4000 karekterden uzun veriyi tabloya yazmayı denediğinizde aşağıdaki gibi bir hata alırsınız.

General Exception: ORA-01704: string literal too long 

Bu hatayı almanız, veritabanına yazmak istediğiniz verinin uzunluğunun veritabanı tarafından desteklenmeyen bir değere ulaştığı anlamına gelir. Oracle veritabanında, bir string literal'in maksimum uzunluğu 4000 karakterdir. Eğer veritabanına yazmak istediğiniz veri bu uzunluğu aşıyorsa, CLOB veri tipi kullanmanız gerekir. GENIS_KOLON isimli CLOB Kolon aşağıdaki gibi oluşturulabilir.

CREATE TABLE "DB"."TABLO" 
   (  "NORMAL_KOLON" VARCHAR2(200), 
      "GENIS_KOLON" CLOB
   );

Bu kolona database client üzerinden istediğiniz uzunlukta veri yazabilirsiniz. Python gibi bir yazılımdan veri göndermek istiyorsanız verinin CLOB'a dönüştürülmesi gerekir. Oracle veritabanına 4000 karakterden fazla veri yazmak için Python'da cx_Oracle modülü kullanılabilir. İlgili sütun tipinin database'de CLOB (Character Large Object) tipi olduğundan emin olun. Python için örnek bir kod aşağıdaki gibidir:

import cx_Oracle
# Veritabanı bağlantısının açılması
conn = cx_Oracle.connect("username/password@hostname:port/sid")
# Veritabanı işlemleri için bir cursor oluşturulması
cursor = conn.cursor()
# Veriyi içeren değişken
long_data = "Long data here..." * 1000
# Veritabanı tablosuna veri yazma
cursor.execute("""
    INSERT INTO table_name (column_name)
    VALUES (:data)
""", data=cx_Oracle.CLOB(long_data))
# Değişikliklerin veritabanına kaydedilmesi
conn.commit()
# Bağlantının kapatılması

conn.close()

Bu kod parçacığında, cx_Oracle.CLOB() fonksiyonu ile veriyi CLOB veri tipine dönüştürülür ve veritabanına kaydedilir.


Oracle SQL ve Postgre SQL de Pivot Nasıl Yapılır

 Oracle SQL'de aşağıdaki gibi yaptığımız Pivot işlemini PostgreSQL'de yapabilmek için Crosstab komutu kullanılır. Yapacağımız örnekte dört kolona sahip bir tablo düşünelim. KolonBilgiler kolonu aynı kolona yazılmış bilgi başlıklarını, KolonDegerler kolonu bilgi başlıklarına karşılık gelen değerleri içersin. Çıktı olarak ilk iki kolonu tablodan gelecek diğer dört kolonu bilgi başlıklarının kolon olarak gösterileceği bir yapı olsun. Toplamda altı kolon oluşturacağız.

SELECT * FROM
(SELECT Kolon1, Kolon2, KolonBilgiler, KolonDegerler FROM Tablo_adı
) d PIVOT (
MAX(KolonDegerler )
FOR KolonBilgiler
IN (Bilgi1, Bilgi2, Bilgi3,Bilgi4
)) piv
WHERE .....

Yukarıdaki Oracle SQL Pivot sorgusunun Postgre DB karşılığı aşağıdaki gibidir.

SELECT *
FROM crosstab ('SELECT "Kolon1", "Kolon2", "KolonBilgiler", "KolonDegerler ", FROM "Tablo_adı" ORDER  BY 1,2'
, $$SELECT unnest('{Bilgi1, Bilgi2, Bilgi3,Bilgi4}'::text[])$$
) AS ct (Kolon1 text,  Kolon2 text, Bilgi1 text,
Bilgi2 text, Bilgi3 text, Bilgi4 text) 
WHERE .....

Burada dikkat edilmesi gereken konu bilgilerin ve bilgilerin altında seçilecek değer kolonu hariç diğer kolonların hepsinin ct içinde belirtilmesi gerekir. Belirtilmezse crosstab içinde uyumsuz kolon sayısı olduğu uyarısını alabilirsiniz.



Oracle SQL Merge Komutu

Oracle Merge komutu ile bir tablodaki bilgilerle diğer bir tabloyu rahatlıkla güncelleyebilir, aynı komut içinde diğer tabloda veriler eksik ise bunları tamamlayabilirsiniz. Komutun kullanımı aşağıdaki gibidir.

MERGE INTO target_table 

USING source_table 

ON search_condition

    WHEN MATCHED THEN

        UPDATE SET col1 = value1, col2 = value2,...

        WHERE <update_condition>

        [DELETE WHERE <delete_condition>]

    WHEN NOT MATCHED THEN

        INSERT (col1,col2,...)

        values(value1,value2,...)

        WHERE <insert_condition>;


target_table : Verisi güncellenecek olan tablo

source_table : Verinin alınacağı tablo

search_condition : Eşleşme kriteri



SQL Materialized View Oluşturma

 Materialized View bir tablonun veya view'ın kendi database'imizde oluşturulan kopyasıdır ve veri içeren tablolar gibi çalışır. Uzak bir database'de sorgu çalıştırmaktansa tabloyu kendi database'imize kopyalayıp çalıştırmamızı sağlar ve bu sorgunun çok hızlı cevap vermesi demektir. Materialized View içindeki verileri istediğimiz gibi güncelletebiliriz. Materialized View database'inizde fiziksel olarak veriyi tutar. Komut formatı şöyledir:

- Normal
CREATE MATERIALIZED VIEW view-name
BUILD [IMMEDIATE | DEFERRED]
REFRESH [FAST | COMPLETE | FORCE ]
ON [COMMIT | DEMAND ]
[[ENABLE | DISABLE] QUERY REWRITE]
AS
SELECT ...;

-- Pre-Built
CREATE MATERIALIZED VIEW view-name
ON PREBUILT TABLE
REFRESH [FAST | COMPLETE | FORCE ]
ON [COMMIT | DEMAND ]
[[ENABLE | DISABLE] QUERY REWRITE]
AS
SELECT ...;

BUILD veri yükleme opsiyonları;

IMMEDIATE : Materialized View oluşturulduğu anda veri de tabloya doldurulur.
DEFERRED : İlk güncelleme sırasında veri doldurulur.

REFRESH opsiyonları;

FAST : Materialized View Log'u kullanılarak güncelleme yapılır. Materialized View Log bulamazsa güncelleme yapamaz.
COMPLETE :  Sorguya göre Materialized View içindeki veriler tamamen silinir ve yeniden ilgili database'lerden çekilir.
FORCE : İlk olarak Fast dener, çalışmazsa Complate Refresh dener.

ON COMMIT : Materialized View de veri güncelleme ilgili databaselerde commit gönderildiğinde yapılır.
ON DEMAND : Yenileme işlemi manuel olarak veya bir zamanlayıcı set edildiğinde yapılır.

START WITH SYSDATE NEXT SYSDATE + 1  aralığı ile yenilenir. Buradaki “1” gün’ü ifade eder. Yani burada günde bir defa refresh edilmesi istenilmiş. Eğer 1/(60*24) yapsaydık, dakikada 1 refresh edilmesini belirtmiş olurduk.

Günde bir yenileme
CREATE MATERIALIZED VIEW view-name
REFRESH COMPLETE
NEXT (SYSDATE +1)
AS
SELECT .....

Saatte bir yenileme
CREATE MATERIALIZED VIEW view-name
REFRESH COMPLETE
NEXT (SYSDATE +1/24)
AS
SELECT .....

SQL Data link üzerinden  Materialized View nasıl oluşturulur.
CREATE MATERIALIZED VIEW view-name
AS
SELECT * FROM the_table@si_db;

si_db : Data Link adı.

Materialized View nasıl silinir.

DROP MATERIALIZED VIEW view_name;

Örnek:
CREATE MATERIALIZED VIEW MV_EXAMPLE_TABLE_NAME
PARALLEL 16
BUILD IMMEDIATE
REFRESH COMPLETE
NEXT (SYSDATE + 1/24)
AS
select /*+  parallel(16) */ * FROM


Kaynak : 
https://oracle-base.com/articles/misc/materialized-views#create-materialized-view

Oracle SQL Türkçe Karekter Uygulamaları

 Oracle SQL'de en çok karşılaşacağınız sorunların başında Türkçe karekter sorunları yer alıyor. Bu sorunları gidermek için aşağıdaki yöntemleri kullabilirsiniz.

Bir string içindeki Türkçe karekterleri dönüştürmek için;

SELECT TRANSLATE ('Türkçe karekter dönüştürme, ğüşİçö', 'ĞÜŞİÖÇğüşıöç', 'GUSIOCgusioc') FROM dual;

Turkce karekter donusturme, gusIco



ORACLE SQL Zaman Fonksiyonları ve Sıralama

Oracle SQL'de belirli bir süre geri gitmek ve bu tarihlere göre bir sıralama yapabilmek için bazı standart formarlar gerekir. Bu formatları kendi sorgunuz ile uygun bir şekilde birleştirerek sıralamayı istediğiniz gibi başlatıp hazırlayabilirsiniz. İlk olarak yardımcı fonksiyonlara bakalım.

SYSDATE : Veritabanı sunucusuna ait tarih-saat bilgisini verir.
SELECT SYSDATE FROM DUAL
2022-11-02 13:23:59

CURRENT_DATE : Kullanılan sunucuya ait sistemin tarih-saat bilgisini verir.
SELECT CURRENT_DATE FROM DUAL
2022-11-02 13:24:59

CURRENT_TIMESTAMP : Kullanıcıya ait sistemin tarih-saat bilgisini verir.
SELECT CURRENT_TIMESTAMP FROM DUAL
2022-11-02 13:26:56

DBTIMEZONE : Veritabanı sunucusuna ait saat dilimini verir.
SELECT DBTIMEZONE FROM DUAL
+00:00

LAST_DAY : Tarihe ait ayın son gününü verir.
SELECT LAST_DAY(SYSDATE) FROM DUAL
2022-11-30 13:29:41

NEW_TIME : Tarihe ait saat dilimini çevirir.
SELECT NEW_TIME(SYSDATE, 'GMT', 'PST') FROM DUAL
2022-11-02 05:31:31

ADD_MONTHS : Belirttiğiniz tarihe istenilen değer kadar ay ekler.
SELECT ADD_MONTHS(SYSDATE, 2) FROM DUAL
2023-01-02 13:32:41

EXTRACT : Tarih bilgisinden yıl, ay, gün, saat gibi her bir parçayı almayı sağlar.
SELECT EXTRACT(YEAR FROM DATE '2022-01-02') FROM DUAL
2022

SELECT EXTRACT(MONTH FROM DATE '2022-01-02') FROM DUAL
1

SELECT EXTRACT(DAY FROM DATE '2022-01-02') FROM DUAL
2

MONTHS_BETWEEN : Verilen tarih aralığını ay olarak hesaplar.
SELECT MONTHS_BETWEEN(ADD_MONTHS(SYSDATE, 2), SYSDATE) FROM DUAL
2

NEXT_DAY : Tarihten sonraki ilk günün tarihini verir.
SELECT NEXT_DAY(SYSDATE, 'SUNDAY') FROM DUAL

TRUNC : Belirtilen tarih alanının ilk anını hesaplar, saat bilgilerini sıfırlar.
SELECT TRUNC(SYSDATE) FROM DUAL
2022-11-02 00:00:00

SELECT TRUNC(SYSDATE, 'YEAR') FROM DUAL
2022-01-01 00:00:00

SELECT TRUNC(SYSDATE, 'MONTH') FROM DUAL
2022-11-01 00:00:00

TO_TIMESTAMP : String ifadeyi tarih formatına çevirir.
SELECT TO_TIMESTAMP('2022/01/01 12:00:01', 'YYYY/MM/DD HH:MI:SS') FROM DUAL
2022-01-01 12:00:01

TO_DATE : String ifadeyi tarih formatına çevirir.
SELECT TO_DATE('2022/01/01', 'YYYY/MM/DD') FROM DUAL
2022-01-01 00:00:00

TO_CHAR : Tarih ve saat biçimini string ifadeye çevirir.
SELECT SYSDATE, TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL
2022-11-02

SQL ile bu yıl
select TO_CHAR(TRUNC(SYSDATE),'YYYY') from dual

SQL ile bu gün
select TO_CHAR(TRUNC(SYSDATE),'DD.MM.YYYY') from dual

SQL ile bir gün önce
SELECT TO_DATE(current_date - 1) AS yesterday_date FROM dual

SQL ile bir gün sonra
SELECT TO_DATE(current_date + 1) AS tomorrow_date FROM dual

X Ay önceki ayın ilk gününü;

Örnekte X=11

SELECT TRUNC(ADD_MONTHS(SYSDATE, -11), 'MM') FROM DUAL

2021-01-01 00:00:00

SQL'de son X ayı sıralar;

Örnekte X=5

SELECT 1 + LEVEL - 1 AS SIRA, to_char(add_months(trunc(sysdate), - LEVEL + 1), 'MM') AS TARIH from dual connect by level <= 5

SIRA TARIH

1 12

2 11

3 10

4 09

5 08

SQL'de son X günü tarihi ile sıralar; 

Örnekte X=5

SELECT 1 + LEVEL - 1 AS SIRA, TO_CHAR((TRUNC(SYSDATE) - LEVEL + 1),'YYYY.MM.DD') AS TARIH FROM DUAL CONNECT BY LEVEL <= 5

SIRA TARIH

1 2021.12.01

2 2021.11.30

3 2021.11.29

4 2021.11.28

5 2021.11.27

Geriye dönük hafta numaraları listesi elde etme;

ör: Son 50 gün için hafta numaraları listesi

SELECT SUM(SIRA) AS SIRA, TARIH FROM
(SELECT 1 + LEVEL - 1 AS SIRA, TO_CHAR( TO_DATE(sysdate) - LEVEL + 1 , 'IW' ) AS TARIH 
FROM  DUAL CONNECT BY LEVEL <= 50) GROUP BY TARIH ORDER BY SIRA

Sıra Tarih(Hafta)
1 01
35 52
84 51
133 50
182 49
231 48
280 47
329 46

Bulunduğunuz günden geri gün listesi elde etme.

SELECT to_char(TO_DATE (SYSDATE - (LEVEL -1)), 'DD.MM.YYYY')  tarih FROM DUAL CONNECT BY LEVEL <= 360

SQL Sorgu Sonucunun Belirli bir Bölümünü Alma

Oracle SQL'de sorgu çıktısının belli bir bölümünü almak için bazı komutlar kullanmak gerekebilir. Sondan N satır veya baştan N satır alma ihtiyacı olabileceği gibi X satırından sonra N satır al gibi işlemler yapmak ta gerekebilir. Bu komutları birer örnek ile görelim

Örnek Database

   Kolon
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10
20 rows selected.

Son 5 satırı sıralamak için.

SELECT Kolon
FROM   Table
ORDER BY Kolon DESC
FETCH FIRST 5 ROWS ONLY;

   Kolon
----------
        10
        10
         9
         9
         8
5 rows selected.

Son 5 satırı bağlantıları ile al.

SELECT Kolon
FROM   Table
ORDER BY Kolon DESC
FETCH FIRST 5 ROWS WITH TIES;

   Kolon
----------
        10
        10
         9
         9
         8
         8
6 rows selected.

İlk satırları %20 oranında sırala

SELECT Kolon
FROM   Table
ORDER BY Kolon
FETCH FIRST 20 PERCENT ROWS ONLY;

   Kolon
----------
         1
         1
         2
         2
4 rows selected.

4. satırdan başlayarak ilk 4 satırı sırala

SELECT Kolon
FROM   Table
ORDER BY Kolon
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

   Kolon
----------
         3
         3
         4
         4
4 rows selected.

4. Satırdan başlayarak verinin %20'sini sırala.

SELECT Kolon
FROM   Table
ORDER BY Kolon
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;

   Kolon
----------
         3
         3
         4
         4
4 rows selected.



SQL Sondan bir karekter sil

select SUBSTR('350 M', 0, LENGTH('350 M') - 1) from dual;
350

SQL ilk 12 satır;

BY TARIH DESC FETCH NEXT 12 ROWS ONLY


https://www.oracletutorial.com/oracle-basics/oracle-fetch/ 

Python ile Oracle Veri Tabanına Veri Yazma

 Python Oracle modulü ile aşağıdaki kodu kullanarak Oracle veri tabanına veri girişi yapabilirsiniz. Bu uygulamada bir fonksiyon gönderilen SQL sorgusunu çalıştırmaktadır. Bu fonksiyon ile farklı SQL sorguları da çalıştırabilirsiniz.


import cx_Oracle


def InservDB(inserquery):
    try:
        conn = cx_Oracle.connect('username/Password@hostname:1521/NOR')
        cursor = conn.cursor()
        cursor.execute(inserquery)
        #cursor.executemany(inserquery)
        conn.commit()
        cursor.close()
        conn.close()
        return 0
    except ValueError:
        print("Database bağlantısı sağlanamıyor...")

inserquery = "insert into Tablo_adı(Sutun1, Sutun2, Sutun3) values(1,2,3)"
InsertDB(inserquery)

Oracle SQL Sorgusunu Python script ile çalıştırma.

Python Oracle Database Bağlantısı

 Python ile Oracle veri tabanına bağlanmak için ilk olarak Pyhon oracle modülünü yüklemeniz gerekmektedir. Python Oracle kütüphanesinin adı cx_Oracle dır. Bu kütüphaneyi pip ile yükleyin.

pip install cx_Oracle

Modülü kurduktan sonra oracle sitesinden driverları indirip bilgisayarınıza kopyalayın. 

64 bit

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

32 bit

https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html

Yazdığınız koda Oracle modülünü import edin ve driver'ı bir defaya mahsus gösterin.

import cx_Oracle

cx_Oracle.init_oracle_client(lib_dir=r"C:\oracle\instantclient_19_11")

Şimdi connect() fonksiyonunu kullanarak Python programı ile Oracle veritabanı arasında bir bağlantı kurun.

con = cx_Oracle.connect('username/password@localhost')

Bir SQL sorgusu yürütmek ve sonuç sağlamak için, cursor() nesnesi gerekir.

cursor = conn.cursor()

Daha sonra komutları işleteceğiniz bölümü oluşturun.

cursor.execute(sqlquery) – – – -> tek bir sorgu yürütmek için.

cursor.executemany(sqlqueries) – – – -> birden çok bağlama değişkeni/yer tutucu ile tek bir sorgu yürütmek için.

Tüm işlemler tamamlandıktan sonra tüm işlemlerin kapatılması zorunludur.

cursor.close()

con.close()

Örnek Kod

# importing module
import cx_Oracle
 # Create a table in Oracle database
try:
     con = cx_Oracle.connect('tiger/scott@localhost:1521/xe')
    print(con.version)
 
    # Now execute the sqlquery
    cursor = con.cursor()
 
    # Creating a table employee
    cursor.execute("create table employee(empid integer primary key, name varchar2(30), salary number(10, 2))")
 
    print("Table Created successfully")
 
except cx_Oracle.DatabaseError as e:
    print("There is a problem with Oracle", e)
 
# by writing finally if any error occurs
# then also we can close the all database operation
finally:
    if cursor:
        cursor.close()
    if con:
        con.close()

Oracle Komutlar

 Karekter kırpma:

select substr('Kolon_ismini_bu_alana_yazabilirsiniz',1,20) from dual

Oracle'da karekter veya rakam yakalama

select regexp_replace('stack12345overflow569', '[^0-9]', '') as numbers,

       regexp_replace('Stack12345OverFlow569', '[^a-z and ^A-Z]', '') as characters

from dual

Değerin içinde sayı arayıp integer haile çevirme;

to_number(regexp_substr('100 Mbps devre', '(\d+) Mbps', 1, 1, NULL, 1))

Oracle Database'de bir tabloyu kalıcı olarak silmek için;

SQL Tablo Silme:

DROP TABLE TABLO_İSMİ PURGE

COMMIT;

Sunucuya bağlanan cihazın IP adresini gösterme

SELECT sys_context ('USERENV', 'IP_ADDRESS') FROM DUAL

Tablo değişiklik zamanı: Tabloda en son değişikliğin hangi zamanda yapıldığını verir.

select max(ora_rowscn), scn_to_timestamp(max(ora_rowscn)) from Table_Name





PHP ile Oracle Veri Tabanına Nasıl Bağlanılır (Apache)

PHP üzerinden Oracle veri tabanına nasıl bağlanılacağına değineceğiz. XAMPP sunucusu üzerinde bulunan Apache serverdan faydalanarak Oracle database'e nasıl erişebiliriz?

İlk olarak PHP info sayfasına bakalım.

 http://localhost/dashboard/phpinfo.php

Bu sayfada bulunan iki değerin karşılığının ne olduğuna bakmalıyız

Architecture x86 veya x64 olacaktır.

Thread Safety enabled

Architecture değeri bendeki gibi x86 görünüyorsa 32bit bir PHP sürümüne sahipsiniz demektir. Thread Safety değeri mutlaka enable olmalıdır.

İlk olarak PHP.ini dosyası içinde aşağıdaki kaydın olup olmadığını kontrol edin açık değilse açın.

PHP 7.2den eski sürümler için

extension=oci8_12c

PHP 7.2'den sonraki sürümler için

extension=oci8_12c.dll

Ayrıca dosyaların bulunduğu dizinin php.ini dosyası içinde açık olduğundan emin olun.

extension_dir="D:\xampp\php\ext"

Oracle Instant Client Basic paketini internetten indirin.

http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html

Windows x86 için 32bit, x64 için 64bit sayfasındaki "instantclient-basic-nt-12.2.0.1.0.zip" dosyasını indirmelisiniz. İndirdiğiniz dosyayı diskinizde bir klasör oluşturarak içine kopyalayın

D:\Oracle\instantclient_12_2

Bu klasörü sistem path bölümüne ekleyin

Control Panel -> System -> Advanced System Settings -> Advanced -> Environment Variables -> System Variables -> PATH. 

Name : Oracle Değer: D:\Oracle\instantclient_12_2

İnternetten indirdiğiniz instantclient_12_2 klasörünün içindeki *.dll dosyalarını D:\xampp\php ve D:\xampp\apache/bin klasörlerine kopyalayın.

Apache servisini restart ettiğinizde phpinfo dosyasına tekrar bakın. Burada OCI8 extension bölümünün açıldığını göreceksiniz. Bundan sonra test etmeniz yeterli. Aşağıdaki kod ile test edebilirsiniz.

<?php
 
error_reporting(E_ALL);
ini_set('display_errors', 'On');
 
$username = "hr";                  // Use your username
$password = "welcome";             // and your password
$database = "localhost/orclpdb";   // and the connect string to connect to your database
 
$query = "select * from dual";
 
$c = oci_connect($username, $password, $database);
if (!$c) {
    $m = oci_error();
    trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
}
 
$s = oci_parse($c, $query);
if (!$s) {
    $m = oci_error($c);
    trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR);
}
$r = oci_execute($s);
if (!$r) {
    $m = oci_error($s);
    trigger_error('Could not execute statement: '. $m['message'], E_USER_ERROR);
}
 
echo "<table border='1'>\n";
$ncols = oci_num_fields($s);
echo "<tr>\n";
for ($i = 1; $i <= $ncols; ++$i) {
    $colname = oci_field_name($s, $i);
    echo "  <th><b>".htmlspecialchars($colname,ENT_QUOTES|ENT_SUBSTITUTE)."</b></th>\n";
}
echo "</tr>\n";
 
while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "<td>";
        echo $item!==null?htmlspecialchars($item, ENT_QUOTES|ENT_SUBSTITUTE):"&nbsp;";
        echo "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";
?>

Kaynak : https://blogs.oracle.com/opal/installing-xampp-for-php-and-oracle-database



Google