Страницы

28 марта 2012 г.

pgScript. Использование типа RECORD.

Здравствуйте поклонники PostgreSQL.
Добро пожаловать в мой блог.
       В предыдущем посте я описал свой первый опыт работы с pgScript. Там описан минимальный функционал, владея которым можно написать нечто простое. Но по некоторым пунктам хотелось бы конкретики... поэтому далее я опишу еще несколько постов с, наблюдениями и практикой связанной с pgScript.

Тип RECORD.

       Тип RECORD является двумерным массивом данным, доступ к элементам которого осуществляется через индексы элементов. Элементы нумеруются с нуля. Первый индекс массива указывает на строку, второй на столбец. Например:

 declare @Rec{@F1,@F2,@F3,@F4};

begin
    set @Rec[0][0] = 1;
    set @Rec[0]['@F2'] = 2;
    set @Rec[0][2] = 3;
    set @Rec[0]['@F4'] = 4;

    set @Rec[1]['@F1'] = 5;
    set @Rec[1][1] = 6;
    set @Rec[1]['@F3'] = 7;
    set @Rec[1][3] = 8;

    print @Rec;
end

Результат:

[PGSCRIPT ] (1,2,3,4)

(5,6,7,8)

      В этом примере показан вариант объявления переменной типа RECORD, и несколько вариаций заполнения.

Объявление переменной:

declare @Rec{@F1,@F2,@F3,@F4};

@F1,@F2,@F3,@F4 - количество переменных внутри фигурных скобок равно количеству колонок доступных для записи в данную переменную.

Варианты заполнения:

Заполняем первую строку массива:

set @Rec[0][0] = 1; - указание индексов цифровыми значениями
set @Rec[0]['@F2'] = 2; - указание индекса так же допустимо по имени переменной, которая была указана при объявлении RECORD. такая запись эквивалентна - "set @Rec[0][1] = 2;"

set @Rec[0][2] = 3;

set @Rec[0]['@F4'] = 4;

Заполняем вторую строку массива (все тоже самое что и в варианте выше за исключением индекса строки ("[1]")):

set @Rec[1]['@F1'] = 5;
set @Rec[1][1] = 6;
set @Rec[1]['@F3'] = 7;
set @Rec[1][3] = 8;

Способы извлечения значений из переменных типа RECORD:

declare @Rec{@F1,@F2,@F3,@F4};
declare @Result;
declare @ResultOneRec;
begin
    set @Rec[0][0] = 1;
    set @Rec[0]['@F2'] = 2;
    set @Rec[0][2] = 3;
    set @Rec[0]['@F4'] = 4;

    set @Rec[1]['@F1'] = 5;
    set @Rec[1][1] = 6;
    set @Rec[1]['@F3'] = 7;
    set @Rec[1][3] = 8;

    set @ResultOneRec = @Rec[0];
    set @Result = @Rec[1][3];

    print @Rec;
    print @ResultOneRec;
    print @Result;
end

Результат

[PGSCRIPT ] (1,2,3,4) (5,6,7,8)

[PGSCRIPT ] (1,2,3,4)

[PGSCRIPT ] 8
Извлечение одного элемента из массива осуществляется следующим образом:
set @Result = @Rec[1][3]; --в переменную @Result записывается число 8.

Извлечение одной строки-записи:


@ResultOneRec = @Rec[0]; -- переменную @ResultOneRec записана первая строка (индекс = 0) записи @Rec, значение - "(1,2,3,4)"

 Взаимодействие типа RECORD и SQL-запросов.

       Напишем небольшой SQL-скрипт подготавливающий небольшой "полигон" для тестов:

create table test_table ( field1 int, field2 character varying );  
insert into test_table(field1, field2) values (1, 'value1'); 
insert into test_table(field1, field2) values (2, 'value3'); 
insert into test_table(field1, field2) values (3, 'value3'); 
select * from test_table;

Далее, напишем скрипт на pgScript:

declare @ResultRec; 
begin
        set @ResultRec = select * from test_table; 
        print @ResultRec; 
        set @ResultRec = insert into test_table (field1, field2) values(4, 'value4'); 
        print @ResultRec; 
end
Результат:
[QUERY ] select * from test_table 
[PGSCRIPT ] (1,"value1") (2,"value3") (3,"value3") 
[QUERY ] insert into test_table (field1, field2) values(4, 'value4') 
[PGSCRIPT ] (1)

       Как видно в скрипте, единственная переменная которой суждено запихнуть в себя результат запроса объявлена не как RECORD, а как обычная. Ошибок в работе это не вызовет, т.к. pgScript сам преобразовывает переменные под записываемые в них значения.
Далее, строка
set @ResultRec = select * from test_table;
записывает в @ResultRec ВЕСЬ набор данных который возвращает запрос SELECT. Я бы не рекомендовал использовать эту возможность, если запрос возвращает большое количество записей, ибо память может легко закончится. :)
Напомню, что после того как мы присвоили переменной результат запроса, переменная автоматически приводится к типу RECORD, с полной поддержкой операций доступа к данным описанным выше.
       Использование SQL-команд отличных от SELECT возвращает в переменную результат выполнения - 0 или 1 (читать как false или true). Это видно из результатов выполнения скрипта, которые я привел выше.

       Пока все. По мере поступления новой информации о типе RECORD буду публиковать ее сюда.

Комментариев нет:

Отправить комментарий