Кадры решают всё!

«Кадры решают всё» — знаменитая фраза, которую приписывают Вождю народов И.В. Сталину, актуальна всегда, но сегодня актуальна как никогда ранее.

Кадры решают всё

С кадрами проблемы везде и всюду, достаточно просто оглядеться вокруг. Некомпетентность, халатность и самое главное, безразличие к результату своего труда — огромная проблема современной России. От этих проблем у нас всё чаще случаются аварии на жизненно важных объектах (например: Саяношушенская ГЭС), но я вернусь в знакомую более всего для меня IT — отрасль.

Здесь всё, что я буду говорить далее, относится к Красноярску, возможно в других регионах иначе — но в Красноярске сейчас дела обстоят именно так.
Читать дальше →

Работа со строками в Oracle (PL/SQL)

Основные способы обработки строковых значений в Oracle.
В этой публикации я приведу основные функции работы со строками которые встречались мне в работе, и будут полезны всем кто работает с Oracle.

CONCAT — Объединяет две строки
SQL> select concat('Пётр ','первый') from dual;
 
CONCAT('ПЁТР','ПЕРВЫЙ')
-----------------------
Пётр первый


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

Как отлавливать ошибки в Oracle (PLSQL) EXCEPTION,SQLERRM,SQLCODE

Маленькое руководство по отлавливанию ошибок в Oracle PLSQL.
Описание как использовать в Oracle (PLSQL) функции SQLERRM и SQLCODE для отлова ошибок EXCEPTION, с описанием синтаксиса и примером.

Функция SQLERRM возвращает сообщение об ошибке связанное с последним возникшим исключением (ошибкой).
Функция SQLERRM — не имеет параметров.

Функция SQLCODE возвращает код ошибки связанный с последним возникшим исключением (ошибкой)
Функция SQLERRM — не имеет параметров.

Обычно обработка исключений EXCEPTION выглядит следующим образом:

EXCEPTION
   WHEN наименование_ошибки_1 THEN
      [statements]

   WHEN наименование_ошибки_2 THEN
      [statements]

   WHEN наименование_ошибки_N THEN
      [statements]

   WHEN OTHERS THEN
      [statements]

END [наименование_процедуры];


Вы можете использовать функции SQLERRM и SQLCODE для вызова сообщения об ошибке например таким образом:
EXCEPTION
   WHEN OTHERS THEN
      raise_application_error(-20001,'Произошла ошибка - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
-- В данном случае появится всплывающее сообщение.


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

Oracle - функция вычисления контрольного разряда EAN-13

Функция для вычисления контрольного разряда штрихкода EAN13 по первым двенадцати цифрам.
На входе подаем строку (12-значное число).
На выходе получаем цифру контрольного разряда.
function GetControlNumber(p_code varchar2) return number
  is
   v_chet number;
   v_nechet number;
   v_itog number;
   v_res number;
  begin
     
     v_chet := to_number(substr(p_code,2,1))+to_number(substr(p_code,4,1))+to_number(substr(p_code,6,1))+to_number(substr(p_code,8,1))+to_number(substr(p_code,10,1))+to_number(substr(p_code,12,1));
     v_nechet := to_number(substr(p_code,1,1))+to_number(substr(p_code,3,1))+to_number(substr(p_code,5,1))+to_number(substr(p_code,7,1))+to_number(substr(p_code,9,1))+to_number(substr(p_code,11,1));
     v_itog := mod(((v_chet*3)+v_nechet),10);

     if v_itog>0 then 
       v_itog := 10 -v_itog;
     end if; 
     v_res:=v_itog;
     
   return v_res;
  end;


Пользуйтесь на здоровье.

Про алгоритм вычисления контрольного разряда можно прочитать здесь.

Oracle - Фичи и полезности (Часть №1)

Здесь буду выкладывать всякие полезные мелочи и запросы, которые могут пригодиться с их описанием.

1. Получаем список всех полей интересующей нас таблицы.
select  column_name 
  from user_tab_columns 
  where upper(table_name) = upper('название_таблицы')


2. Меняем формат даты по умолчанию в сессии.
alter session set NLS_DATE_FORMAT = 'dd.mm.yyyy hh24:mi:ss';
— Пока сессия не закрыта, будет действовать установленный таким образом формат.

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

Oracle - Функции RANK() и DENSE_RANK() (Или учимся выбирать необходимые значения внутри множественной выборки)

Начнем с функции RANK(). С объяснения для чего она и в каких случаях она нам может пригодиться.

Функция RANK() — это очень полезная функция, она позволяет нам пронумеровать набор по некоторому группирующему значению внутри всего выбранного набора данных. Проще всего показать это на примере. Для этого создадим небольшую таблицу:
ID	PERSON	DT			SM

1	Роман	01.10.2016 11:51:31	545.3
2	Роман	01.10.2016 11:51:31	445.2
3	Роман	01.10.2016 11:51:31	145.3
4	Кирил	01.05.2016 16:51:31	99.5
5	Алена	01.07.2016 12:51:31	445.3
6	Роман	01.12.2016 16:51:31	876.1
7	Кирил	01.06.2016 16:51:31	237.22
8	Алена	01.12.2016 16:51:31	145.3
9	Алена	01.02.2016 14:51:31	534.7
10	Роман	01.03.2016 16:51:31	165.3
11	Кирил	01.04.2016 16:51:31	345.2


Пусть в этой таблице будет содержать некоторые выставленные счета разным пользователям PERSON на разные суммы SM в разное время DT.

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

Интересно рассказывает о том, как стал программистом.

Очень интересно рассказывает как стал программистом, случайно наткнулся и досмотрел до конца.
Особенно будет полезно видео начинающим и студентам первого курса.


Приятного просмотра.

Полезные мелочи при администрировании и работе с Oracle

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

Узнаем все пути к каталогам Oracle
SELECT * FROM V$DIAG_INFO


Узнаем версию сервера Oracle
SELECT * FROM V$VERSION

Пример POST запроса через WebRequest

Пример POST запроса к сервису с использованием WebRequest на C#:

using System;
using System.Net;
using System.IO;

namespace Tester
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("RUN Tests for Service:");

            //Выполняем тестовый POST запрос к службе.               
            SendTestPostRequest(@"URL - сервиса", "Текст запроса");

            Console.WriteLine("Press any key for exit...");
            Console.ReadKey();
        }

        //Метод выполяющий запрос по указанному адресу и получающий ответ.
        static void SendTestPostRequest(string url, string data)
        {
            try
            {
                WebRequest request = WebRequest.Create(url);
                request.Method = "POST";
                string postData = data;
                request.ContentType = "application/x-www-form-urlencoded";
                System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                byte[] postByteArray = encoding.GetBytes(postData);
                request.ContentLength = postByteArray.Length;

                System.IO.Stream postStream = request.GetRequestStream();
                postStream.Write(postByteArray, 0, postByteArray.Length);
                postStream.Close();
                HttpWebResponse response = (HttpWebResponse) request.GetResponse();
                Console.WriteLine("Response Status Description: " + response.StatusDescription);
                Stream dataSteam = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataSteam);
                string responseFromServer = reader.ReadToEnd();
                Console.WriteLine("Response: " + responseFromServer);
                reader.Close();
                dataSteam.Close();
                response.Close();
            }
            catch(Exception ex)
            {
                //Если что-то пошло не так, выводим ошибочку о том, что же пошло не так.
                Console.WriteLine("ERROR: "+ex.Message);
            }
        }

    }
}

Получаем программно серийный номер на ТСД Cipher 9300

Публикация в дополнение вот к этой: Программируем лазерный считыватель на терминалах сбора данных Cipher (9300).

У терминалов сбора данных Cipher с Windows CE — есть одна особенность, в отличие от всех других ТСД (во всяком случае Motorola(Symbol) и Datalogic) стандартными способами получить серийный номер не получится. Получить то он получится — но будет на всех устройствах одинаковый, что лично меня не устраивает.

Однако этот глюк можно обойти и получить серийный номер при помощи API с библиотекой SystemApi_Ce_Net.DLL которая поставляется на диске с терминалом.

Ниже маленький примерчик кода — как это сделать:
using Cipherlab.SystemAPI;


int err = 0;

DataType.DataStruct.SYSINFO sysinfo = new DataType.DataStruct.SYSINFO();
            
err = SystemAPI.Function.GetSysInfo(ref sysinfo);

string serial = Encoding.UTF8.GetString(sysinfo.SerialNum,0,sysinfo.SerialNum.Length);

Полагаю комментарии излишни, и так всё достаточно просто и понятно.