Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Вниз

Использование пакетов в Оракле   Найти похожие ветки 

 
Сатир   (2006-10-25 12:34) [0]

Вопрос к тем, у кого большой опыт разработки приложений на основе СУБД Оracle.
На данный момент в во всех программах (в одной известной компании)
все select-запросы жёстко зашиты в компонентах доступа к БД. В результате при изменении схемы или названия таблицы приходится искать эти запросы и править их в коде программ. После чего, естественно остаются такие запросы, которые остались несправленными в силу определённых причин.
Мною было предложено вывести все запросы из программного кода и организовать для них свой пакет, а каждый запрос оформить в виде хранимой процедуры с входными параметрами, которая будет возвращать открытый курсор. Но такое предложение не устроило руководителя проекта, потому что запросов очень много и для каждого нужно будет написать свою хранимую процедуру. Он предложил собрать все запросы в одной таблице и написать одну хранимую процедуру, в которую передавать ID запроса из таблицы, в которой он хранится. Но тут встала проблемма с переменным количеством входных параметров.
Как из Delphi вызвать хранимую процедую и передать ей переменное кол-во параметров с переменным названием самих параметров и их типов.
Вопрос №1: будет ли каждый раз разбираться хранящийся запрос в таблице, который мы будем передаваться на вход этой универсальной процедуры?
Вопрос №2: как реализовать из Delphi передачу переменного числа названий параметров , их типов и значений?
Вопрос №3: какие недостатки такого подхода и какое может быть альтернативное решение?(желательно перечислить возможные достоинства и недостатки той или иной схемы решения)


 
Reindeer Moss Eater ©   (2006-10-25 12:38) [1]

В общем дурь все это.
Если схема переименована и она не текущая, то проблема решается синонимами.
Да и вообще.
Не надо придумывать проблему на пустом месте.


 
Курдль ©   (2006-10-25 12:39) [2]

Предлагаю руководителя проекта убить об стену :(
Если он так "наруководил", что
> select-запросы жёстко зашиты в компонентах доступа к БД


 
Игорь Шевченко ©   (2006-10-25 12:40) [3]

Курдль ©   (25.10.06 12:39) [2]


> Если он так "наруководил", что
> > select-запросы жёстко зашиты в компонентах доступа к БД


Э...а где их еще хранить ? :)


 
Reindeer Moss Eater ©   (2006-10-25 12:41) [4]

Руководятела проекта надо убить. Но не за это.
А за то, что работоспособность проекта зависит от имени схемы.


 
artemiy ©   (2006-10-25 12:45) [5]

Вообще то есть такое понятие как схема по умолчанию или синонимы. ИМХО либо делайте "алтер сессион" при логине либо используйте синонимы.
У нас лично так. При логине юзер по синониму вызывает функцию, которая возвращает ИМЯ_СХЕМЫ (зашитое в таблице параметров системы), клиент делает алтер сессион устанавливая данную схему по дефолту. Соотв во всесх запросах имя схемы не участвует.


 
Reindeer Moss Eater ©   (2006-10-25 12:53) [6]

Кстати как именно пакет-то может помочь в этой беде?
Он же тоже принадлежит определенной схеме.


 
Курдль ©   (2006-10-25 12:56) [7]


> Игорь Шевченко ©   (25.10.06 12:40) [3]
> Э...а где их еще хранить ? :)


Например, в ресурсах.
Или лишняя строка кода типа Query.SQL.Text := "select..." - это непозволительная трата человекочасов? :)


 
Reindeer Moss Eater ©   (2006-10-25 13:00) [8]

Например, в ресурсах.

А DFM перестал быть ресурсом?


 
Desdechado ©   (2006-10-25 13:00) [9]

Привязка к имени схемы - это как привязка к жесткому паролю или в IP сервера внутри EXE. Это всего лишь элемент настройки, который может быть вынесен вне программ.
Если используются несколько схем одновременно, то это тоже можно настроить вовне.
1. Хранение запросов в таблице - глупость, ибо они каждый раз будут компилироваться и разбираться. Да и поддержка этой таблицы - лишний геморрой.
2. Создание по процедуре на каждый запрос - тоже неэффективно, поскольку их будут сотни/тысячи. По одной с ними замучаешься разбиравться (темпаче, с правами), а запихивание в пакет их не спасет, т.к. тогда при малейшем изменении 1 запроса весь пакет перекомпилировать/пересобирать придется, а при командой разработке это смерть.

ALTER SESSION + внешняя настройка имени схемы + синонимы, если ничего не помогло


 
Sergey13 ©   (2006-10-25 13:01) [10]

> [0] Сатир   (25.10.06 12:34)
> В результате при изменении схемы
У вас разрабатываемая вами база разложена по разным схемам? Я по неопытности тоже наступал на эти грабли. Лучше от этого уйти, т.е. слить все в одну схему. Сопровождать станет намного проще и легче.


 
Игорь Шевченко ©   (2006-10-25 13:05) [11]

Курдль ©   (25.10.06 12:56) [7]


> Или лишняя строка кода типа Query.SQL.Text := "select...
> " - это непозволительная трата человекочасов? :)


Ну да. Именно непозволительная. Очень меткое слово.


 
Сатир   (2006-10-25 13:07) [12]


> Предлагаю руководителя проекта убить об стену

это самое простое решение и самое неоригинальное.
к тому же, его сложно реализовать в программном коде:)

> Кстати как именно пакет-то может помочь в этой беде?
> Он же тоже принадлежит определенной схеме.

даже если и останется привязка к определённой схеме при вызове хранимых процедур, можно создать синоним.

а на счёт хранения запросов в локальных компонентах, а как на счёт переноса самого приложения на другую платформу или на другой язык программирования? опять все запросы набирать в каждом компоненте доступа к данным?
короче, туго тут у меня с идеологами, а на вопрос:"а что по этому поводу говорит теория?" - приходится постоянно слышать:"нету у нас времени книжки читать. работать нужно"
:-)


 
Игорь Шевченко ©   (2006-10-25 13:09) [13]


> а на счёт хранения запросов в локальных компонентах, а как
> на счёт переноса самого приложения на другую платформу или
> на другой язык программирования? опять все запросы набирать
> в каждом компоненте доступа к данным?


А никак. Приложения такого рода не переносятся ни на платформы ни на языки программирования.


 
Sergey13 ©   (2006-10-25 13:11) [14]

> а как на счёт переноса самого приложения на другую платформу
> или на другой язык программирования? опять все запросы набирать
> в каждом компоненте доступа к данным?

Ты много делал переновов на другие платформы и языки (а языки-то вообще нафига менять????)? Часто слышу про эту проблему. По моим наблюдениям обеспокоенность этой проблемой явно не адекватна самой проблеме.


 
Курдль ©   (2006-10-25 13:12) [15]


> Reindeer Moss Eater ©   (25.10.06 13:00) [8]
> А DFM перестал быть ресурсом?

Я имел в виду ResourceString. А где Вы предпочитаете хранить данные, подверженные частым изменениям?


> Игорь Шевченко ©   (25.10.06 13:05) [11]
> Ну да. Именно непозволительная. Очень меткое слово.


Не думаю, что запись кода запроса в свойство компонента сильно ускорит разработку. Ведь наиболее сложные запросы (DML) требуются для модификации данных. А их уже так просто "в компоненте" не разместишь - только в обработчике типа OnApplyRecord.


 
Sergey13 ©   (2006-10-25 13:15) [16]

> [15] Курдль ©   (25.10.06 13:12)

> Ведь наиболее сложные запросы (DML) требуются для модификации данных.
ИМХО, весьма спорное утверждение.


 
Reindeer Moss Eater ©   (2006-10-25 13:17) [17]

Я имел в виду ResourceString. А где Вы предпочитаете хранить данные, подверженные частым изменениям?

И кто их меняет? Юзер? Программист?
Лично мне заменить текст запросов одинаково легко в обоих случаях.
В ресорстринг они, или в dfm ресурсе или в dfm файле.

даже если и останется привязка к определённой схеме при вызове хранимых процедур, можно создать синоним.

А что мешает создать синоним без пакетов?


 
Игорь Шевченко ©   (2006-10-25 13:17) [18]

Курдль ©   (25.10.06 13:12) [15]


> Я имел в виду ResourceString. А где Вы предпочитаете хранить
> данные, подверженные частым изменениям?


А с какого перепугу тескты запросов считаются данными, подверженными частым изменениям ? Их что, можно безболезненно менять, не меняя логику программы ? Вот новость.


> Не думаю, что запись кода запроса в свойство компонента
> сильно ускорит разработку. Ведь наиболее сложные запросы
> (DML) требуются для модификации данных. А их уже так просто
> "в компоненте" не разместишь - только в обработчике типа
> OnApplyRecord.


Собственно, давно придуманы компоненты a-la TUpdateSQL и их многочисленные аналоги. Там, собственно, запросы для модификации данных и живут себе.


 
Курдль ©   (2006-10-25 13:19) [19]


> Sergey13 ©   (25.10.06 13:15) [16]
> ИМХО, весьма спорное утверждение.

Спорное, но не весьма! :)
Приведу пример, когда требуется замысловатое каскадное обновление нескольких таблиц БД в результате изменений, происшедших в наборе данных. Причем с учетом качества этих изменений (многие, конечно же, отправят меня в ветку "О пользе ХП":)


 
Курдль ©   (2006-10-25 13:21) [20]


> Игорь Шевченко ©   (25.10.06 13:17) [18]
> А с какого перепугу тескты запросов считаются данными, подверженными
> частым изменениям ? Их что, можно безболезненно менять,
> не меняя логику программы ? Вот новость.

Приведу пример, который многие называют досужими фантазиями - переход на другую СУБД.


 
Сатир   (2006-10-25 13:22) [21]


> Ты много делал переновов на другие платформы и языки (а
> языки-то вообще нафига менять????)? Часто слышу про эту
> проблему. По моим наблюдениям обеспокоенность этой проблемой
> явно не адекватна самой проблеме.

а если нужно написать приложение как для настолных компов(разрабатываем на Delphi), так и для КПК, а так же приложение, написанное на Java и все они могут использовать один и тот же сложный запрос, в котором идёт привязка к имени схемы и имени таблицы, тогда при изменении имени схемы или названия колонки таблицы, придётся вносить изменения во все три приложения, которые используют этот запрос. не проще ли его вывести в хранимую процедуру и вызывать его из пакета?


 
Игорь Шевченко ©   (2006-10-25 13:23) [22]

Курдль ©   (25.10.06 13:21) [20]


> Приведу пример, который многие называют досужими фантазиями
> - переход на другую СУБД.


И чем в этом случае может помочь хранение текстов запросов в ресурсах/коде ?
(Я уже не говорю о том, что это досужие фантазии).


 
Sergey13 ©   (2006-10-25 13:25) [23]

> [19] Курдль ©   (25.10.06 13:19)
> Приведу пример, когда требуется замысловатое каскадное обновление
> нескольких таблиц БД в результате изменений

Вот-вот. Приведи пример запроса (можно не очень сложного) реализующего

> замысловатое каскадное обновление нескольких таблиц

8-)


 
Игорь Шевченко ©   (2006-10-25 13:25) [24]

Сатир   (25.10.06 13:22) [21]


> а если нужно написать приложение как для настолных компов(разрабатываем
> на Delphi), так и для КПК, а так же приложение, написанное
> на Java и все они могут использовать один и тот же сложный
> запрос, в котором идёт привязка к имени схемы и имени таблицы


А что, есть сервер Oracle для КПК ?
Есть предложение не оправдывать кривизну дизайна нереальными условиями.


 
Курдль ©   (2006-10-25 13:25) [25]


> Игорь Шевченко ©   (25.10.06 13:23) [22]
> И чем в этом случае может помочь хранение текстов запросов
> в ресурсах/коде ?

Возможностью изменения ресурсов без перекомпиляции.


 
Reindeer Moss Eater ©   (2006-10-25 13:26) [26]

не проще ли его вывести в хранимую процедуру и вызывать его из пакета?

А что мне помешает три раза в день менять имя ЭТОЙ хранимой процедуры и ее принадлежность к схеме?


 
Reindeer Moss Eater ©   (2006-10-25 13:26) [27]

Возможностью изменения ресурсов без перекомпиляции.

паблишед свойства по определению уже и так в ресурсах живут.


 
Игорь Шевченко ©   (2006-10-25 13:27) [28]

Курдль ©   (25.10.06 13:25) [25]


> Возможностью изменения ресурсов без перекомпиляции.


А зачем их менять ? Другая СУБД, я надеюсь, SQL тоже поддерживает ?

Если тебя не затруднит, приведи пожалйуста пример приложения, которое можно перенести на другую СУБД одним лишь изменением в ресурсах текстов запросов.


 
Reindeer Moss Eater ©   (2006-10-25 13:30) [29]

Возможностью изменения ресурсов без перекомпиляции.

Мда.
Возможность просто сказочная.
30 тысяч компиляций во время разработки и отладки.
И тут появляется волшебная возможность избежать 30001 компиляции.
Это сколько же времени и денег можно сэкономить.
Просто жуть.


 
Сатир   (2006-10-25 13:30) [30]


> А что, есть сервер Oracle для КПК ?

есть клиентское приложение для КПК, использующее доступ к данным из Оракла


 
Игорь Шевченко ©   (2006-10-25 13:32) [31]

Сатир   (25.10.06 13:30) [30]


> есть клиентское приложение для КПК, использующее доступ
> к данным из Оракла


Я не совсем понимаю, нельзя ли подробнее (с сохранением коммерческих секретов, разумеется) ? Каким боком на КПК запрос исполняется ?


 
Reindeer Moss Eater ©   (2006-10-25 13:32) [32]

Сатир

Дак делай. в чем проблема-то?
Круто-же получится.
Или есть сомнения?


 
ANB ©   (2006-10-25 13:52) [33]


> ибо они каждый раз будут компилироваться и разбираться

А кэш зачем тогда ?
Ведь при выполнении запроса из клиента и динамический SQL работают по одной схеме.
ИМХО :
1) Уточнять схему в запросе константой - хреново. Тут поможет либо макрос, либо установка текущей схемы. Желательно не лазить по разным схемам.
2) Если запросов не сильно много, то и правда - удобнее положить их в пакеты (в один как раз необязательно - можно разбить по темам). Преимуществом будет видение в этих запросах пакетных переменных и констант, обнаружение синтаксических ошибок еще при компиляции.
3) Если уж запросов действительно сильно дофига, то можно и таблицу с их текстами. В таком случае придется в этой же таблице описать и параметры.
Самы простой способ передавать в процедуру непределенное число параметров - завести их дефолтовыми с именами p_1, p_2 . . p_N (побольше). Потом уже в хранимке лезть в таблицы текстов запросов и формировать переменный с нужными именами, подставляя нужные значения. Довольно геморно получится, плюс будет легко сломать, напутав с параметрами или текстом запроса. Причем ошибка вылезет при выполнении. Кстати, пихать опять таки имя схемы в заготовки запросов - будет очень хреново.


 
ANB ©   (2006-10-25 13:54) [34]


> придется в этой же таблице

точнее завести еще одну/несколько


 
Reindeer Moss Eater ©   (2006-10-25 13:56) [35]

> придется в этой же таблице

точнее завести еще одну/несколько


Ага.
Лучше служебную схему.
А еще лучше служебный сервер.
А имя служебного сервера хранить на служебном сервере №2
Что бы уж точно все было четко.

А имя служебного сервера № 2 запретить менять под страхом смерти.


 
Polevi ©   (2006-10-25 13:57) [36]

неопределенное число параметров переавать одним хмл параметром


 
Sergey13 ©   (2006-10-25 13:58) [37]

> А имя служебного сервера № 2 запретить менять под страхом
> смерти.

За этим должен следить сервер № 3. 8-)


 
Danilka ©   (2006-10-25 14:05) [38]

[3] Игорь Шевченко ©   (25.10.06 12:40)
> Э...а где их еще хранить ? :)

Во вьюхах :))
Мое мнение, что для большинства случаев запросы, в которых происходят соединения таблиц, а не просто однотабличные выборки, следует обрамлять вьюхами, а на клиенте уже селект из этих въюх.


 
Reindeer Moss Eater ©   (2006-10-25 14:05) [39]

Во вьюхах :))
Мое мнение, что для большинства случаев запросы, в которых происходят соединения таблиц, а не просто однотабличные выборки, следует обрамлять вьюхами, а на клиенте уже селект из этих въюх.


А где хранить запросы к вьюхам?


 
Danilka ©   (2006-10-25 14:08) [40]


> А где хранить запросы к вьюхам?

я иногда храню, таки, в ресурсах :))
правда, не Дельфи, а c#.
просто не люблю многострочные строковые константы, загромождают код, неудобно.
А вот-так удобно:
string selectInvoiceSQL = res.GetString("selectInvoiceSQL");
OleDbCommand cmd = new OleDbCommand(selectInvoiceSQL, con);



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.041 c
4-1151461842
piople
2006-06-28 06:30
2006.11.12
Потоки и исключения


3-1157963510
Loginov Dmitry
2006-09-11 12:31
2006.11.12
Восстановление базы данных


2-1162063796
Уця Шпиндель
2006-10-28 23:29
2006.11.12
Помогите разобраться с калькулятором


15-1161887904
Kerk
2006-10-26 22:38
2006.11.12
У меня столько энергии вырабатывается, что я ее гашу в труде (с)


15-1161657276
Slider007
2006-10-24 06:34
2006.11.12
С днем рождения ! 24 октября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский