Удаленная работа и как правильно ее готовить

UPD: Эта статья была написана до того, как ко мне попали такие книги как «Remote» Джейсона Фрайда и «Офис в стиле фанк. Манифест удаленной работы» (Why work sucks and how to fix it) Джоди Томпсон и Кали Ресслер, которые заставили меня немного переосмыслить мои представления о предмете, чего и всем рекомендую.
Речь пойдет об организации удаленки на постоянном месте работы, не о фрилансе.
Ни для кого не секрет, что работодатели очень любят, чтобы их сотрудники находились в офисе и очень не любят, когда те работают удаленно. Происходит это от недоверия: не видно человека — значит непонятно, что он делает. В моей практике мне приходилось слышать от руководства такое: «Откуда нам знать, что ты работаешь? Может ты в приставку играешь?”
Чтобы таких вопросов не возникало и все были довольны я придерживаюсь следующих принципов:
  1. Начинать и заканчивать рабочий день тогда же когда и в офисе
    Если рабочий день в офисе начинается в 9:00, то и работая удаленно в 9:00 надо быть в онлайне. Из этого могут быть исключения, т.к. удаленная работа предоставляет определенную гибкость в планировании своего времени, но тогда надо помнить что 8 часов в день в любом случае принадлежат вашей работе
  2. Время отклика — 10 минут
    Это означает, что если коллеги, например через мессенджер, задают вопрос, их вопрос не проваливается в пустоту и они получают от вас отклик. Это не значит, что надо бросить ту задачу которая в текущий момент выполняется, достаточно ответить “я сейчас работаю над такой-то задачей, через Х минут отвечу на ваш вопрос”. 10 минут вполне достаточно, чтобы зафиксировать свою текущую мысль и ответить. Таким образом люди видят, что вы работаете и вы на связи. Вас не должны «искать». Если вам нужно куда-то отлучиться, просто поставьте коллег в известность, через какой период времени вы будете на связи.
  3. Всегда надо быть готовым отчитаться о ходе работы
    Тут все очень просто: у вас спрашивают, чем вы сейчас заняты, вы отвечаете, что конкретно вы делаете, например “Я по такой-то задаче делаю то-то”. Тут главное сообщать не просто задачу, а какое  действие по ней вы сейчас совершаете.
  4. Если возникают проблемы в выполнении задачи, сразу сообщать о  них
    Тут все очевидно. Непонятна задача? Нехватает данных? Надо сразу “бить в колокола” а не дожидаться когда вас спросят почему задача не выполнена. Это относится к работе вообще, а не только к удаленке.
Кому-то может показаться, что перечисленные мной правила в какой-то степени ограничивают свободу, присущую удаленке, но тут следует помнить, что удаленная работа — такая же работа как и в офисе, разница только в том, что вы не тратите 2+ часа в день на дорогу и можете сами организовывать свое рабочее место. Эти правила являются компромиссным вариантом, другим вариантом может быть, например, использование в организации приложений слежения/учета времени удаленных сотрудников о которых я возможно расскажу позже.

Создание внешних ключей

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

declare
  vSQL varchar2(2000);
  vi number;
begin
  vi := 1;
for c in (
select a.table_name, a.column_name, b.table_name pk_table
  from user_tab_columns a,
       user_constraints b,
       user_ind_columns c
  where (a.column_name like 'KD_%' or (a.column_name like 'ID_%' and a.column_name!='ID_USR'))
    and not exists (select 1 from user_constraints b1, user_ind_columns c1
                      where b1.table_name=a.table_name and b1.constraint_type='P' and c1.index_name=b1.index_name
                        and c1.column_name=a.column_name)
    and b.constraint_type='P' and b.table_name!=a.table_name and b.index_name=c.index_name
    and c.column_name = a.column_name) loop
    begin
      vSQL:='create index '||c.table_name||'_i'||to_char(vi)||' on '||c.table_name||' ('||c.column_name||')';
      execute immediate vSQL;
      vi:=vi+1;
    exception
      when others then
        null;
    end;
    begin
      vSQL:='alter table '||c.table_name||' add constraint '||c.table_name||'_fk'||to_char(vi)||' foreign key ('||c.column_name||') '||
            'references '||c.pk_table||' ('||c.column_name||')';
      execute immediate vSQL;
      vi:=vi+1;
    exception
      when others then
        dbms_output.put_line(c.table_name||c.column_name);
        dbms_output.put_line(vSQL);
    end;
end loop;
end;

Dark Theme for Oracle JDeveloper/SQL Developer

Основа взята отсюда и немного (на текущий момент чуть менее чем полностью) переделана. Для установки кладем файл fusiondark.jar (тут) в .\ide\themes\ . В преференсах выбираем тему «Fusion Dark»:

SQLDev_dark_sw

Результат:

SQLDev_dark2

UPD: v2 почти вычищен синий цвет

Отладка приложения из OC4J в IDEA

Если у вас приложения для OC4J сделано в JDeveloper 10g то проблем нет – JDeveloper сам понимает контейнер и можно отлаживаться. Но что делать, если вам достается проект, собиреемый Maven’ом и содержащий в себе весь “зоопарк” Java-технологий (Spring, Hibernate и т.д.). Конфигурация для OC4J в IDEA по-умолчанию отсутствует. Поиск статей по этой проблеме на русском языке результатов не дал. Поэтому напишу свою. Все действия происходят под Windows.

Шаг 1. Настраиваем локальный OC4J контейнер

В файл oc4j.cmd вставляем:

set OC4J_JVM_ARGS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -Xms512m -Xmx700m -XX:MaxPermSize=500m
set JVMARGS=%OC4J_JVM_ARGS%

где address=8000 – адрес порта для отладки (это не тот порт к которому идет подключение клиентом или браузером), а -Xms512m -Xmx700m -XX:MaxPermSize=500m – настройки памяти JVM (что они обозначают не имею ни малейшего представления, потому что не настоящий java-программер)

Запускаем: oc4j –start

По-умолчанию порт выставлен как 8888, заходим в Server Control: http;//localhost:8888/em и деплоим предварительно собраный ear-файл.

Шаг 2. Настраиваем IDEA

Открываем проект (если проект сделан в Maven и не создан проект для IDEA, то сначала запускаем mvn idea:idea, а потом открываем получившийся проект)

В IDEA выбираем Run –> Edit configuration. В открывшимся окне нажимаем кнопку “Add new configuration”, в списке выбираем Remote, обзываем по человечески и меняем номер порта на тот который задан в шаге 1 у контейнера (8000)

image

Сохраняем.

Шаг 3. Собственно отладка

Расставляем брек-пойнты, жмем Run –> Debug ‘OC4J’. Подключаемся к контейнеру клиентом, выполняем операции, которые остановятся на брек-пойнте и будет предоставлена отладочная информация.

Вот в общем-то и все.

Оптимизация “исторического” отчета в Oracle

Допустим, что у нас есть таблица, содержащая некие данные о деньгах в количестве 10000 записей, такого вида:

CREATE TABLE MAIN_TABLE
(
  ID NUMBER NOT NULL,
  SUMMA NUMBER NOT NULL
,CONSTRAINT MAIN_TABLE_PK PRIMARY KEY (ID) ENABLE
);

У этой таблицы есть куча дочерних таблиц и функция расчета некоего остатка денег
CalcRest(id in number,ReportDate in date), собирающая информацию по всем дочерним
таблицам на определенную дату и довольно сложно ее обрабатывающая. Нам нужно получить
отчет содержащий ID, SUMMA и результат CalcRest.

Итерация 0

select id, summa, CalcRest(id,:ReportDate) rest
  from main_table;
Предположим, что в таком виде отчет считается 10 часов – все время уходит на запуск 
CalcRest для каждой из 10000 записей.

Итерация 1

Добавляем к таблице поле для сохранения последнего значения остатка и триггеры для всех 
дочерних таблиц для обновления этого поля:

ALTER TABLE MAIN_TABLE
  ADD ("REST" NUMBER DEFAULT 0 NOT NULL);

create or replace trigger detail_table1_rest
after insert or delete or update on detail_table1
for each row
begin
  —MAIN_ID — ID из MAIN_TABLE в дочерних таблицах
  update main_table
    set rest=CalcRest(:new.main_id, trunc(sysdate))
    where id=:new.main_id;
end;

Теперь запрос для отчета выглядит так:
select id, summa, 
(case when :ReportDate=trunc(sysdate) then rest
else CalcRest(id, :ReportDate) end) rest
from main_table;

Что существенно ускоряет работу отчета, если мы его формируем на текущую дату, для всех остальных дат – 10 часов.

Итерация 2

Добавляем поле с датой изменения остатка и модифицируем триггера:

ALTER TABLE MAIN_TABLE
  ADD ("REST_DATE" DATE DEFAULT sysdate NOT NULL);

create or replace trigger detail_table1_rest
after insert or delete or update on detail_table1
for each row
begin
  —MAIN_ID — ID из MAIN_TABLE в дочерних таблицах
  update main_table
    set rest=CalcRest(:new.main_id, trunc(sysdate)),
        rest_date=sysdate
    where id=:new.main_id;
end;

И запрос:

select id, summa,
(case when :ReportDate=trunc(sysdate) or :ReportDate>rest_date then rest
else CalcRest(id, :ReportDate) end) rest
from main_table;

В результате CalcRest вызывается только для записей у которых остаток менялся после той даты на которую мы формируем отчет.

PS: Получилось немного сумбурно, но данный алгоритм реально работает.

bash-like prompt in Windows PowerShell

На досуге развлекался переделкой PowerShell чтобы он был похож на Linux’овский bash 😉 Вот что получилось…
Вставляем следующий код в $PROFILE:

cd $env:userprofile

function prompt
{
    $homedir=$env:userprofile;
    $m=$homedir.length;
    $str = $pwd.Path;
    if ($str -eq $homedir)
    {
        $str="~";
    }
    else
    {
        if ($str.length -ge $m)
        {
            if ($str.substring(0,$m) -eq $homedir)
            {
                $str="~"+$str.substring($m);
            }
        }
    }

    Write-Host -NoNewline -ForeGroundColor Cyan "PS ";

    if ($env:username -eq "Администратор")
    {
        Write-Host -NoNewline -ForeGroundColor Gray "$env:computername:";
    }
    else
    {
        Write-Host -NoNewline -ForeGroundColor Gray "$env:username@$env:computername:";
    }   
    Write-Host -NoNewline -ForeGroundColor DarkYellow "$str";
    if ($env:username -eq "Администратор")
    {
        Write-Host -NoNewLine -ForeGroundColor Cyan " #";
    }
    else
    {
        Write-Host -NoNewLine -ForeGroundColor Cyan ">";
    }
    " "
}

Получаем результат:

Новый рисунок (2)

Реанимация Oracle Database Control 11g

Суть проблемы в том,
что Control вешается на IP-адрес. Т.е. при динамическом IP или отсутствии сети
становится недоступен. Естественное решение — повесить его на localhost.

 

Гасим службы Oracle.
Отрубаем сеть. Удаляем каталог ORACLE_HOME192.168.1.65_ORCL. Удаляем службу
OracleDBConsoleORCL. Запускаем оставшиеся службы Oracle. Запускаем
Configuration Assistant, ставим галку Configure Database Control. Создаются
служба OracleDBConsoleORCL и каталог <имя хоста>_ORCL. Но при этом
появляется ошибка про Enterprise Manager Repository с командами как исправить.
Пробуем. Не помогает — пароль не найден в репозитории.

 

Решение
нашлось
 здесь:

After an
installation of a new Oracle Home and complete restore of the database it is
nescesary to regenerate the Database Console repository to use the Enterprise
Manager.

[oracle@centos
~]$ . oraenv

ORACLE_SID
= [orcl] ? orcl

The
Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1 is
/u01/app/oracle

create a
password file:

orapwd
file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=<password>

and check
the parameter remote_login_password:

[oracle@centos
db_1]$ sqlplus / as sysdba

SQL*Plus:
Release 11.1.0.6.0 — Production on Thu Jan 10 19:15:47 2008

Copyright
(c) 1982, 2007, Oracle. All rights reserved.

Connected
to:

Oracle
Database 11g Enterprise Edition Release 11.1.0.6.0 — Production

With the
Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>
show parameter password

NAME TYPE
VALUE

————————————
———– ——————————

remote_login_passwordfile
string EXCLUSIVE

SQL>

if this
is not exclusive, change it and restart the database. After this you can
connect as sysdba over tns.

It is
nescesary to recreate the repository because with the reintall of oracle we
lost the repository key. which is located in the oracle_home. First thing to do
is drop the repository:

[oracle@centos
db_1]$ emca -deconfig dbcontrol db -repos drop

STARTED
EMCA at Jan 10, 2008 8:12:36 PM

EM
Configuration Assistant, Version 11.1.0.5.0 Production

Copyright
(c) 2003, 2005, Oracle. All rights reserved.

Enter the
following information:

Database
SID: orcl

Listener
port number: 1521

Password
for SYSMAN user:

Do you
wish to continue? [yes(Y)/no(N)]: y

Jan 10,
2008 8:12:46 PM oracle.sysman.emcp.EMConfig perform

INFO:
This operation is being logged at
/u01/app/oracle/cfgtoollogs/emca/orcl/emca_2008_01_10_20_12_36.log.

Jan 10,
2008 8:12:48 PM oracle.sysman.emcp.util.DBControlUtil stopOMS

INFO:
Stopping Database Control (this may take a while) …

Jan 10,
2008 8:13:01 PM oracle.sysman.emcp.EMReposConfig invoke

INFO:
Dropping the EM repository (this may take a while) …

Jan 10,
2008 8:20:33 PM oracle.sysman.emcp.EMReposConfig invoke

INFO:
Repository successfully dropped

Enterprise
Manager configuration completed successfully

FINISHED
EMCA at Jan 10, 2008 8:21:04 PM

[oracle@centos
db_1]$

Now we
can recreate the repository.

[oracle@centos
db_1]$ emca -config dbcontrol db -repos create

STARTED
EMCA at Jan 10, 2008 8:24:25 PM

EM
Configuration Assistant, Version 11.1.0.5.0 Production

Copyright
(c) 2003, 2005, Oracle. All rights reserved.

Enter the
following information:

Database
SID: orcl

Listener
port number: 1521

Password
for DBSNMP user:

Password
for SYSMAN user:

Email
address for notifications (optional): <my mail>

Outgoing
Mail (SMTP) server for notifications (optional): centos.bekijkhet.com

—————————————————————–

You have
specified the following settings

Database
ORACLE_HOME ……………. /u01/app/oracle/product/11.1.0/db_1

Local
hostname ……………. centos.bekijkhet.com

Listener
port number ……………. 1521

Database
SID ……………. orcl

Email
address for notifications …………… <my mail>

Outgoing
Mail (SMTP) server for notifications …………… centos.bekijkhet.com

—————————————————————–

Do you
wish to continue? [yes(Y)/no(N)]: y

Jan 10,
2008 8:24:50 PM oracle.sysman.emcp.EMConfig perform

INFO:
This operation is being logged at
/u01/app/oracle/cfgtoollogs/emca/orcl/emca_2008_01_10_20_24_25.log.

Jan 10,
2008 8:24:54 PM oracle.sysman.emcp.EMReposConfig createRepository

INFO:
Creating the EM repository (this may take a while) …

Jan 10,
2008 8:38:28 PM oracle.sysman.emcp.EMReposConfig invoke

INFO:
Repository successfully created

Jan 10,
2008 8:38:57 PM oracle.sysman.emcp.EMReposConfig uploadConfigDataToRepository

INFO:
Uploading configuration data to EM repository (this may take a while) …

Jan 10,
2008 8:42:16 PM oracle.sysman.emcp.EMReposConfig invoke

INFO:
Uploaded configuration data successfully

Jan 10,
2008 8:42:25 PM oracle.sysman.emcp.util.DBControlUtil configureSoftwareLib

INFO:
Software library configured successfully.

Jan 10,
2008 8:42:25 PM oracle.sysman.emcp.EMDBPostConfig configureSoftwareLibrary

INFO:
Deploying Provisioning archives …

Jan 10,
2008 8:42:49 PM oracle.sysman.emcp.EMDBPostConfig configureSoftwareLibrary

INFO:
Provisioning archives deployed successfully.

Jan 10,
2008 8:42:49 PM oracle.sysman.emcp.util.DBControlUtil secureDBConsole

INFO:
Securing Database Control (this may take a while) …

Jan 10,
2008 8:43:17 PM oracle.sysman.emcp.util.DBControlUtil secureDBConsole

INFO:
Database Control secured successfully.

Jan 10,
2008 8:43:17 PM oracle.sysman.emcp.util.DBControlUtil startOMS

INFO:
Starting Database Control (this may take a while) …

Jan 10,
2008 8:45:47 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration

INFO:
Database Control started successfully

Jan 10,
2008 8:45:47 PM oracle.sysman.emcp.EMDBPostConfig performConfiguration

INFO:
>>>>>>>>>>> The Database Control URL is https://centos.bekijkhet.com:1158/em
<<<<<<<<<<<

Jan 10,
2008 8:46:42 PM oracle.sysman.emcp.EMDBPostConfig invoke

WARNING:

************************ 
WARNING  ************************

Management
Repository has been placed in secure mode wherein Enterprise Manager data will
be encrypted.  The encryption key has been placed in the file:
/u01/app/oracle/product/11.1.0/db_1/centos.bekijkhet.com_orcl/sysman/config/emkey.ora.  
Please ensure this file is backed up as the encrypted data will become unusable
if this file is lost.

***********************************************************

Enterprise
Manager configuration completed successfully

FINISHED
EMCA at Jan 10, 2008 8:46:42 PM

[oracle@centos
db_1]$

Be sure
to backup your system including the emkey.ora file!

Помогло!


Локальная и удаленная отладка в Oracle SQL Developer

Взято из Oracle Magazine январь-февраль 2008

Использование Oracle SQLDeveloper для локальной отладки PL/SQL означает, что вы выбираете и присоединяетесь к PL/SQL-программе, используя SQL Developer Connections Navigator. Вы устанавливаете точку останова в том месте, где отладчик должен сделать паузу, и затем нажимаете кнопку Debug. Oracle SQL Developer стартует отладочный сеанс, соединяется с ним, и останавливается, когда достигнет точки останова. При локальной отладке Oracle SQL Developer – это клиент, который инициирует отладку.
Удаленная отладка PL/SQL-кода в Oracle SQL Developer
означает, что вы инициируете отладочную акцию с клиента, внешнего по отношению к Oracle SQL Developer. Внешние клиенты могут быть PL/SQLWeb-приложениями, приложениями Oracle Application Express или сессиями SQL*Plus. Удаленная отладка требует некоторых ручных действий: запуск отладочного листенера Oracle SQL Developer
и присоединение к этому листенеру через сессию базы данных, которую требуется отладить (Удаленная отладка недоступна для баз данных, версия которых ниже Oracle9I Database Release 2).

Следующие шаги описывают пример удаленной отладочной сессии:
1. В Oracle SQL Developer присоединитесь к базе данных, где находится PL/SQL-код. Используйте ту же строку соединения HR_ORCL и пакет EMP_FETCHER, которые использовались ранее.
2. Выберите соединение HR_ORCL в Connections Navigator,
и затем щелкните правой кнопкой мыши и выберите Remote Debug. Откроется диалоговое окно Listen for JPDA.
3. Введите порт и IP-адрес сервера. Теперь вы видите новое окно Run Manager, на котором отображается информация о сервере Debug Listener. (Можно установить Tools -> Preferences -> Debugger -> Prompt for Debugger Host для отладки, когда соединение выполняется через бранмауэр или сессии виртуальных частных сетей [virtual private network — VPN] ).
4. В Connections Navigator выберите тело пакета EMP_FETCHER, затем щелкните правой кнопкой мыши и выберите Edit…, чтобы открыть редактор кода Oracle PL/ SQL. Кликните в левом поле на FUNCTION GET_EMP…, чтобы установить точку останова.
5. Кликните Compile for Debug как показано на Рис. 2.
6. Теперь вы готовы к тому, чтобы начать удаленный процесс отладки со стороны Oracle SQL Developer. Для этого необходимо, чтобы был готов внешний клиент, в данном случае SQL*Plus. Запустите сессию в SQL*Plus для того же самого пользователя базы данных, и введите IP-адрес и порт, заменив на ваши собственные, которые использовались для удаленного подключения в Oracle SQL Developer:
exec DBMS_DEBUG_JDWP.CONNECT_TCP (‘127.0.0.1’, 4000)
7. В SQL*Plus используйте анонимный блок для вызова функции:
DECLARE
EMP_NO NUMBER;
v_Return HR.EMP_REC;
BEGIN
v_Return := EMP_FETCHER.GET_EMP(201);
END;
/
8. Теперь управление передано Oracle SQL Developer и вы можете выполнять код по шагам. Начиная с этого момента процесс такой же, как при локальной отладке.
Стали активны различные отладочные окна. Все они имеют свое назначение, однако важными сразу же становятся:
• Окно Debugging, которое позволяет управлять выполнением программы. Начните отладку, нажимая пиктограмму Step Into.
• Редактор кода, который показывает точку выполнения. Когда отладка выполняется по шагам, при перемещении мыши всплывающие подсказки отображают название и значение переменной под указателем. Продолжайте нажимать Step Into до тех пор пока не достигните строки EMP_RTN:= EMP_REC…. В этой точке дайте мыши переместиться к переменной EMP_FOUND, чтобы увидеть всплывающую подсказку, как показано на Рис. 3.
• Окно Data отображает все переменные, которые действительны в текущем контексте. Перейдя на точку выполнения EMP_RTN := EMP_REC…, выберите закладку Data и раскройте узел EMP_FOUND. Теперь запись заполнена. В этой точке можно просматривать и модифицировать переменные, чтобы увидеть их влияние на процедуру.
9. Продолжайте шаги до тех пор, когда процедура завершится, управление будет передано внешнему клиенту, и отладочная сессия завершится.

Technorati Теги:

Заметки в процессе подготовки к экзамену OCA 1Z0-147

Technorati Теги:

Реализация проверки бизнес-правил в виде триггеров:

CREATE OR REPLACE TRIGGER check_sal
  BEFORE UPDATE OF sal ON emp
  FOR EACH ROW
  WHEN (new.sal<old.sal OR new.sal>old.sal*1.1)
BEGIN
  RAISE_APPLICATION_ERROR(-20508, ‘Do not decrease salary not increase by more than 10%’);
END;

SHOW ERRORS — показ ошибок компиляции в SQL*Plus

перекомпиляция инвалидных пакетов:

declare
  str varchar2(200);
  err varchar2(2000);
  cursor c_obj is
    select object_name, object_type from user_objects where status=upper(‘invalid’);
begin
  for c1 in c_obj loop
    if c1.object_type=upper(‘package body’) then
      str:=’alter package ‘||c1.object_name||’ compile body’;
    else
      str:=’alter ‘||c1.object_type||’ ‘||c1.object_name||’ compile’;
    end if;
    begin
      execute immediate str;
    exception
      when others then
        select text
          into err
          from user_errors
          where name=c1.object_name and type=c1.object_type and rownum=1;
        dbms_output.put_line(c1.object_name||’:’||err);
        err:=null;
    end;
  end loop;
end;

использование условий типа:

where (i.id, i.date1) in (select k.id, k.date2 from table2) —почему такую конструкцию мы не использовали раньше — загадка, как говориться — век живи — век — учись

09.04.2007 Хранимые процедуры Oracle на C#

Тема хранимых процедур на C# меня заинтересовала, хоть и не совсем понятно зачем это (хранимые процедуры на C#) нужно, но забавно. Впрочем надобность хранимых процедур Oracle на Java также остается для меня туманной.

Сначала пришлось повозиться с Oracle Database Extensions for .NET: оказалось, что к листенеру не был подключен ICP протокол, не был запущен агент для CLR и не был прогнан скрипт DBMSClr.plb после установки ODE.NET. Потом возник вопрос с коннектом из процедуры: ведь глупо в хранимой процедуре, которая запускается врапленной PL/SQL процедурой из схемы, писать в строке подключения имя пользователя, пароль и базу. Ответ нашелся в виде строки подключения "context connection=true". После этого все заработало.
Исходники простенькой функции:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types; 

namespace OraTest
{
    public class Class1
    {
        public static Int32 AbonentsCount()
        {
            //Создаем соединение
           
OracleConnection con = new OracleConnection();
            con.ConnectionString = "context connection=true";
            con.Open();
            //Создаем команду
           
OracleCommand cmd = new OracleCommand();
            cmd.CommandText = "select count(*) cnt from prom_abonent";
            cmd.Connection = con;
            Int32 res = 0;
            res = Convert.ToInt32(cmd.ExecuteScalar());
            cmd.Dispose();
            con.Close();
            return res;
        }
    }

Запуск:
select abonentscount from dual; 

Написал и уже потом нашел туториал от Оракла на эту тему:
http://www.oracle.com/pls/xe102/to_toc?pathname=appdev.102%2Fb25312%2Ftoc.htm&remark=portal+%28Getting+Started%29