Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно юзать массивы внутри хранимых функций / 4 сообщений из 4, страница 1 из 1
07.10.2014, 11:45:45
    #38768843
Josefina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно юзать массивы внутри хранимых функций
Доброго времени суток, прошу помочь разобраться, как правильно пользоваться массивами внутри хранимой функции.

Собственно хранимая функция:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE OR REPLACE FUNCTION import_map_2014_10_07__14_22_52() RETURNS void AS $$ 
DECLARE 
id_db_map INTEGER; 
id_db_network ARRAY INTEGER[]; 
id_db_device INTEGER; 
id_db_block INTEGER; 
id_db_parameter INTEGER; 
id_db_connector INTEGER; 
BEGIN 
INSERT INTO map(name, image_path, id_status, import_status) 
VALUES ('map_test_import_imported_2014-10-07_14-22-52', ':/images/qss/base.jpg', 1, 2) 
RETURNING id INTO id_db_map; 
INSERT INTO map_history(date_time, old_state, new_state, report_type, id_map, id_reason, id_field) 
VALUES ('2014-09-26T12:39:59', '', '', 5, id_db_map, 1, 1); 
INSERT INTO network(master_network_id, name, display_type, internal_type, color, id_map, id_status) 
VALUES (1, 'snmp_network', 'Сеть PDH (NP)', 'NP', '#655ae2', id_db_map, 2) 
RETURNING id INTO id_db_network[0]; 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '', 5, id_db_network[0], 1, 1); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '997', 9, id_db_network[0], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '464.5', 9, id_db_network[0], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:21', '', '780', 9, id_db_network[0], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:21', '', '352.5', 9, id_db_network[0], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:24', '', '', 0, id_db_network[0], 2, 1); 
INSERT INTO manager(x_coord, y_coord, update_interval, reconfigure_interval, is_control, captured, id_network, id_status) 
VALUES (780, 352.5, 4, 60, 'false', '', id_db_network[0], 2); 
INSERT INTO network(master_network_id, name, display_type, internal_type, color, id_map, id_status) 
VALUES (1, 'snmp_network', 'Сеть SNMP', 'SNMP', '#994042', id_db_map, 1) 
RETURNING id INTO id_db_network[1]; 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '', 5, id_db_network[1], 1, 1); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '997', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '464.5', 9, id_db_network[1], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:35', '', '750', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:35', '', '320.5', 9, id_db_network[1], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:43:07', '', '750', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:43:07', '', '320.5', 9, id_db_network[1], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:03', '', '750', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:03', '', '320.5', 9, id_db_network[1], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:31', '', '750', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:31', '', '320.5', 9, id_db_network[1], 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T13:08:41', '', '750', 9, id_db_network[1], 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T13:08:41', '', '320.5', 9, id_db_network[1], 3, 6); 
INSERT INTO manager(x_coord, y_coord, update_interval, reconfigure_interval, is_control, captured, id_network, id_status) 
VALUES (750, 320.5, 4, 60, 'false', '', id_db_network[1], 1); 
END; 
$$ LANGUAGE plpgsql; 



Создается без ошибок, а при попытке выполнения выдает:

ОШИБКА: тип integer - не массив и для него нельзя указать индекс элемента
CONTEXT: SQL-оператор: "INSERT INTO network(master_network_id, name,
display_type, internal_type, color, id_map, id_status)
VALUES (1, 'snmp_network', 'Сеть PDH (NP)', 'NP', '#655ae2', id_db_map, 2)
RETURNING id [0]"
функция PL/pgSQL import_map_2014_10_07__14_22_52(), строка 15, оператор
SQL-оператор
********** Ошибка **********

ОШИБКА: тип integer - не массив и для него нельзя указать индекс элемента
SQL-состояние: 42804
Контекст: SQL-оператор: "INSERT INTO network(master_network_id, name,
display_type, internal_type, color, id_map, id_status)
VALUES (1, 'snmp_network', 'Сеть PDH (NP)', 'NP', '#655ae2', id_db_map, 2)
RETURNING id [0]"
функция PL/pgSQL import_map_2014_10_07__14_22_52(), строка 15, оператор
SQL-оператор


Что неверно? Как правильно объявить и использовать целочисленный массив в данном случае?
...
Рейтинг: 0 / 0
07.10.2014, 13:03:22
    #38768998
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно юзать массивы внутри хранимых функций
Josefina,

мне кажется что тут вот
авторid_db_network ARRAY INTEGER[];
слово ARRAY лишнее и надо просто писать
id_db_network INTEGER[];


PS: я вообще не уверен что конструкция авторRETURNING id INTO id_db_network[0]; - поддерживается в принципе
...
Рейтинг: 0 / 0
07.10.2014, 13:30:52
    #38769038
Josefina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно юзать массивы внутри хранимых функций
Maxim Boguk,
да, слово ARRAY убрала.

Если вместо этой конструкции сохранять возвращаемое значение просто в переменную, то оно успешно сохраняется.
...
Рейтинг: 0 / 0
08.10.2014, 09:52:51
    #38769950
Josefina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно юзать массивы внутри хранимых функций
Отписываюсь, проблема решена, работу с массивом приходится делать через промежуточную переменную, которая участвует в запросах вставки.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
CREATE OR REPLACE FUNCTION import_map_2014_10_08__12_48_54() RETURNS void AS $$ 
DECLARE 
id_db_map INTEGER; 
id_db_network_mass INTEGER[]; 
id_db_network INTEGER; 
id_db_device INTEGER; 
id_db_block INTEGER; 
id_db_parameter INTEGER; 
id_db_connector INTEGER; 
BEGIN 
INSERT INTO map(name, image_path, id_status, import_status) 
VALUES ('map_test_import_imported_2014-10-08_12-48-54', ':/images/qss/base.jpg', 1, 2) 
RETURNING id INTO id_db_map; 
INSERT INTO map_history(date_time, old_state, new_state, report_type, id_map, id_reason, id_field) 
VALUES ('2014-09-26T12:39:59', '', '', 5, id_db_map, 1, 1); 
INSERT INTO network(master_network_id, name, display_type, internal_type, color, id_map, id_status) 
VALUES (1, 'snmp_network', 'Сеть PDH (NP)', 'NP', '#655ae2', id_db_map, 2) 
RETURNING id INTO id_db_network; 
id_db_network_mass[0] = id_db_network; 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '', 5, id_db_network, 1, 1); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '997', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:19', '', '464.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:21', '', '780', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:21', '', '352.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:24', '', '', 0, id_db_network, 2, 1); 
INSERT INTO manager(x_coord, y_coord, update_interval, reconfigure_interval, is_control, captured, id_network, id_status) 
VALUES (780, 352.5, 4, 60, 'false', '', id_db_network, 2); 
INSERT INTO network(master_network_id, name, display_type, internal_type, color, id_map, id_status) 
VALUES (1, 'snmp_network', 'Сеть SNMP', 'SNMP', '#994042', id_db_map, 1) 
RETURNING id INTO id_db_network; 
id_db_network_mass[1] = id_db_network; 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '', 5, id_db_network, 1, 1); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '997', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:33', '', '464.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:35', '', '750', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:40:35', '', '320.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:43:07', '', '750', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:43:07', '', '320.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:03', '', '750', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:03', '', '320.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:31', '', '750', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T12:44:31', '', '320.5', 9, id_db_network, 3, 6); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T13:08:41', '', '750', 9, id_db_network, 3, 5); 
INSERT INTO network_history(date_time, old_state, new_state, report_type, id_network, id_reason, id_field) 
VALUES ('2014-09-26T13:08:41', '', '320.5', 9, id_db_network, 3, 6); 
INSERT INTO manager(x_coord, y_coord, update_interval, reconfigure_interval, is_control, captured, id_network, id_status) 
VALUES (750, 320.5, 4, 60, 'false', '', id_db_network, 1); 
END; 
$$ LANGUAGE plpgsql; 
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно юзать массивы внутри хранимых функций / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]