powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема при создании представления с помощью функции...
10 сообщений из 10, страница 1 из 1
Проблема при создании представления с помощью функции...
    #34496945
Standy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!
Хотел бы проконсультироваться вот по какому вопросу:
Стоит следующая задача:
Написать функцию, которая по заданному параметру создаёт
представление на основе таблицы. В этом представлении должны находиться те записи, где поле id_course равно значению параметра. Вроде бы всё просто, но вот какая штука получается:

вот функция:
CREATE OR REPLACE FUNCTION f_staff_count(num_courses integer)
RETURNS integer AS
$BODY$BEGIN
CREATE VIEW staff_count AS
SELECT id_staff, count(id_courses)
FROM courses_staff
WHERE id_courses = num_courses -- вот этот параметр
GROUP BY id_staff
ORDER BY id_staff;
RETURN 1;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

но после работы функции создаётся представление следующего вида:

CREATE OR REPLACE VIEW staff_count AS
SELECT courses_staff.id_staff, count(courses_staff.id_courses) AS count
FROM courses_staff
WHERE courses_staff.id_courses = $1 -- почему то не подставляется значение параметра??
GROUP BY courses_staff.id_staff
ORDER BY courses_staff.id_staff;

Жду помощи в решении проблемы...
Всем заранее спасибо!
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497226
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если попробовать через динамический SQL?
типа того?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION f_staff_count(num_courses integer)
RETURNS integer AS
$BODY$
BEGIN
  EXECUTE 'CREATE VIEW staff_count AS
    SELECT id_staff, count(id_courses) FROM courses_staff WHERE id_courses = ' || num_courses ||
    ' GROUP BY id_staff ORDER BY id_staff';
  RETURN  1 ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497276
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
StandyСтоит следующая задача:
Написать функцию, которая по заданному параметру создаёт
представление на основе таблицы.

создание в функции VIEW, зависящего от параметров, с неуникальным именем, приведет вас на мерзкие и весьма неявные подводные камни.

вы описали не задачу, а своё решение частной подзадачи. вряд ли вам дадут конструктивный совет без информации об исходной проблеме (я, например, не могу - пиво вредит телепатии).
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497305
Standy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackDan , спасибо! Обязательно попробую и дам знать о результате.
.gc , извини, но если я буду формулировать поставленную задачу в целом, я боюсь, что загружу совсем ненужной информацией... На самом деле мне надо справиться с проблемой, с которой я столкнулся. Я не думаю, что такие функции не встречаются в жизни. И обходить их стороной и искать другие методы решения, я думаю, сейчас нет смысла...
Спасибо всем отвечающим.
Жду ещё решений сложившейся ситуации.
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497320
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
StandyНа самом деле мне надо справиться с проблемой, с которой я столкнулся. Я не думаю, что такие функции не встречаются в жизни. И обходить их стороной и искать другие методы решения, я думаю, сейчас нет смысла...

гм, в жизни и не такое встречается :D

Standyесли я буду формулировать поставленную задачу в целом, я боюсь, что загружу совсем ненужной информацией

Да, ваше полное ТЗ (которого у Вас и нет), нафиг не нужно.
Но!
Нет контекста, и нет собственно достаточного описания сложившейся ситуации .
Даже нет тупых условий уровня школьных задач: " дано :x,y,z, которые связаны вот так, требуется получить : A,B,C в соответствии с ...".

Короче, краткий пример о граблях:
Пользователь А создаёт VIEW staff_count для num_courses=1, в это время Пользователь Б нажимает на ту же кнопку для num_courses=2. Что он получит, если транзакция А уже завершилась? А если ещё нет? Где используется этот VIEW? Нафига? Что увидит Пользователь В, который в это время запустит действие, использующее этот VIEW? Почему именно это?

Ну, студент, что скажете?
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497482
Standy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Более широкая формулировка поставленной задачи:
таблица staff_discipline содержит информацию о преподавателе и дисциплинах, которые он знает.
таблица courses_discipline содержит информацию о курсах и дисциплинах, из которых состоят курсы.
существует представление, courses_staff . Это представление получено на основе внутреннего объединения таблиц, описанных выше по колонке дисциплина. Оно содержит в себе следующую информацию:
колонка id_courses содрежит номер курса, который может читать преподаватель, а колонка id_staff - номер преподавателя. Так как мы объединяли по дисциплине, то строка вида преподаватель = 1, курс = 1 будет встречаться в представлении столько раз, сколько дисциплин по этому курсу знает преподаватель (в данному случае № 1).
Из этого представления мне нужно выбрать только тех преподавателей, которые знают курс № n (n я задаю). Мои способ решения этой задачи - это создание представления staff_count на основе выше описанного представления courses_staff , в которое помещаются только те строки, в которых содержится номер нужного мне курса. Причем я ещё группирую по колонке преподаватель и подсчитываю (count) для каждого преподавателя количество строк в представлении courses_staff . Это даёт мне следующий результат: в получившемся представлении находятся все преподаватели, знающие заданный курс и количество дисциплин по этому курсу для конкретного преподавателя. На основе этого мне дальше надо выстаривать рейтинг... Но это уже не важно...
Вот такая задача (надеюсь, у меня получилось её немножко развернуть)...
Я согласен, что могут быть проблемы при работате с несколькими пользователями...
Что можете посоветовать с расчётом на многопользовательский доступ к система в свете вышеизложенной задачи (получения списка преподавателей, наилучшим образом подходящих на заданный курс).

P.S. .gc , попрошу не относиться так предвзято и с насмешками, как это было в прошлом письме...
Тут никто никому ничего не должен... Не хотите, не помогайте!
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497519
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
1. Создавать вид с нужными пареметрами нужно с помощью EXECUTE
2. Для поддержки многопользовательского доступа создаешь транзакцию, в ней делаешь временный вид, берешь из него данные, закрываешь транзакцию. Временный вид (таблица) виден только в текущей транзакции и исчезнет при rollback или commit. Существование "нормального" представления с таким же именем тебе не помешает, таким образом, можно просто создать временный вид с именем постоянного, в который добавить нужные ограничения и упростить себе жизнь (не надо будет во всех запросах указывать эти ограничения).
3. На будущее - в постгресе своя идеология и лучше ее понять, чем пытаться прикручивать решения из мускула. Про оракл разговор отдельный, иногда очень даже имеет смысл эмулировать что-то из оракла, когда сам не можешь придумать ничего лучше. Смотри на схемы, триггеры, правила и встроенные языки pltcl, plperl, plpgsql.
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497539
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
т.е. если я правильно понял, есть
Код: plaintext
1.
2.
3.
VIEW courses_staff  AS 
SELECT id_staff, id_course, id_discipline
 FROM courses_discipline JOIN staff_discipline USING (id_discipline)

Standy
следующий результат: в получившемся представлении находятся все преподаватели, знающие заданный курс и количество дисциплин по этому курсу для конкретного преподавателя
так ведь можно записать просто через:
Код: plaintext
1.
2.
3.
4.
VIEW staff_discipline_count AS
SELECT id_staff, id_course, count(id_discipline) as total_disciplines
FROM courses_staff 
GROUP BY id_staff, id_course
это VIEW можно использовать напрямую в запросах
Код: plaintext
1.
2.
SELECT ... FROM yet_another_staff_info JOIN staff_discipline_count USING (id_staff) 
WHERE staff_discipline_count.id_course =  1 
ну нет необходимости создавать view с "зашитой" зависимостью от парамета, да ещё и в функции, в данном случае (хотя для других случаев есть и TEMP VIEW/EXECUTE да и просто функции, которые возвращают SETOF )
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34497573
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Насчет функций, которые возвращают setof - очень неэффективный путь. Следует динамически создавать виды/таблицы и брать данные из них. Если объем данных менее миллиона записей в каждой из таблиц, можно и с setof функциями работать, но этот путь ведет в тупик. Например, при необходимости поиска или группировки возвращаемых данных setof функции станут большой проблемой (даже при малом объеме данных, < 100 000 возвращаемых записей).
...
Рейтинг: 0 / 0
Проблема при создании представления с помощью функции...
    #34500716
Standy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за помощь!
Благодаря вам вопрос решил.
Всем удачи.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблема при создании представления с помощью функции...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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