![]() |
|
Модераторы: LSD |
![]()
|
|
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Привет всем.
Появилась надобность ежедневно проверять наличие данный в таблицах базы. Но не во всех, а в определённых и этот список будет хранится в отдельной таблице. Получить список таблиц которые будеи проверять легко, но я не могу понять как написать процедуру которая бы подставляла этот список в запрос проверки данных. Только начал учить PL/SQL. Это цикл какой-то дожен быть? |
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Если просто нужно узнать количество строк то можно воспользоваться вьюхой all_tables (поле num_rows). Но! для этого статистика по таблице должна быть актуальной.
Если же нужно узнавать наличие каких-то определённых данных, то можно воспользоваться динамическим sql: http://mab.h1.ru/OTHER/dplsql.html Это сообщение отредактировал(а) ToshaCh - 22.5.2009, 19:05 -------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Чёрт, не работает ваша ссылка но похоже, что динамический sql - это оно. Но всё равно хотелось бы конкретных советов от человека, который занимался динамическим sql-ом. Я нашёл всего пару примеров но они какие-то неявные, а очень хочется и нужно разобраться во всём этом.
Хотелось бы начать с простого. Например, есть 2 таблицы a и b, к обоих есть поле time_info хранящее дату. Запросом узнаю, есть ли какоя-то запись в таблице за сегодня. Если нет - пишу в таблицу result , например, дату и название таблицы с отсутствующей датой. Как сделать такую схему с помощью динамического запроса? |
|||
|
||||
| ToshaCh |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Странно я щас по сслыке перешёл, походу она перманентно оживает.
Твой пример можно разобрать где-то вот так. (не судите строго написал за 5 минут, мимоходом левой задней ногой)
В результате:
Добавлено через 2 минуты и 44 секунды З.Ы. Ну уж со вставкой в таблицу result думаю и сам разберёшься. -------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
||||
|
|||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Так-так. А вот это мне уже нравится
|
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Так.
Теперь чтобы дать гибкости, нужно передавать как параметр проверять наличии значений ещё по одному полю в некоторых таблицах (По идее будет так - в таблице С лежат список таблиц(как сделали Вы), а таблице D - список полей каждой из этих таблиц, таблицы связаны по id (c.id = d.id)). Как научить процедуру принимать внешние параметры, или же можно сделать как-то изнутри всё это, как это сделали Вы? Попробовал вот такОбернул всё это дело в процедуру
|
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
declare здесь не надо Пробелов не хватает - синтаксическая ошибка будет. А вот в чём вопрос я не понял. Сейчас у тебя получилось, что для всех таблиц будет один и тот же вариант дополнительного поля, зависящий от того как ты вызовешь проседуру. -------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Идея в том что есть, как Вы создали уже, таблица С, где будет хранится список исследуемых таблиц, и будет ещё связанная с ней таблица D, в которой будут хранится имена полей какждой из исследуемых таблиц. Количество полей во всех таблицах разное, для упрощения скажем что их будет 10 (точно сам пока не знаю). Эти таблицы связаны по id.
Мне нужно чтобы процедура брала с таблицы С имя исследуемой таблицы, и в WHERE проверяла связаныне на пустоту поля из таблицы D. |
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Ну тогда как-нить так:
-------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Похоже на правду.
Правда, не понял строчку 4
Что должно по идее вернуть
? |
||||
|
|||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Ну дык!
-------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Нет, меня смутило то, что из
я не понял откуда возьмётся переменная column_name ? А строка 4, когда подставиться имя колонки, например
|
||||
|
|||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Это не переменная это поле таблицы d
-------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Гляньте, пожалуйста, ещё раз на конечный вариант процедуры и проверте всё ли на месте и ничего я не напутал ли. Идею я понял, но мог что-то напутать с реализацией
|
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
С чего это? Представь что там получается в переменной stmt сейчас? -------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Ммм.... Это да. Но условие where ведь дальше выстраиваться будет, значит так?
|
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Мдя а вот тут проблема. Я предполагал, что будет одно статичекое условие и n динамических: щас вообще ерунда получается:
where and ..... Это надо исправлять. -------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
Наверное так.
-------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
А, вот теперь я понял почему такая конструкция была
+1 вам в карму! Спасибо огромное за помощь, буду докручивать завтра, уже сегодня голова не варит. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
ToshaCh,
1) dbms_sql тут лишний, без него, ИМХО проще. 2) для того чтобы проверить наличие, считать count() это оверхед, достаточно лишь одного фетча
Это сообщение отредактировал(а) Zloxa - 19.6.2009, 10:46 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| ToshaCh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 555 Регистрация: 10.11.2005 Где: Москва, РФ Репутация: 12 Всего: 26 |
О! Никогда не видел, чтобы курсор та компоновали (в смысле как строку). Спасибо.
-------------------- Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 -- Oracle это не только способ отмывания денег, но и вполне себе преличная база данных. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
А вот теперь нужен совет, потому что правила игры как оказалось уже изменились.
Оказалось, что таблицы разные и в основном они связаны друг с другом по айдишникам, что вполне понятно, ну конечно что же поле даты присутсвует только в одной из таблиц. По сути элементарная связаная выборка получается. Запросы будут меняться вероятно? В чём вопрос: как это всё хранить теперь? Создать одну таблицу с полями table_name и query_str, где хранить сами условия, и подставлять в цикле в шаблон
Или, возможно, есть смысл хранить толко названия полей, по которым связаны таблицы? Или есть какое мудрое решение и в тоже время гибкое? Это сообщение отредактировал(а) Castro - 27.5.2009, 11:41 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Думаю так правильнее Любая гибкость достигается, как правило, за счет потери прочности. Я за железобетонные решения. По сему, я не рекомендовал бы хранить запросы в данных. В любом случае, при добавлении таблицы нужно писать запрос. Запрос должен писать программист, не пользователь. Меньше шансов ошибиться у программиста будет, если он будет редактировать текст ХП, которая, будет еще на этапе компиляции проверяться. От того бросайте вы это баловство с универсальными гибкими решениями, пракитика показывает, что ни к чему хорошему они не приводят. Автомобиль амфибия плохо ездиит и плохо плавает, от того их производят так мало и лишь по частным заказам. Это сообщение отредактировал(а) Zloxa - 27.5.2009, 12:48 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Castro |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Появилось вот время занятся сново с эти заданием и уже почти но всё ещё не всё
Вроде всё ок. Но помоему не приходит ничсего в курсор, потому что постоянно идёт вставка "has no data" и не может получить foo.time_info (мож там ксатати чёто с кавычками напутал). DBG - функция дебага, просто пишет в табличку переменную нужную. DBG('j: '||j.tname) вернуло правильно, DBG('cursor query: SELEC...) - тоже правильный запрос, который если скопировать из таблицы и выполнить, то выполнится правильно. Но
возвращает пустоту в таблице и соотвественно всегда срабатывает
Oracle не умеет работать со вложенными циклами? Или в чём может быить причина? Как ещё можно отдебажить курсор. Работаю в SQL Navigator и все приблуды c SQL * plus к сожалению не могу испытать (или не знаю просто как это сделать :(( ) |
||||||
|
|||||||
| Zloxa |
|
||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Это не код это бред.
Должно поднимать эксепшн.
если попытаться выполнить это, тоже должен быть эксепшн. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||
|
|||||
| Castro |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
это бред - я это понял сразу, но эксепшна не вываливается. Как парвильно встать в таблицу содержмое курсора?
а что здесь не так? Это сообщение отредактировал(а) Castro - 19.6.2009, 10:09 |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
считай кавычки, ну или хотябы смотри на то как подсвечен синтаксис. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Castro |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Спасибо. Использовал Вашу процедуру, но она не успела отработать
Так, упростил всё что только можно.
В цикле делается один проход (в дебаге видны данные) и всё валится на строке
с ошибкой Error executing statement: ORA-06502: PL/SQL: numeric or value error Погуглил и нашёл что http://www.mydatabasesupport.com/ora-06502...alue-error.html Это попытка записать большой объём данных в переменную foo, больший чем оно может вместить? В смысле в DUAL не может влезть? Илия ошибаюсь? Как это побороть? |
||||
|
|||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
структура переменной foo не соответствует структуре, возвращенной курсором. Вы в переменную типа чар(1) пытаеесь впихнуть дату -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Спасибо большое.
Глаз замылился уже, пока пишу пост, в голове решаю задачу, потом отправляю пост и за 10 секунд решаю проблемму Хотел ещё по поводу кавычек спросить - иногда применяются 2 кавычки, а иногда 3. 2 кавычки - это чтобы экарнировать одну кавычку при вложенности, а когда применяют 3? Это сообщение отредактировал(а) Castro - 19.6.2009, 11:32 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
3=2+1 т.е. кавычка внутри строки+закрывающая кавычка Добавлено через 2 минуты и 4 секунды Это говорит лишь о том, что Вы сначала спрашиваете а потом думаете, что не делает Вам чести. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Castro |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 353 Регистрация: 31.8.2007 Где: Украина Репутация: нет Всего: 5 |
Согласен, но:
1) Это для меня новое поле деятельности и не у кого спросить так чтобы быстро получить вразумительный ответ. 2) Правилоно сформулированый вопрос - это уже половина ответа. Формулирую вопрос я обдумаваю проблемму. Значит нужно научится заставлять себя писать суть вопроса но не отправлять его на форум. В любом случае спасибо. Процедура заработала и гребёт данные. +1 вам в карму! |
|||
|
||||
![]()
|
| Правила форума "Oracle" | |
|
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Oracle | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |