Здравствуйте поклонники PostgreSQL.
Добро пожаловать в мой блог.
В предыдущем посте я описал свой первый опыт работы с pgScript. Там описан минимальный функционал, владея которым можно написать нечто простое. Но по некоторым пунктам хотелось бы конкретики... поэтому далее я опишу еще несколько постов с, наблюдениями и практикой связанной с pgScript.
Тип RECORD.
Тип RECORD является двумерным массивом данным, доступ к элементам которого осуществляется через индексы элементов. Элементы нумеруются с нуля. Первый индекс массива указывает на строку, второй на столбец. Например:
Извлечение одной строки-записи:
@ResultOneRec = @Rec[0]; -- переменную @ResultOneRec записана первая строка (индекс = 0) записи @Rec, значение - "(1,2,3,4)"
Взаимодействие типа RECORD и SQL-запросов.
Напишем небольшой SQL-скрипт подготавливающий небольшой "полигон" для тестов:
Далее, напишем скрипт на pgScript:
Пока все. По мере поступления новой информации о типе RECORD буду публиковать ее сюда.
Добро пожаловать в мой блог.
В предыдущем посте я описал свой первый опыт работы с 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
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;
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
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)
[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 буду публиковать ее сюда.
Комментариев нет:
Отправить комментарий