powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно юзать массивы внутри хранимых функций
4 сообщений из 4, страница 1 из 1
Как правильно юзать массивы внутри хранимых функций
    #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
Как правильно юзать массивы внутри хранимых функций
    #38768998
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Josefina,

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


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

Если вместо этой конструкции сохранять возвращаемое значение просто в переменную, то оно успешно сохраняется.
...
Рейтинг: 0 / 0
Как правильно юзать массивы внутри хранимых функций
    #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
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно юзать массивы внутри хранимых функций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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