Показаны сообщения с ярлыком Oracle. Показать все сообщения
Показаны сообщения с ярлыком Oracle. Показать все сообщения

понедельник, 5 ноября 2012 г.

Install instant Oracle client on Centos 64

Downloads from http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm
and setup this.
Create /etc/profile.d/oracle.sh with:
export ORACLE_HOME="/usr/lib/oracle/11.2/client64"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export TNS_ADMIN=$ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME/bin
create "tnsnames.ora" file in $TNS_ADMIN folder, with:
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
Setup rlwrap:
sudo yum install rlwrap
and add this line to ~/.bashrc
alias sqlplus="rlwrap sqlplus"
Test:
sqlplus user_name@orcl
If you get error:
sqlplus: error while loading shared libraries: libsqlplus.so: cannot
open shared object file: No such file or directory
then check $ORACLE_PATH and $LD_LIBRARY_PATH and grants:
chmod -R 755 $ORACLE_HOME
If you get this error:
sqlplus: error while loading shared libraries: libsqlplus.so: cannot
open shared object file: No such file or directory
then add local machine to /etc/hosts :
127.0.0.1   localhost [machine_name]

воскресенье, 11 марта 2012 г.

install Tora 2.1.3 on Fedora 16

Скачиваем исходники и достаем из архива:
cd Downloads
wget http://downloads.sourceforge.net/project/tora/tora/2.1.3/tora-2.1.3.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Ftora%2Ffiles%2Flatest%2Fdownload&ts=1331490264&use_mirror=ignum
tar -jxvf tora-2.1.3.tar.bz2

Устанавливаем зависимые пакеты:
su -c 'yum install qt-devel qscintilla-devel'

Понадобится переменная окружения LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

cd tora-2.1.3/

Теперь неменого подправим файл src/Makefile.am: в блоке BUILT_SOURCES нужно добавить moc_toawr.cpp:
...
# files listed in BUILT_SOURCES are built before anything else.
BUILT_SOURCES = \
 moc_toawr.cpp \
 moc_toabout.cpp \
 moc_toalert.cpp \
...

Конфигурируем и собираем (предполагается, что на машине есть Oracle):
./configure --prefix=/usr --with-oracle=$ORACLE_HOME --with-oracle-libraries=$ORACLE_HOME/lib
make
su -c 'make install'

пятница, 9 марта 2012 г.

Extract Oracle DDL to File

Простой скрипт для выгрузки DDL-кода Oracle-объекта в файл.

GenDDL.sql:
SET TERMOUT OFF
SET VERIFY OFF
SET ECHO OFF
SET LONG 9000000
SET LONGC 900
SET LINES 400
SET TRIMSPOOL ON
SET PAGES 0
SET FEEDBACK OFF
SET HEAD OFF
SET SQLBLANKLINES OFF
SET SERVEROUTPUT ON

BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'PRETTY',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'SQLTERMINATOR',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'SEGMENT_ATTRIBUTES',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'STORAGE',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'TABLESPACE',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'REF_CONSTRAINTS',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'SPECIFICATION',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'BODY',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'CONSTRAINTS',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'STORAGE',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'CONSTRAINTS_AS_ALTER',
                                      TRUE);
END;
/

SPOOL '&&3'

BEGIN
   FOR i IN (SELECT owner,
                    object_type,
                    object_name,
                    created d
               FROM all_objects
              WHERE owner = '&&1' AND object_name = '&&2')
   LOOP
      DBMS_OUTPUT.Put_Line (
         DBMS_METADATA.get_ddl (REPLACE (i.object_type, ' ', '_'),
                                i.object_name,
                                i.owner));
   END LOOP;
END;
/

SPOOL OFF

EXIT
Используется 3 входных параметра:
1) Пользователь (схема);
2) Объект;
3) Файл для выгрузки.

Пример запуска:
rlwrap sqlplus -silent=true objectman@XE/objectman @/home/maksim/projects/AntOraDDL/GenDDL.sql OBJECTMAN MYBOOKS /home/maksim/projects/AntOraDDL/mybooks.sql

воскресенье, 4 марта 2012 г.

Автодополнение в sqlplus

Наконец нашел то, чего так не хватало в sqlplus'е - простой GPL'ный фрон енд - gqlplus:
- Навигация по истории команд;
- Редактор командной строки (правда все это есть в rlwrap);
- Автододополнении для имен таблиц и колонок (вот это действительно здорово).
Плюс ко всему этому имеются собранные deb и rpm пакеты.

четверг, 26 января 2012 г.

Oracle. Администрирование и разработка.: Деление на ноль? Легко!

Oracle. Администрирование и разработка.: Деление на ноль? Легко!: Q: can oracle divide by zero? A: no Q: are you absolutely sure? A: yes Q: then why does this work? select 1 from dual where exists (sel...

среда, 25 января 2012 г.

setEncoding для java.util.zip

Как известно у методов замечательного стандартного пакета java.util.zip нет возможности указывать кодировку файлов. И вообще для работы с архивами лучше ипользовать сторонние специализированные библиотеки, как например Apache Commons Compress.
Но, если код (или его часть) уже написаны под java.util.zip, то можно воспользоваться пакетом для работы с архивами, входящим в состав бинарников Apache Ant. В пакете org.apache.tools.zip содержаться классы аналогичные java.util.zip, но исправленные (в частности содержится setEncoding), практически все имена и методы классов совпадают.

1) Скачиваем последнюю версию бинарника Appache Ant;
2) Достаем из папки lib файл ant.jar;
3) "Выковыриваем" все "ненужные" нам пакеты из папки org, оставляем на месте только файлы в папке /org/apache/tools/zip;
4) Подключаем jar-файл к своему проекту вместо java.util.zip;
5) В моем коде пришлось только изменить метод Entries на getEntries;
6) Теперь при создании экземпляра ZipFile вторым параметром можно указать кодировку.

Вот небольшой пример:
import java.io.*;
import java.util.Enumeration;
import org.apache.tools.zip.*;

public class ZipUtil {

private static String ZIPENCODE = "CP866";

public static final void unzip(String extractFrom, String extractTo)
   throws IOException {
  File extractFromFile = new File(extractFrom);
  File extractToFile = new File(extractTo);
  ZipFile archive = new ZipFile(  extractFromFile, ZIPENCODE);
  Enumeration e = archive.getEntries();
  while (e.hasMoreElements()) {
   ZipEntry entry = (ZipEntry) e.nextElement();
   File file = new File(extractToFile, entry.getName());
   if (!entry.isDirectory()) {
    if (!file.getParentFile().exists()) {
     file.getParentFile().mkdirs();
    }
    InputStream in = archive.getInputStream(entry);
    BufferedOutputStream out = new BufferedOutputStream(
      new FileOutputStream(file));
    byte[] buffer = new byte[8192];
    int read;
    while (-1 != (read = in.read(buffer))) {
     out.write(buffer, 0, read);
    }
    in.close();
    out.close();
   }
  }
 }
}

Лично я использовал этот пакет в хранимых java процедурах Oracle, предварительно загрузив jar-файл в базу с помощью loadjava.

И, само собой, при распространении своей программы с использованием этой библиотеки не забываем о соблюдении условий, выдвигаемых лицензией Apache.

вторник, 7 июня 2011 г.

Oracle: Выполнение команд ОС и обработка результатов

Этой теме посвещено много статей, но когда занялся сам, то встретился с трудностями получения и обработки кода ошибки (кода возврата) команды, поэтому опишу следующий вариант решения:

На просторах Интеренета (а именно здесь) нашел следующий код:
try {
 Process p = Runtime.getRuntime().exec("Команда ОС");
 BufferedReader stdInput = new BufferedReader(new
 InputStreamReader(p.getInputStream()));
 BufferedReader stdError = new BufferedReader(new
 InputStreamReader(p.getErrorStream()));
 System.out.println("Here is the standard output of the command:\n");
 while ((s = stdInput.readLine()) != null) {
  System.out.println(s);
 }
 System.out.println("Here is the standard error of the command (if any):\n");
 while ((s = stdError.readLine()) != null) {
  System.out.println(s);
 }
}
catch (IOException e) {
 System.out.println("exception happened - here's what I know:");
 e.printStackTrace();
}
Программа выполняет команду, а затем считывает стандартный выходной поток и поток ошибок.
Меня вполне все устроило, заиcключением того, что проблематично получить код ошибки, возвращаемый при завершении работы программы.
В Windows строка Runtime.getRuntime().exec("echo %errorlevel%")
всегда вернет "0" (насколько я понял, из рантайма вообще невозможно работать с переменными окружения, из за того, что в разных системах доступ к ним осуществляется по разному).

Поискав дальше нашел статью.
Т.е. код возвата программы можно получить:
System.out.println(p.exitValue());
Теперь оформим в виде хранимой процедуры Oracle:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "os_execute" AS
import java.io.*;
public class os_execute {
 public static void main() throws IOException {
  String s = null;
  try {
   Process p = Runtime.getRuntime().exec("Команда ОС");
   BufferedReader stdInput = new BufferedReader(new
   InputStreamReader(p.getInputStream()));
   BufferedReader stdError = new BufferedReader(new
   InputStreamReader(p.getErrorStream()));
   System.out.println("Here is the standard output of the command:\n");
   while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
   }
   System.out.println("Here is the standard error of the command (if any):\n");
   while ((s = stdError.readLine()) != null) {
    System.out.println(s);
   }
   System.out.println(p.exitValue());
  }
  catch (IOException e) {
   System.out.println("exception happened - here's what I know:");
   e.printStackTrace();
  }
 }
}
Таким образом на терминале отобразится текст, возвращаемый командной строкой, и код ошибки.
Код также будет работать и под Linux.
Данную процедуру можно переделать в функцию и возвращать результаты в выходном параметре.

воскресенье, 5 июня 2011 г.

Удаление связанных таблиц ORACLE

При необходимсоти массового удаления таблиц возникают проблемы из-за многочисленных связей между ними.
Данный скрипт решает эту проблему, удаляя сначала внешние ключи, уникальные индексы и чеккеры, затем первичные ключи, а затем и сами таблицы.

set serveroutput on;
begin
  for i in (select * from all_constraints where table_name in ('t1', 't2') and constraint_type in ('U','C','R')) loop
    dbms_output.put_line('alter table ' || i.table_name || ' drop constraint ' || i.constraint_name || ';');
  end loop;

  for i in (select * from all_constraints where table_name in ('t1', 't2') and constraint_type = 'P') loop
    dbms_output.put_line('alter table ' || i.table_name || ' drop constraint ' || i.constraint_name || ';');
  end loop;
  
  for i in (select * from all_tables where table_name in ('t1', 't2') loop
    dbms_output.put_line('drop table ' || i.table_name || ';');
  end loop;
end;