воскресенье, 15 апреля 2012 г.

Oracle + Java

Всем привет, это продолжение изучения оракла, и его совокупления  с другими технологиями. Сейчас его будем сабачить к Java.


Поехали.

Нащупываем на затылке кнопочку включения мозгов, и рвёмся в бой.
Пока масажное приспособление нежно разминает мою спинку, я буду описывать ваши(наши) действия. Надёюсь вы знаете как выглядят java пограммы.
  public class HelloDB {

    public static void main(String[] args) {
        System.out.println("Hello DB");
    }
}
Запишем это в файлик HelloDB.java , вызовем javac HelloDB.java . А потом java HelloDB . И любуемся плодами своей тяжкой работы. Порадовались? Двигаемся дальше. Подключится java к базе - очень легко. Всего-то стоит
 
Class.forName("oracle.jdbc.driver.OracleDriver");
  System.out.println("Driver Loaded");

DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521","system","oracle");
    Statement stmt = conn.createStatement();
Ну что сложно,нет? Тогда включите сервер базы данных и запускайте.
АГА, тяжелый молот судьбы ударил по вашим амбициям? А почему? Не подумали? Давайте разбираться. Начиная с первой строчки. Мы загружаем драйвер оракла. А где мы его достанем? Для этого нужно подключить в программу jar file драйвера ojdbc6 . Есть 4 способа:
1) Указание в параметре classpath пути к этому драйверу -classpath /home/alex/NetBeansProjects/DbApp/ojdbc6.jar
2) Указание в глобальной переменной CLASSPATH пути к этому драйверу export CLASSPATH=/home/alex/NetBeansProjects/DbApp/ojdbc6.jar

Оба способа рабочие, но оба заменяют ВСЕ подключаемые библиотеки при компиляции, включая саму программу исходник, поэтому нужно ещё указать и программу исходник в этих переменных , или текущую папку PWD.

3) Написание файла манифеста, но я им ещё не пользовался.
4) Программировать в среде разработки, там подключение библиотек делается 3 кликами.

В моём случае( я использовал 1 способ) команды компиляции и выполнения выглядели так:
javac -classpath  /home/alex/NetBeansProjects/DbApp/ojdbc6.jar:$PWD  
DBApp.java 


java -classpath  /home/alex/NetBeansProjects/DbApp/ojdbc6.jar:$PWD  
DBApp

Давайте чуть дополним программу, и запустим. Дополним этими строками. Это получение результатов выполнения SQL запросов в базу,и  вывод на экран.
 

 ResultSet rset = stmt.executeQuery("select * from NLS_DATABASE_PARAMETERS;");
    
     while ( rset.next() )
     System.out.print(rset.getString(1).concat(" : ") +rset.getString(2)+ "\n");
   stmt.close();
Запускайте.Что? Опять ваша система даёт вам по щам? Но зато ошибка уже знакома.
ORA-12705: Cannot access NLS data files or invalid environment specified

Неприятно,неприятно. Но вполне разрешаемо. Многие способы я рассматривал в этом посте   . Способ с netbeans не проканает,даже если вы в нём. java  к нему не имеет никакого отношения.  Но сейчас я открою вам новый секретный способ, который я считаю единственным истинно правильным.
Дополним программу:
 
    Locale l  = Locale.getDefault();
    Locale.setDefault(Locale.US);
   ........
   Locale.setDefault(l);
Как видите, я сохраняю текушую локаль системы. Устанавливаю английский, а по завершении программы, возвращаю ту, что была.
Ну, подставляем другую щеку, компилируем и запускаем.
Что , опять огребли по самые помидоры? Но проблема теперь в запросе select. Дело в том, что executeQuery поддерживает выполнение 1 sql запроса, а значит, никаких точек с запятой там быть не может. Решение: убираем точку с запятой, крестимся, запускаем. ResultSet rset = stmt.executeQuery("select * from NLS_DATABASE_PARAMETERS"); И в долгожданном выводе получаем настройки национальных локалей вашей БД. А ведь что мы сделали? Мы выполнили запрос в базу и получили ответ. Дальше вы можете составлять свои более сложные таблицы, более сложные программы. И во всё работать с базами данных, Если у кого не получилось из обрывков кода склепать готовую программу, то вот она.
 
import java.sql.*;
import java.util.Locale;
public class DBApp
{
  public static void main(String[] args) throws SQLException,ClassNotFoundException  
  {
/*   Class.forName
("oracle.jdbc.driver.OracleDriver");
  System.out.println("Driver Loaded");
 */ 
    Locale l  = Locale.getDefault();
    Locale.setDefault(Locale.US);
    DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver());
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//192.168.56.101:1521","system","oracle");
    Statement stmt = conn.createStatement();
    
    ResultSet rset = stmt.executeQuery("select * from NLS_DATABASE_PARAMETERS");
    
     while ( rset.next() )
     System.out.print(rset.getString(1).concat(" : ")  rset.getString(2)  "\n");
   stmt.close();
   Locale.setDefault(l);
  }
}
И запуск
javac -classpath  /home/alex/NetBeansProjects/DbApp/ojdbc6.jar:$PWD  
DBApp.java 


java -classpath  /home/alex/NetBeansProjects/DbApp/ojdbc6.jar:$PWD  
DBApp

Всё готово. Успехов вам в использовании баз данных.






Читать дальше......

Oracle + NetBeans


Христос воскресе!!
В этоn замечательный день я хочу уменьшить ваши мучения при подключении Oracle DB к NetBeans. Предположу, что вы уже установили себе Oracle (можно XE, как у меня). И теперь вам не терпится поработать с базами данных и написать программу, которая её использует. Может быть вы даже поставили себе JDeveloper, но лично меня он пока не впечатлил. Точнее нет. Он очень крут. Но система с ним тормозит- возьми да вешайся и это на i5 проце. NetBeans тоже можно использовать на СУБД. Пусть он не настолько кликабелен  как Jdeveloper , но ничего, подучите PL/SQL. Ну что, вытаскиваем руки из задницы, ставим чуть ниже шеи и кладём на клавиатуру.




Из первоначальных требований:
   Установленная система- >=1шт.
   Установленный OracleDB(XE) = 1шт.
   Установленный NetBeans >= 1шт.
   Установленный SunJDK = 1шт.
   Мозг - 1 шт. Желательно 2 полушария.
   Руки - можно 1 но на правильном месте хоть как-то связанную с мозгом.



Ну что, в атаку. Я очень ленив, и описывать то, что описано мне не хочется. Как в NetBeans подключить BD описано здесь .Если кратко, то мы вызываем окно "службы"(Ctrl+F5). В нём кликаем правой клавишей по "Базы данных" и выбираем "новое соединение". Выбираем драйвер Oracle Thin и Нет Бианс говорит, что драйвера нет и любезно перенаправляет нас на страницу его скачивания . Загрузив драйвер ojdbc6.jar ,мы выбираем его кнопочкой «добавить» в диалоговом окне NetBeans.




Потом пред нами предстоит ввод Адреса вашей BD (скорее всего localhost) Но нет, если установленная oracle на другой машине. Так же имя пользователя и пароль. Так как аккаунт hr/hr с недавних пор по умолчанию заблокирован, мы введём system/{пароль, который вы указали при установке oracle} . Нажимаем "проверить соединение" и тут нас «Фейсом об тейбл»!ORA-12705: Cannot access NLS data files or invalid environment specified
Вот
ведь незадачка-то: Вариантов решения этой проблемы несколько. Гугл и форумчани вовсю советуют:
1)
Взять старый драйвер для oracle9( некошерно )
2)
Установить глобальную переменную NLS_LANG в en_US.utf8, в винде тоже самое, только в реестре.


1 вариант честно не пробовал. Второй - не помог, видимо он для 10 оракла или то-то типа того. Поэтому есть ещё 3-й и четвёртый варианты.  Для того, чтоб решить проблему, давайте поймём, от чего она. Если вы устанавливали и Oracle NetBeans на 1 машину, то ошибки у вас возможно и нет. Потому, что она насколько я понял из-за несоответствия кодировок сервера и клиента, Сервер БД  устанавливает внутреннюю кодировку скриптиком.
{oracle home}/product/{version}/xe/bin/nls_lang.sh . Этот скрипт анализирует кодировку вашей системы и выдаёт подходящую для БД на экран. Могу предположить, что этот скрипт выполняется при запуске OracleXE и результат его работы присваивается куда-то. Но это предположения. На стороне клиента, на сколько я понимаю, по крайней мере драйвер  ojdbc6 выполняет то же самое ,только с кодировкой системы клиента. И если кодировки разные и несовместимые, то вываливается ошибка NLS . Как же быть? Можно на стороне клиента в системе поставить кодировку, аналогичную серверу, давайте так и сделаем.
export LANG=us_US.utf8. Запускаем NetBeans в этой же консольке и мы успешно подключаемся к базе. Но способ не самый удобный, поэтому существует ещё 1.
Мы отредактируем конфигурационный файлик NetBeans.{NET BEANS HOME}/etc/netbeans.conf . И в переменную netbeans_default_options добавим ещё 1 параметр.
-J-Duser.region=US . После этого снова успешно подключаемся к базе.  В этом посте мне хотелось ещё рассказать 2 слова о подключении Oracle к java, но статья затянулась, и об этом я продолжу после.


Читать дальше......