Java і дані з Oracle – все дуже просто

Зміст



Взаємодія з базою даних через JDBC


Завантаження програм на Java з даними в БД під управлінням Oracle здійснюється двома основними способами: через JDBC і через SQLJ.


Використання JDBC


JDBC і JDBC-драйвери


JDBC – це Java API (Application Program Interface) для доступу з Java-програм до SQL-СУБД різних типів. Мається на увазі, що одна і та ж Java-програма зуміє за допомогою JDBC реально працювати в середовищі Windows з даними mySQL або ж у середовищі Solaris з даними Informix. Вона ж може бути збереженої процедурою в БД під Oracle і працювати з даними тієї ж Oracle або, приміром, Sybase.


Реалізується JDBC у вигляді інтерфейсів java.sql (основний) і javax.sql (розширений). Конкретний набір класів, реалізує JDBC-інтерфейс і здійснює доступ до конкретної СУБД, називається драйвером. JDBC-драйвери для своїх СУБД постачають всі основні розробники.


Описами JDBC визначено чотири типи JDBC-драйверів: два "тонких" і два "товстих".



JDBC-драйвери в Oracle


Фірма Oracle поставляє для роботи зі своєї СУБД следуюшіе драйвери, що задовольняють специфікаціям JDBC:



Крім цього близько сотні різних фірм поставляють JDBC-драйвери власної реалізації типів I, II, III і IV, в тому числі і для зв'язку з Oracle. Вони доступні в інтернеті.


Установка JDBC-драйверів для роботи з Oracle


Пакет java.sql з класами JDBC, реалізованими фірмою Oracle відповідно до інтерфейсами, пропонованими фірмою Sun, входить до складу стандартного JDK. Тонкий драйвер входить до складу файлу classes111.zip, або його більш пізньої версії classes12.zip. При відсутності на комп'ютері його можна отримати за адресою download.oracle.com/otn/utilities_drivers/jdbc/817/classes12.zip (версія 8.1.7).


Товстий драйвер можна отримати за адресою download.oracle.com/otn/utilities_drivers/jdbc/817/jdbc817jdk12-nt.zip (для NT) або download.oracle.com/otn/utilities_drivers/jdbc/817/jdbc817jdk12-sol.zip ( для Solaris).


Для роботи з драйверами потрібно додати шлях до цих файлів до змінної середовища оточення CLASSPATH.


Файл Java-програми для перевірки зв'язку через JDBC


Для наступних нижче прикладів організації різних варіантів зв'язку з БД через JDBC потрібно підготувати файл StaffByJDBC.java із загальним для всіх прикладів текстом:








import java.sql.*;
import oracle.jdbc.driver.*;


public class StaffByJDBC
{
     public static void main(String[] args)
     {
          String url = null;


           if (args.length > 0) {
           if (args[0].compareToIgnoreCase(“thin”) == 0) {
                 url = “jdbc:oracle:thin:@localhost:1521:TEACHER”;
          }
          else if (args[0].compareToIgnoreCase(“oci”) == 0) {
                url = “jdbc:oracle:oci8:@TEACHER”;
          }
          else if (args[0].compareToIgnoreCase(“kprb”) == 0) {
               url = “jdbc:oracle:kprb:”;
}
}


if (url == null) {
System.out.println(“usage: StaffByJDBC [thin/oci]”);
return;
}


try {
    DriverManager.registerDriver (
        new oracle.jdbc.driver.OracleDriver());

}
catch (Exception e) { return; }


try {
Connection cn =
            DriverManager.getConnection (url,”scott”,”tiger”);


Statement st = cn.createStatement();
ResultSet rs =
st.executeQuery ("SELECT empno, ename FROM emp");


while (rs.next()) {
     System.out.println(“Number=” + rs.getString(1) + ” ” +
                             “Name=” + rs.getString(2));
}


st.close();
cn.close();

}
catch (Exception e) { return; }
finally { System.out.println(“All that happened”); }
}
}


Робота з даними Oracle із зовнішніх Java-програм


Робота з Oracle через тонкий драйвер


Трансляція і запуск програми (середа Unix – аналогічно):


SET CLASSPATH=%ORACLE_HOME%jdbclibclasses12.zip;.


javac StaffByJDBC.java


java StaffByJDBC thin


Робота з Oracle через товстий OCI-драйвер


Трансляція і запуск програми (середа Unix – аналогічно):


SET CLASSPATH=%ORACLE_HOME%jdbclibclasses12.zip;.


javac StaffByJDBC.java


java StaffByJDBC oci


Робота з даними Oracle зі збережених Java-програм


Звернення до БД з збережених процедур


Завантаження, трансляція і запуск програми:


loadjava -user scott/tiger -oci8 -r StaffByJDBC.java


sqlplus scott/tiger


SQL> ALTER JAVA SOURCE “StaffByJDBC” COMPILE;


Java altered.


SQL> ALTER JAVA CLASS “StaffByJDBC” COMPILE;


Java altered.


SQL> CREATE OR REPLACE PROCEDURE liststaff (drivertype IN VARCHAR2)
AS LANGUAGE JAVA
NAME “StaffByJDBC.main (java.lang.String[])”;
/


Function created.


SQL> EXEC liststaff(“kprb”)


PL/SQL procedure successfully completed.


Перегляд результатів – у файлі трасування в каталозі ОС udump.


Особливості роботи з kprb-драйвером


Робота з kprb-драйвером має свої відмінності по відношенню до роботи із зовнішніми драйверами:



  1. для збережених програм явного приєднання з БД не потрібно – kprb-драйвер виконує його неявно автоматично (код явного з'єднання з програм, написаних з розрахунку на зовнішнє з'єднання, буде проігноровано)
  2. так як драйвер kprb не підтримує AUTOCOMMIT, виконувати COMMIT або ROLLBACK в програмі потрібно явно
  3. пристроєм видачі Sys.output за замовчуванням є для kprb не екран, а трасувальні файли в каталозі udump

Звернення до даних з тригерів Oracle


Спеціальних Java-тригерів в Oracle немає, і тому організація тригера на Java вимагає закладу зовнішньої "оболонки" на PL / SQL, всередині якої робляться звернення до процедур на Java, відкриту для PL/SQL.


Ось як це може виглядати:


CREATE TRIGGER scott.salary_check
BEFORE INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> “PRESIDENT”)
CALL check_sal(:new.job, :new.sal, :new.name);
/


Тут CHECK_SAL повинна бути опублікованою процедурою на Java.


Взаємодія з базою даних через SQLJ


SQLJ представляє собою альтернативний JDBC спосіб роботи з БД з Java-програм, що використовує схему включає мови / предкомпіляціі. На відміну від JDBC, SQLJ дозволяє використовувати в програмі тільки статичні SQL-звернення до бази, проте вихідний текст програм може виглядати багато компактніше.


Подібно Java-програмами з JDBC, програми з SQLJ можуть працювати як на клієнті, так і на сервері.


SQLJ стандартизований комітетом ANSI. Більш детально про нього див на web-сайті консорціуму SQLJ http://www.sqlj.org/.


Приклад програми з використанням SQLJ


Типовий приклад програми з використанням SQLJ (файл StaffBySQLJ.sqlj):








import java.sql.*;
import sqlj.runtime.ref.DefaultContext;
import oracle.sqlj.runtime.Oracle;


#sql iterator MyIter (String ename, int empno, float sal);


public class StaffBySQLJ
{
public static void main (String args []) throws SQLException
       {
             Oracle.connect
("Jdbc: oracle: thin: @ localhost: 1521: teacher",
                    “scott”, “tiger”);


            MyIter iter;
           #sql iter={ select ename, empno, sal from emp };
           while (iter.next()) {

                    System.out.println
(Iter.ename () + "" + iter.empno () + "" + iter.sal ());
               }
         }
}


Транслювання програми з SQLJ


Приклад транслювання програми з SQLJ:


SET CLASSPATH=%ORACLE_HOME%jdbclibclasses12.zip;.
SET CLASSPATH=%CLASSPATH%;%ORACLE_HOME%sqljlib ranslator.zip
SET CLASSPATH=%CLASSPATH%;%ORACLE_HOME%sqljlib
untime12.zip


sqlj StaffBySQLJ.sqlj


Після цього в поточному каталозі з'являться файли (варіант версії 8.1.7):


StaffBySQLJ.class
StaffBySQLJ.java
StaffBySQLJ _SJProfile0.ser
StaffBySQLJ _SJProfileKeys.class
MyIter.class


Таким чином, програма sqlj не тільки предтстранслірует вихідний яайл SQLJexample.sqlj, але і странслірует слідом породжену нею ж програму SQLJexample.java з урахуванням підготовлених властивостей. Запуск кінцевого результату виглядає як звичайно:


java StaffBySQLJ


Більш складний приклад транслювання:


sqlj-user = scott / tiger @ jdbc: oracle: thin: @ localhost: 1521: teacher StaffBySQLJ.sqlj


Транслювання програм з SQLJ, призначених для виконання на сервері, можна здійснювати


(А) явно (програма sqlj, як показано вище) з наступним завантаженням класів у БД (в цьому випадку їх перед завантаженням зручно поєднувати в jar-файли)
(Б) неявно, шляхом завантаження файлів. Sqlj в БД (автоматична предтрансляція буде в цьому випадку виполнена.внутреннімі засобами Oracle).


Виконання програми з SQLJ


Для можливості звернення програми c SQLJ, завантаженої з допомогою loadjava з jar-файлу (або напряму), можна виконати


CREATE OR REPLACE PROCEDURE my_sqlj_example
AS LANGUAGE JAVA
NAME “StaffBySQLJ.main(java.lang.String[])”;


Програми з SQLJ, написані для роботи з БД ззовні (з клієнтської сторони), завжди будуть працездатні і як збережених програм (тобто, на сервері). Зворотне не обов'язково вірно (див. коментар з приводу особливостей використання kprb-драйвера вище).


Посилання по темі

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*