Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
Добрый день всем! Хотел бы проконсультироваться вот по какому вопросу: Стоит следующая задача: Написать функцию, которая по заданному параметру создаёт представление на основе таблицы. В этом представлении должны находиться те записи, где поле 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; Жду помощи в решении проблемы... Всем заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2007, 14:38 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
А если попробовать через динамический SQL? типа того? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2007, 21:25 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
StandyСтоит следующая задача: Написать функцию, которая по заданному параметру создаёт представление на основе таблицы. создание в функции VIEW, зависящего от параметров, с неуникальным именем, приведет вас на мерзкие и весьма неявные подводные камни. вы описали не задачу, а своё решение частной подзадачи. вряд ли вам дадут конструктивный совет без информации об исходной проблеме (я, например, не могу - пиво вредит телепатии). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2007, 22:41 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
BlackDan , спасибо! Обязательно попробую и дам знать о результате. .gc , извини, но если я буду формулировать поставленную задачу в целом, я боюсь, что загружу совсем ненужной информацией... На самом деле мне надо справиться с проблемой, с которой я столкнулся. Я не думаю, что такие функции не встречаются в жизни. И обходить их стороной и искать другие методы решения, я думаю, сейчас нет смысла... Спасибо всем отвечающим. Жду ещё решений сложившейся ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2007, 23:56 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
StandyНа самом деле мне надо справиться с проблемой, с которой я столкнулся. Я не думаю, что такие функции не встречаются в жизни. И обходить их стороной и искать другие методы решения, я думаю, сейчас нет смысла... гм, в жизни и не такое встречается :D Standyесли я буду формулировать поставленную задачу в целом, я боюсь, что загружу совсем ненужной информацией Да, ваше полное ТЗ (которого у Вас и нет), нафиг не нужно. Но! Нет контекста, и нет собственно достаточного описания сложившейся ситуации . Даже нет тупых условий уровня школьных задач: " дано :x,y,z, которые связаны вот так, требуется получить : A,B,C в соответствии с ...". Короче, краткий пример о граблях: Пользователь А создаёт VIEW staff_count для num_courses=1, в это время Пользователь Б нажимает на ту же кнопку для num_courses=2. Что он получит, если транзакция А уже завершилась? А если ещё нет? Где используется этот VIEW? Нафига? Что увидит Пользователь В, который в это время запустит действие, использующее этот VIEW? Почему именно это? Ну, студент, что скажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2007, 00:29 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
Более широкая формулировка поставленной задачи: таблица 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 , попрошу не относиться так предвзято и с насмешками, как это было в прошлом письме... Тут никто никому ничего не должен... Не хотите, не помогайте! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2007, 12:45 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
1. Создавать вид с нужными пареметрами нужно с помощью EXECUTE 2. Для поддержки многопользовательского доступа создаешь транзакцию, в ней делаешь временный вид, берешь из него данные, закрываешь транзакцию. Временный вид (таблица) виден только в текущей транзакции и исчезнет при rollback или commit. Существование "нормального" представления с таким же именем тебе не помешает, таким образом, можно просто создать временный вид с именем постоянного, в который добавить нужные ограничения и упростить себе жизнь (не надо будет во всех запросах указывать эти ограничения). 3. На будущее - в постгресе своя идеология и лучше ее понять, чем пытаться прикручивать решения из мускула. Про оракл разговор отдельный, иногда очень даже имеет смысл эмулировать что-то из оракла, когда сам не можешь придумать ничего лучше. Смотри на схемы, триггеры, правила и встроенные языки pltcl, plperl, plpgsql. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2007, 13:52 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
т.е. если я правильно понял, есть Код: plaintext 1. 2. 3. Standy следующий результат: в получившемся представлении находятся все преподаватели, знающие заданный курс и количество дисциплин по этому курсу для конкретного преподавателя так ведь можно записать просто через: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2007, 14:21 |
|
||
|
Проблема при создании представления с помощью функции...
|
|||
|---|---|---|---|
|
#18+
Насчет функций, которые возвращают setof - очень неэффективный путь. Следует динамически создавать виды/таблицы и брать данные из них. Если объем данных менее миллиона записей в каждой из таблиц, можно и с setof функциями работать, но этот путь ведет в тупик. Например, при необходимости поиска или группировки возвращаемых данных setof функции станут большой проблемой (даже при малом объеме данных, < 100 000 возвращаемых записей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2007, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34497320&tid=2005489]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 360ms |

| 0 / 0 |
