среда, 23 ноября 2011 г.

Работаем с оракловыми курсорами в Python с помощью библиотеки cx_Oracle

Курсорная переменная может возвращаться в качестве результата хранимой процедуры, написанной на PL/SQL. Например, вот такой:

create or replace procedure test_cur(
  a number,
  b number,
  p_ret out sys_refcursor)
is
begin
  open p_ret for select a + level-1 v from dual
          connect by level <= b;
end;
Для работы с СУБД Oracle из Python есть весьма хорошая библиотека cx_Oracle . С курсорами работа построена там очень просто - они объявляются как обычные типизированные переменные библиотеки, в данном случае с типом курсора. Всё очень просто, смотрим на примере:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cx_Oracle as db

try:
    conn = db.connect('user', 'password', 'server')
except  db.DatabaseError, err:
    print 'DB Error: ', err
    exit()

cur = conn.cursor()

# так объявляется курсорная переменная
ret = cur.var(db.CURSOR)

# Не забываем, что есть dir(), с чьей помощью можно узнать очень
# много полезного об инстансе курсорной переменной
print 'ret: ', dir(ret)
print 'ret.getvalue(): ', dir(ret.getvalue())
   
cur.execute('''begin test_cur(1, 20, :ret); end; ''', ret=ret)

# описание полей запроса
print ret.getvalue().description

# А вот по этому можно уже пройтись через for ;-)
print ret.getvalue().fetchall()

# не забываем закрывать за собой соединение с Ораклом
conn.close()
Кстати, вот тут лежит неплохой мануал по cx_Oracle на русском языке.

среда, 13 апреля 2011 г.

Ещё один способ "заточки пилы"

Не все из нас работают в стартапах или научных проектах, в творческих коллективах и по SCRUM-методикам. У многих программистов профессиональная деятельность связана с довольно скучными вещами типа сопровождения отчётности и всякой бухгалтерии-логистики.
В этом нет ничего противоестественного или фатального, но иногда могут появляться ощущения однообразия и затягивания в "профессиональную яму".

Для лечения таких симптомов есть масса интересных способов. Ищущий, да найдёт! Недавно я открыл для себя еще один, увлекательный и полезный. Нет, это не онлайн-шахматы или подкидной дурак на мэйл.ру. Это ресурс с несколькими сотнями логических, математических, а также физико-химических задачек.

А открыл я для себя Diofant.ru

Это совместный проект компаний "Интернет-Университет Информационных Технологий (INTUIT.ru)" и издательства "Открытые Системы".
Чтобы решать задачи, регистрироваться не обязательно. Но чтобы узнать правильность ответа и инкрементировать пузомерку рейтинг - зарегистрироваться нужно.

Теперь о том, чем он полезен. Я увидел в нём следующие фишки, которые мне очень понравились.

А. Логические задачки, заставляющие мозг скрипеть, а руки - терзать карандаш и переводить бумагу. Много задач. На логику и математику. Регулярное их решение продлевает жизнь и нефигово "затачивает пилу" логического мышления.

Б. Информатика. Более трех сотен программистских задач. На арифметику, на умение составлять алгоритмы или реализовывать их на языке программирования. Много задач взято с проекта "Эйлер". Что касается выбора средств - тут полная свобода (лично я пользуюсь Python). Нужен только ответ.
Часть задачек решается тупо перебором. Но для некоторых перебор - слишком дорогое удовольствие: задача будет считаться очень, очень долго. Вот тут приходится включать мозг, оптимизировать алгоритм, внимательнее читать условия задачи, применять хитрости, присущие языку, на котором эта задача решается.
Собственно, ради этого всё и затевается. Хочешь - жди неделями, когда найдётся ответ, а хочешь - задумайся, пересмотри алгоритм и может так получиться, что ждать придется не больше минуты. Если есть математическое образование - то да, ждать вообще не придётся ;-)
Ещё я заметил, что с помощью "Диофанта" я воспитываю в себе очень хорошую привычку. А именно, получая некий расчётный ответ в какой-либо задачке, я должен быть уверен на 100% в его правильности. Диофант ошибки не прощает, что сказывается на рейтинге. Поэтому приходится внимательно читать условия и проводить дополнительные проверки.

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

Отчёты отчётами, но "пила" всегда должна быть острой!