powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DW и процедура Oracle
25 сообщений из 65, страница 2 из 3
DW и процедура Oracle
    #34106246
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ чем разница между DW с процедурой с курсором и просто с запросом?
И там и там надо написать запрос, только в первом случае запрос формируется на серверной стороне, а во втором на клиентской.
Причем ничто не мешает и во втором случае хранить запрос в БД.
Кстати, а план исподнения Вы тоже в БД собираетесь хранить в таком случает? Что толку то от текста. К тому же на некоторых серверах есть определенные аспекты удобные для реализации через SP, например raw level security...
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34106348
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99На клиенте динамически формировать запрос ничуть не удобнее, чем на сервере, по мне так как раз наоборот, но тут,что называется, на вкус и цвет... :-) Кроме того, процедура позворяет написать статический код, который, хотя и выглядит ужасно, но зато обеспечивает требуемую производительность.
Я говорю об удобстве в ситуации когда опытный пользователь может сам писать произвольные запросы к базе либо непосредственно на SQL либо используя некий конструктор. У меня вообще есть сомнения, что это можно реализовать с помощью DW на SP.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34106352
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк Anatoly MoskovskyВ чем разница между DW с процедурой с курсором и просто с запросом?
И там и там надо написать запрос, только в первом случае запрос формируется на серверной стороне, а во втором на клиентской.
Причем ничто не мешает и во втором случае хранить запрос в БД.
Кстати, а план исподнения Вы тоже в БД собираетесь хранить в таком случает? Что толку то от текста. К тому же на некоторых серверах есть определенные аспекты удобные для реализации через SP, например raw level security...

Какая разница где хранится план? При выполнении одинаковых запросов в ХП и с клиента у них планы будут одинаковыми.

Насчет RLS - в Oracle еще с 8i есть поддержка этого.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34106374
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПри выполнении одинаковых запросов в ХП и с клиента у них планы будут одинаковыми.
Не знаю как там в Oracle, а в MS SQL план исполнения хранимой процедуры строится при ее созданиии и хранится в базе, в отличие от запроса, который, в принципе, тоже может иметь сохраненный план исполнения в кэше, но в любом случае, не далее очередного restart'а сервера. Сдается мне, что и Oracle должет (может???) себя вести таким же образом.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34106823
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк Anatoly MoskovskyПри выполнении одинаковых запросов в ХП и с клиента у них планы будут одинаковыми.
Не знаю как там в Oracle, а в MS SQL план исполнения хранимой процедуры строится при ее созданиии и хранится в базе, в отличие от запроса, который, в принципе, тоже может иметь сохраненный план исполнения в кэше, но в любом случае, не далее очередного restart'а сервера. Сдается мне, что и Oracle должет (может???) себя вести таким же образом.
План в общем случае зависит от данных, поэтому хранить его не всегда полезно.
В Oracle нужно явно указывать если требуется сохранить план запроса, и это не зависит от того в ХП выполняется запрос или где либо еще.
И это забота DBA принимать такое решение хранить или нет.

Вообще я говорил о том, что для операции RETRIEVE в DW использовать ХП в ORACLE (см. исходный вопрос и сабж) бессмысленно, поскольку все тоже самое можно проделать с клиента без более сложного кодирования и отладки серверной части. И даже более того - часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать.

Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.

Единственный аргумент для использования ХП в этой ситуации - это требования безопасности (например нужно запретить произвольные запросы к базе)
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34107241
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВообще я говорил о том, что для операции RETRIEVE в DW использовать ХП в ORACLE (см. исходный вопрос и сабж) бессмысленно, поскольку все тоже самое можно проделать с клиента без более сложного кодирования и отладки серверной части. И даже более того - часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать.
Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.
Абсолютно, категорически, на 100 % НЕ согласен .
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34107269
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп Anatoly MoskovskyВообще я говорил о том, что для операции RETRIEVE в DW использовать ХП в ORACLE (см. исходный вопрос и сабж) бессмысленно, поскольку все тоже самое можно проделать с клиента без более сложного кодирования и отладки серверной части. И даже более того - часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать.
Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.
Абсолютно, категорически, на 100 % НЕ согласен .
Было больно, но неубедительно :)
Где аргументация?

Опровергните эти утверждения из процитированного Вами (желательно примерами):
1) тоже самое можно проделать с клиента
2) часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать

И заодно и это:
3) Использование ХП снижает переносимость серверной части между разными СУБД. Как следствие - удорожание такой миграции.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34108036
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Anatoly Moskovsky :
Я, думаю, что Вам это будет небезынтересно
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34108519
AndrewN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky Филипп Anatoly MoskovskyВообще я говорил о том, что для операции RETRIEVE в DW использовать ХП в ORACLE (см. исходный вопрос и сабж) бессмысленно, поскольку все тоже самое можно проделать с клиента без более сложного кодирования и отладки серверной части. И даже более того - часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать.
Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.
Абсолютно, категорически, на 100 % НЕ согласен .
Было больно, но неубедительно :)
Где аргументация?

Опровергните эти утверждения из процитированного Вами (желательно примерами):
1) тоже самое можно проделать с клиента
2) часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать

И заодно и это:
3) Использование ХП снижает переносимость серверной части между разными СУБД. Как следствие - удорожание такой миграции.

Пункт 1 - Объектные типы Oracle. Вложенные таблицы и много другое. :)
Пункт 2 - Раскрою вам большой секрет - динамический SQL есть и на серверной стороне.
Пункт 3 - довольно сомнителен. Или вы всегда пишете запросы только с использованием ANSI SQL? НЕ ВЕРЮ! Ибо гораздо проще, приятней и понятней написать запрос на оракловом диалекте и работать такой запрос будет лучше, чем тоже самое изображать ANSI SQL-compilant. И даже это не гарантирует Вам одинакового поведения на разных СУБД. Так что ой.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34108681
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Геннадич2Anatoly Moskovsky :
Я, думаю, что Вам это будет небезынтересно

Прочитал. Не то.
Там спор идет о том, где должна обрабатываться ВСЯ бизнес-логика, на сервере или на клиенте.

Для меня же бизнес-логика делится на две части:
1) модификация данных
2) представление данных

п.1 должен подчиняться единым для всех пользователей системы правилам, поэтому эта часть должна выполняться на сервере (БД, сервер приложений), чтобы обеспечить целостность данных.

п.2 - это субъективное, здесь разработчик не может диктовать пользователю, в каких разрезах ему можно смотреть данные (вплоть до использования напрямую SQL). Поэтому п.2 должен выполняться на клиенте.

Выше я говорил только про п.2, поскольку DW.RETRIEVE безусловно является частью процесса представления данных.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34108793
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.

AndrewNОпровергните эти утверждения из процитированного Вами (желательно примерами):
1) тоже самое можно проделать с клиента
2) часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать

И заодно и это:
3) Использование ХП снижает переносимость серверной части между разными СУБД. Как следствие - удорожание такой миграции.

Пункт 1 - Объектные типы Oracle. Вложенные таблицы и много другое. :)
Пункт 2 - Раскрою вам большой секрет - динамический SQL есть и на серверной стороне.
Пункт 3 - довольно сомнителен. Или вы всегда пишете запросы только с использованием ANSI SQL? НЕ ВЕРЮ! Ибо гораздо проще, приятней и понятней написать запрос на оракловом диалекте и работать такой запрос будет лучше, чем тоже самое изображать ANSI SQL-compilant. И даже это не гарантирует Вам одинакового поведения на разных СУБД. Так что ой.

1. Ну что же, приведите пример ХП пригодной для использования с DW и которую нельзя переписать на PB (только что-то компактное, чтоб сразу была видна суть, а то у меня есть чем заняться помимо этого форума :).
Насчет объектов в таблицах. А их кто-то использует?

2. Вы не поверите, я знал и раньше. А теперь состыкуйте динамический SQL в ХП и Datawindow

3. У нас был проект написанный под Oracle. Когда потребовалось его мигрировать на PostgreSQL, то автоматический конвертор DW из Oracle SQL в PostgreSQL был написан за пару недель одним человеком. А вот пакеты так и не удалось автоматом конвертнуть. Так тот проект и дропнули, поскольку переписывать серверную часть было слишком дорого, дешевле клиентам на наши деньги Oracle покупать.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34109044
Oleg1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky
1. Ну что же, приведите пример ХП пригодной для использования с DW и которую нельзя переписать на PB (только что-то компактное, чтоб сразу была видна суть, а то у меня есть чем заняться помимо этого форума :).
Ну, строго говоря, подобные ситуации все же возможны. :) Например, хранимая собирает нужные данные в промежуточной таблице. Это полезно, когда объем обрабатываемых данных велик, а результат мал. Или если надо сначала полазить в закрытых для общего доступа таблицах.

ИМХО, массовое использование хранимых для select'а -- это фирменная фишка MSSQL. Мне иногда кажется, что он впринципе заточен восновном под такую работу. :)

Anatoly Moskovsky2. Вы не поверите, я знал и раньше. А теперь состыкуйте динамический SQL в ХП и Datawindow
Нет ничего не возможного. Просто "динамика" может быть разной: список колонок, условия запроса и т.п.

Anatoly Moskovsky3. У нас был проект написанный под Oracle. Когда потребовалось его мигрировать на PostgreSQL, то автоматический конвертор DW из Oracle SQL в PostgreSQL был написан за пару недель одним человеком. А вот пакеты так и не удалось автоматом конвертнуть. Так тот проект и дропнули, поскольку переписывать серверную часть было слишком дорого, дешевле клиентам на наши деньги Oracle покупать.
С переносимостью действительно не все так просто, т.к. языки хранимых почти у всех серверов только с виду походие, а реально ощутимо разные.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34109153
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg1 Anatoly Moskovsky
1. Ну что же, приведите пример ХП пригодной для использования с DW и которую нельзя переписать на PB (только что-то компактное, чтоб сразу была видна суть, а то у меня есть чем заняться помимо этого форума :).
Ну, строго говоря, подобные ситуации все же возможны. :) Например, хранимая собирает нужные данные в промежуточной таблице. Это полезно, когда объем обрабатываемых данных велик, а результат мал.

Ничто не мешает выполнить запрос, заполняющий временную таблицу, из PB.
Или если надо сначала полазить в закрытых для общего доступа таблицах.Для сокрытия данных в Oracle вполне достаточно view и RLS.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34109429
AndrewN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха-ха-ха. Мистер очень занят, чтоб немного подумать самостоятельно.

Так пишите же как вам нравится!

Btw в драйверах O84, O92 исправили ошибку с парсением SQL? Или все по-прежнему спотыкается на ровных местах?! )
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34109526
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewNХа-ха-ха. Мистер очень занят, чтоб немного подумать самостоятельно.

Так пишите же как вам нравится!

Убедительно.

Btw в драйверах O84, O92 исправили ошибку с парсением SQL? Или все по-прежнему спотыкается на ровных местах?! )
Не знаю. Я использую O73. Он работает со всеми ораклами.
И в нем нет никаких проблем с SQL.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34109691
AndrewN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь и ПБ у вас 5-ой версии. Good luck!
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34110091
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AndrewN

Каждый пишет как может, конкретный вариант решения зависит от постановки задачи
Я использовал оба варианта (хотя, каюсь, к Pb ХП не привешивал), также разрабатывал и хранимые процедуры, так что аргументов в пользу какого-либо из вариантов знаю достаточно. Незачем оскорблять друг друга. У каждого свой подход к разработке, свои задачи - поэтому выбор есть у каждого (опять же СУБД у всех разная). Просто, выбор оптимального варианта - есть наша цель.
Хотя, честно признаюсь, если есть DW, чаще всего, незачем использовать хранимые процедуры.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34110446
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky Филипп Anatoly MoskovskyВообще я говорил о том, что для операции RETRIEVE в DW использовать ХП в ORACLE (см. исходный вопрос и сабж) бессмысленно, поскольку все тоже самое можно проделать с клиента без более сложного кодирования и отладки серверной части. И даже более того - часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать.
Еще раз напоминаю, что речь идеть только об ORACLE и только об операции RETRIEVE.
Абсолютно, категорически, на 100 % НЕ согласен .
Было больно, но неубедительно :)
Где аргументация?

Опровергните эти утверждения из процитированного Вами (желательно примерами):
1) тоже самое можно проделать с клиента
2) часть функциональности (полностью динамические запросы) вообще на ХП нельзя сделать

И заодно и это:
3) Использование ХП снижает переносимость серверной части между разными СУБД. Как следствие - удорожание такой миграции.

1) Нельзя. Вот живой пример. В нашем продукте, ориентированном на Medical Malpractice Insurance несколько модулей. 2 основных - Claims и Policy.
Claims - 50%/50% с точки зрения функциональности между PB и PL/SQl (Oracle), Policy - 25%/75% с точки зрения функциональности между PB и PL/SQl. Claims включает в себя мини полиси. Клиент, когда создает Claims, может использовать покрытия застрахованного человека как из большой Полиси, так и из мини. Чтоб найти и показать покрытия (coverage), имеется такая процедура
Код: plaintext
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.
CREATE OR REPLACE PROCEDURE cm_find_claim_coverage (
  i_insured_fk        number,
  i_loss_date         varchar2,
  i_report_date       varchar2,
  i_inc_start_date    varchar2,
  i_inc_end_date      varchar2,
  i_loss_state        varchar2,
  i_loss_county       varchar2,
  i_lob               varchar2,
  i_coverage_type     varchar2,
  o_ref_curs     IN OUT Oasis_Utility.t_ref_cursor) IS

  v_sql               varchar2( 32767 )  := '';
BEGIN
v_sql := cm_find_claim_coverage_sql(
 i_insured_fk,
 i_loss_date,
 i_report_date,
 i_inc_start_date,
 i_inc_end_date,
 i_loss_state,
 i_loss_county,
 i_lob,
 i_coverage_type);
  -- Output it all
  OPEN o_ref_curs FOR v_sql;
END cm_find_claim_coverage; 
То, что она возвращает, показывается в динамически созданном DW. Вот как выглядит cm_find_claim_coverage_sql :-)
Код: plaintext
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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
CREATE OR REPLACE FUNCTION cm_find_claim_coverage_sql (
  i_insured_fk        number,
  i_loss_date         varchar2,
  i_report_date       varchar2,
  i_inc_start_date    varchar2,
  i_inc_end_date      varchar2,
  i_loss_state        varchar2,
  i_loss_county       varchar2,
  i_lob               varchar2,
  i_coverage_type     varchar2)
  return varchar2 IS

  search_days         number;
  verify_func         varchar2( 200 );
  cm_verify_func      varchar2( 200 );
  eff_from_dt         varchar2( 100 );
  eff_to_dt           varchar2( 100 );
  addl_sql            varchar2( 10000 );
  pm_installed_b      varchar2( 10 );
  pm_used_b           varchar2( 10 );
  user_profile        varchar2( 10 );
  sysparm_value       varchar2( 10 );
  pol_sysparm_value   varchar2( 10 );
  incl_invalid_b      varchar2( 1 );
  incl_invalid_pol_b  varchar2( 1 );
  v_pm_covg_type      system_parameter_util.sysparm_value%TYPE;

  v_sql               varchar2( 32767 )  := '';
BEGIN
  dbms_output.enable( 500000 );
  -- we will use (slightly) different SQL depending on whether the OASIS PM system is in use or not.  so
  -- determine if it is in use or note
  oasis_installation.get_installed_used_b('PM', pm_installed_b, pm_used_b);

  -- See if we ignore all dates in the retrieval
  -- Are we using the dates when verifying cov from mini policy
  sysparm_value := Upper(nvl(cs_get_system_parameter('CM_INC_CVI_INVLD_CVG'), 'N')) ;
  -- Are we using the dates when verifying cov from policy system
  pol_sysparm_value := Upper(nvl(cs_get_system_parameter('CM_INC_POL_INVLD_CVG'), 'N')) ;
  -- If one of these system paramenters is set to PROFILE then the user has to have that
  -- profile to be able to see all of the  coverages reguardless of the dates
  -- so see if the user has that profile
  user_profile := oasis_security.user_has_profile('CREATE INVALID COVERAGE CLAIM');

  IF sysparm_value = 'PROFILE' THEN
     IF user_profile = 'N' THEN
        incl_invalid_b := 'N';
     ELSE
        incl_invalid_b := 'Y';
     END IF;
  ELSIF sysparm_value in ('Y','YES','T','TRUE') THEN
     incl_invalid_b := 'Y';
  ELSE
     incl_invalid_b := 'N';
  END IF;

  IF pol_sysparm_value = 'PROFILE' THEN
     IF user_profile = 'N' THEN
        incl_invalid_pol_b := 'N';
     ELSE
        incl_invalid_pol_b := 'Y';
     END IF;
  ELSIF pol_sysparm_value in ('Y','YES','T','TRUE') THEN
     incl_invalid_pol_b := 'Y';
  ELSE
     incl_invalid_pol_b := 'N';
  END IF;

  -- We will call the verification function several times so piece together its call
  verify_func := ' pm_coverage_verification(coverage_pk, entity_insured_fk, role_type_code, ' ||
                   '''' || i_loss_date      || ''', ' ||
                   '''' || i_inc_start_date || ''', ' ||
                   '''' || i_inc_end_date   || ''', ' ||
                   '''' || i_report_date    || ''', ' ||
                   '''' || i_loss_state     || ''', ' ||
                   'term_base_record_fk' || ')';
  cm_verify_func := ' cm_coverage_verification(cm_coverage_pk, entity_insured_fk,  ' ||
                   '''' || i_loss_date      || ''', ' ||
                   '''' || i_inc_start_date || ''', ' ||
                   '''' || i_inc_end_date   || ''', ' ||
                   '''' || i_report_date    || ''', ' ||
                   '''' || i_loss_state     || '''' || ')';

  v_sql :=          'SELECT /*+ rule */  policy_fk, policy_no, coverage_pk, product_coverage_code, policy_form_code, ';
  v_sql := v_sql ||       ' risk_base_record_fk, coverage_base_record_fk, limit_descr coverage_limit_code, role_type_code, ';
  v_sql := v_sql ||       ' pth_effective_from_date effective_from_date, pth_effective_to_date effective_to_date, accounting_from_date, ';
  v_sql := v_sql ||       ' accounting_to_date, covg_descr coverage_desc, prod_descr product_coverage_desc, policy_term_history_pk, risk_pk risk_fk, ';
  v_sql := v_sql ||       ' form_descr, retroactive_date retro_date, policy_source, risk_descr, ';
  v_sql := v_sql ||       ' substr(' || verify_func || ',';
  v_sql := v_sql ||              ' 1, instr(' || verify_func || ',''^'') - 1) coverage_valid, ';
  v_sql := v_sql ||       ' substr(' || verify_func || ',';
  v_sql := v_sql ||              ' instr(' || verify_func || ',''^'') + 1) invalid_reason, ';
  v_sql := v_sql ||       ' '''' composite_view, specialty_code, county_code_used_to_rate, county_state_used_to_rate, state_code_used_to_rate, ';
  v_sql := v_sql ||       ' policyholder_name, manuscript_endorsement_b,policy_cycle_code, policy_type_code policy_type, covg_type, product_cov_verify_pk, ''N'' selected_b, ''N'' flag_b, to_number('''') exp_res, to_number('''') ind_res, to_number('''') temp_covg_xref_pk, ';
  v_sql := v_sql ||       ' addl_info1, addl_info2, addl_info3, addl_info4, addl_info5, addl_info6, addl_info7, addl_info8, ';
  v_sql := v_sql ||       ' addl_info9, addl_info10, addl_info11, addl_info12, addl_info13, addl_info14, addl_info15, addl_info16, ';
  v_sql := v_sql ||       ' addl_info17, addl_info18, addl_info19, addl_info20, addl_info21, addl_info22, addl_info23, addl_info24, addl_info25 ';
  v_sql := v_sql ||  ' FROM cm_pm_interface ';
  v_sql := v_sql || ' WHERE entity_insured_fk = ' || to_char(i_insured_fk);

  -- Call our coverage verification function
  --IF Upper(nvl(cs_get_system_parameter('CM_INC_INVALID_CVG'), 'N')) not in ('Y', 'YES', 'T', 'TRUE') THEN
  --  v_sql := v_sql ||    ' AND substr(' || verify_func || ',';
  --  v_sql := v_sql ||                 ' 1, instr(' || verify_func || ',''^'') - 1) = ''TRUE'' ';
  --END IF;

  -- Do we include quotes or not ( not by default )
  IF Upper(nvl(cs_get_system_parameter('CM_INCLUDE_QUOTES'), 'N')) in ('N','NO','F','FALSE') THEN
     v_sql := v_sql ||    ' AND policy_cycle_code = ''POLICY'' ';
  END IF;

  -- this code takes care of any restrictions on coverage based upon the claim's loss type
  v_sql := v_sql ||   ' AND ( EXISTS ';
  v_sql := v_sql ||        ' (SELECT 0 ';
  v_sql := v_sql ||           ' FROM cm_lob_filter ';
  v_sql := v_sql ||          ' WHERE filter_table_name = ''PM_POL_LOB_CODE'' ';
  v_sql := v_sql ||            ' AND cm_pm_interface.pol_lob = filter_code ';
  v_sql := v_sql ||            ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||        ' OR NOT EXISTS ';
  v_sql := v_sql ||           ' (SELECT 0 ';
  v_sql := v_sql ||              ' FROM cm_lob_filter ';
  v_sql := v_sql ||             ' WHERE filter_table_name = ''PM_POL_LOB_CODE'' ';
  v_sql := v_sql ||               ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||       ' )';
  v_sql := v_sql ||   ' AND ( EXISTS ';
  v_sql := v_sql ||        ' (SELECT 0 ';
  v_sql := v_sql ||           ' FROM cm_lob_filter ';
  v_sql := v_sql ||          ' WHERE filter_table_name = ''COVERAGE_CODE'' ';
  v_sql := v_sql ||            ' AND (   cm_pm_interface.cvg_lob = filter_code ';
  v_sql := v_sql ||                 ' OR cm_pm_interface.cvg_lob IN ';
  v_sql := v_sql ||                    ' (SELECT code ';
  v_sql := v_sql ||                       ' FROM product_cov_verify ';
  v_sql := v_sql ||                      ' WHERE coverage_code = filter_code)) ';
  v_sql := v_sql ||            ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||        ' OR NOT EXISTS ';
  v_sql := v_sql ||           ' (SELECT 0 ';
  v_sql := v_sql ||              ' FROM cm_lob_filter ';
  v_sql := v_sql ||             ' WHERE filter_table_name = ''COVERAGE_CODE'' ';
  v_sql := v_sql ||               ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||       ' )';

  IF Upper(cs_get_system_parameter('CM_CGVR_INC_SBLCVG')) in ('Y','YES','T','TRUE') THEN
    IF length(i_coverage_type) > 0 THEN
      v_sql := v_sql ||   ' AND INSTR(NVL(cm_pm_interface.sub_lob_code_list,'',' || i_coverage_type || ',''),'',' || i_coverage_type || ','')>0';
    END IF;
  END IF;



  IF Upper(nvl(cs_get_system_parameter('CM_CVGVER_ALL_RANGE'),'N')) in ('Y', 'YES', 'T', 'TRUE') THEN
      v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), covg_effective_from_date) <= ';
      v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), covg_effective_to_date - 1/86400) ';
      v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), role_effective_from_date) <= ';
      v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), role_effective_to_date- 1/86400) ';
      v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), risk_effective_from_date) <= ';
      v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), risk_effective_to_date- 1/86400) ';
      v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), pth_effective_from_date) <= ';
      v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), pth_effective_to_date- 1/86400) ';
  END IF;

  -- Determine type of coverages to display - parent coverage only, coverage class
  -- or everything
  v_pm_covg_type := NVL(Cs_Get_System_Parameter('CM_CVGVER_COVG_TYPE'),'ALL');
  IF v_pm_covg_type = 'COVG' THEN
      v_sql := v_sql ||   ' AND covg_type IN (''COVG'',''COVGWCLASS'') ';
  ELSIF v_pm_covg_type = 'CLASS' THEN
      v_sql := v_sql ||   ' AND covg_type IN (''COVG'',''COVGCLASS'') ';
  END IF;

  IF incl_invalid_pol_b = 'N' THEN
     v_sql := v_sql ||    ' AND substr(' || verify_func || ',';
     v_sql := v_sql ||                 ' 1, instr(' || verify_func || ',''^'') - 1) = ''TRUE'' ';
     IF  Upper(nvl(cs_get_system_parameter('CM_CVGVER_INC_RANGE'),'N')) in ('N','NO','F','FALSE') THEN
        -- Only use the loss date to find coverages
          v_sql := v_sql ||    ' AND ((policy_form_code = ''OCCURRENCE'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN greatest(covg_effective_from_date, role_effective_from_date, risk_effective_from_date, pth_effective_from_date) ';
          v_sql := v_sql ||                   ' AND least(covg_effective_to_date, role_effective_to_date, risk_effective_to_date, pth_effective_to_date) - 1/86400) ';
          v_sql := v_sql ||     ' OR (policy_form_code = ''CM'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN greatest(covg_effective_from_date, role_effective_from_date, risk_effective_from_date, pth_effective_from_date) ';
          v_sql := v_sql ||                   ' AND least(covg_effective_to_date, role_effective_to_date, risk_effective_to_date, pth_effective_to_date) - 1/86400 ';
          v_sql := v_sql ||         ' AND retroactive_date <= to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')) ';
          v_sql := v_sql ||     ' OR (coverage_segment_code = ''TAIL'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN covg_effective_from_date AND covg_effective_to_date - 1/86400 ';
          v_sql := v_sql ||                   ' AND retroactive_date <= to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')))';
     ELSE
           -- use incident range to find coverages
          v_sql := v_sql ||    ' AND ((policy_form_code = ''OCCURRENCE'' ';
          v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), covg_effective_from_date) <= ';
          v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), covg_effective_to_date - 1/86400) ';
          v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), role_effective_from_date) <= ';
          v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), role_effective_to_date- 1/86400) ';
          v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), risk_effective_from_date) <= ';
          v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), risk_effective_to_date- 1/86400) ';
          v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), pth_effective_from_date) <= ';
          v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), pth_effective_to_date- 1/86400) )';
          v_sql := v_sql ||     ' OR (policy_form_code = ''CM'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN covg_effective_from_date AND covg_effective_to_date - 1/86400 ';
          v_sql := v_sql ||         ' AND retroactive_date <= to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN role_effective_from_date AND role_effective_to_date - 1/86400 ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN risk_effective_from_date AND risk_effective_to_date - 1/86400 ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN pth_effective_from_date AND pth_effective_to_date - 1/86400 )';
          v_sql := v_sql ||     ' OR (coverage_segment_code = ''TAIL'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN covg_effective_from_date AND covg_effective_to_date - 1/86400 ';
          v_sql := v_sql ||         ' AND retroactive_date <= to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy'') ))';
     END IF;

     -- extra condition for TAIL coverage
     IF pm_used_b = 'Y' THEN
          v_sql := v_sql ||    ' AND (nvl(coverage_segment_code, ''x'') <> ''TAIL'' ';
          v_sql := v_sql ||         ' OR (to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') >= retroactive_date ';
          v_sql := v_sql ||             ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') < pm_report.get_covg_exp_date(coverage_pk))) ';
     ELSE
          v_sql := v_sql ||    ' AND (nvl(coverage_segment_code, ''x'') <> ''TAIL'' ';
          v_sql := v_sql ||         ' OR (to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') >= retroactive_date ';
          v_sql := v_sql ||             ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') < pth_effective_to_date)) ';
     END IF;

     -- extra condition for report date and its relation to policy term history effective from and to dates
     IF Upper(cs_get_system_parameter('CM_RPT_PTH_DATES')) in ('Y','YES','T','TRUE') THEN
          v_sql := v_sql ||    ' AND (to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||           ' BETWEEN pth_effective_from_date AND pth_effective_to_date ';
          v_sql := v_sql ||         ' OR (NOT EXISTS ';
          v_sql := v_sql ||             ' (SELECT 0 ';
          v_sql := v_sql ||                ' FROM cm_pm_interface cpi2 ';
          v_sql := v_sql ||               ' WHERE cpi2.entity_insured_fk = ' || to_char(i_insured_fk);
          v_sql := v_sql ||                 ' AND cpi2.policy_pk = cm_pm_interface.policy_pk ';
          v_sql := v_sql ||                 ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||                       ' BETWEEN cpi2.pth_effective_from_date AND cpi2.pth_effective_to_date) ';
          v_sql := v_sql ||             ' AND NOT EXISTS ';
          v_sql := v_sql ||                 ' (SELECT 0 ';
          v_sql := v_sql ||                    ' FROM cm_pm_interface cpi2 ';
          v_sql := v_sql ||                   ' WHERE cpi2.entity_insured_fk = ' || to_char(i_insured_fk);
          v_sql := v_sql ||                     ' AND cpi2.policy_pk = cm_pm_interface.policy_pk ';
          v_sql := v_sql ||                     ' AND ABS(to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||                             ' - cpi2.pth_effective_from_date + (cpi2.pth_effective_from_date - cpi2.pth_effective_to_date)/2) < ';
          v_sql := v_sql ||                     ' ABS(to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||                             ' - cm_pm_interface.pth_effective_from_date + ';
          v_sql := v_sql ||                             ' (cm_pm_interface.pth_effective_from_date - cm_pm_interface.pth_effective_to_date)/2)))) ';
     END IF;
  END IF;

  -- special logic to deal with unique slot/occupant relationships
  IF Upper(cs_get_system_parameter('CM_CVGVER_SLOT_OCCUP')) IN ('Y','YES','T','TRUE') THEN
    v_sql := v_sql || ' AND ( (occupant_coverage_pk IS NULL) ';
    v_sql := v_sql || '  OR   (occupant_coverage_pk IS NOT NULL ';
    v_sql := v_sql || '        AND EXISTS (SELECT 1 FROM Coverage c_occup1 ';
    v_sql := v_sql || '                     WHERE c_occup1.coverage_pk = occupant_coverage_pk ';
    v_sql := v_sql || '                       AND ( (to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') ';
    v_sql := v_sql || '                           BETWEEN c_occup1.effective_from_date AND c_occup1.effective_to_date - 1/86400) ';
    v_sql := v_sql || '                        OR   (to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') < c_occup1.effective_from_date ';
    v_sql := v_sql || '                              AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') >= retroactive_date) ) ';
    v_sql := v_sql || '                       AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') >= retroactive_date) ) ) ';
  END IF;

  -- append any additional SQL for coverages from cm_pm_interface
  addl_sql := cs_get_system_parameter('CM_ADDLSQL4PMCVGVER1') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4PMCVGVER2') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4PMCVGVER3') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4PMCVGVER4') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4PMCVGVER5');

  v_sql := v_sql || addl_sql;

  v_sql := v_sql || ' UNION ALL ';
  v_sql := v_sql || 'SELECT /*+ rule */  p.cm_policy_pk,p.POLICY_NO,c.cm_coverage_pk,'' '',c.POLICY_FORM,0,0,';
  v_sql := v_sql ||       ' ltrim(to_char(c.inc_limit,''$999,999,990'')) || ''/'' || ltrim(to_char(c.agg_limit,''$999,999,990'')) , '' '',';

  -- we may show policy dates or coverages dates.
  IF cs_char2bool(cs_get_system_parameter('CM_CVGLST_USE_CVGDTS')) = 'Y' THEN
    v_sql := v_sql ||       ' c.effective_from_date,c.effective_to_date,sysdate,sysdate,';
  ELSE
    v_sql := v_sql ||       ' p.policy_start_date,p.policy_end_date,sysdate,sysdate,';
  END IF;

  -- there are a couple different things we can show for coverage description
  IF cs_char2bool(cs_get_system_parameter('CM_CVGLST_USE_CVGDSC')) = 'Y' THEN
    v_sql := v_sql ||       ' c.coverage_description,';
  ELSE
    v_sql := v_sql ||       ' cvg.long_description,';
  END IF;

  v_sql := v_sql ||       ' lob.long_description,0,r.cm_risk_pk,lc.short_description,c.retro_date,''CLAIM_POLICY'', ';
  v_sql := v_sql ||       ' nvl(r.risk_description,cs_get_client_name(r.entity_fk)) risk_descr,  ' ;
  v_sql := v_sql ||       ' substr(' || cm_verify_func || ',';
  v_sql := v_sql ||              ' 1, instr(' || cm_verify_func || ',''^'') - 1) coverage_valid, ';
  v_sql := v_sql ||       ' substr(' || cm_verify_func || ',';
  v_sql := v_sql ||              ' instr(' || cm_verify_func || ',''^'') + 1) invalid_reason, ';
  IF Upper(nvl(cs_get_system_parameter('CM_USE_COMPST_VIEW'),'N')) in ('Y','YES','T','TRUE') THEN
     v_sql := v_sql ||       ' cm_coverage_composite_view( ' || to_char(i_insured_fk) || ', ' || '''' || i_loss_date || '''' || ', ' || '''STR'') , ';
  ELSE
      v_sql := v_sql ||              ' '''', ';
  END IF;
  v_sql := v_sql ||       ' r.risk_spec_code, '''', '''', '''', cs_get_client_name(p.entity_insured_fk), '''', '''', p.policy_type policy_type, cvg.long_description, to_number(''''), ''N'' selected_b, ''N'' flag_b, to_number('''') exp_res, to_number('''') ind_res, to_number('''') temp_covg_xref_pk, ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL1''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL1''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL2''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL2''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL3''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL3''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL4''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL4''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL5''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL5''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL6''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL6''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL7''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL7''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL8''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL8''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL9''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL9''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL10''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL10''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL11''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL11''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL12''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL12''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL13''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL13''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL14''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL14''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL15''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL15''))), ';
  v_sql := v_sql ||		  ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL16''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL16''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL17''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL17''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL18''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL18''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL19''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL19''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL20''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL20''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL21''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL21''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL22''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL22''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL23''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL23''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL24''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL24''))), ';
  v_sql := v_sql ||       ' decode(cs_get_system_parameter(''CM_CLMCVG_ADDL25''), '''' , '''', cm_addl_info.coverage_info(c.cm_coverage_pk, cs_get_system_parameter(''CM_CLMCVG_ADDL25''))) ';

  v_sql := v_sql ||  ' FROM cm_policy p, cm_risk r, cm_coverage c, lookup_code lc, cm_pol_lob_code lob, cm_pol_coverage_type cvg ';
  v_sql := v_sql || ' WHERE c.cm_lob_code = lob.cm_pol_lob_code(+) AND p.cm_policy_pk = r.cm_policy_fk ';
  v_sql := v_sql ||   ' AND r.cm_risk_pk = c.cm_risk_fk AND c.cm_coverage_type_code = cvg.cm_pol_coverage_type_code(+) ';
  v_sql := v_sql ||   ' AND (instr('','' || p.state_code || '','', '',' || i_loss_state || ','') > 0 ';
  v_sql := v_sql ||        ' OR nvl(cvg.state_verification_b, nvl(lob.state_verification_b, ''N'')) = ''N'') ';

   -- when we compare dates there are two system parameters that we have to be concerned with
  --    1) CM_CVGVER_INC_RANGE indicates if we should use the incident range rather than the loss date
  --    2) CM_CVGVER_RSKCVG_DT indicates if the effective dates on risk and coverage should be used
  -- populate a couple variables depending on sysparm so we don't have to keep repeating the same phrase.
  IF Upper(cs_get_system_parameter('CM_CVGVER_RSKCVG_DT')) in ('N','NO','F','FALSE') THEN
     eff_from_dt := ' p.policy_start_date ';
     eff_to_dt := ' p.policy_end_date ';
  ELSE
     eff_from_dt := ' nvl(c.effective_from_date, nvl(r.effective_from_date, p.policy_start_date)) ';
     eff_to_dt := ' nvl(c.effective_to_date, nvl(r.effective_to_date, p.policy_end_date)) ';
  END IF;

   IF cs_char2bool(cs_get_system_parameter('CM_CVGVER_RISK_ONLY')) = 'Y' THEN
   -- we only look in the CM_RISK to find our policies for the insured pass into here.
     v_sql := v_sql ||   ' AND r.cm_risk_pk IN ';
     v_sql := v_sql ||       ' (SELECT cm_risk_pk FROM cm_risk ';
     v_sql := v_sql ||         ' WHERE entity_fk =' || to_char(i_insured_fk);
  ELSE
  -- we have to look both in the CM_RISK and CM_POLICY tables to find our policies for the insured pass into here.
     v_sql := v_sql ||   ' AND r.cm_risk_pk IN ';
     v_sql := v_sql ||       ' (SELECT cm_risk_pk FROM cm_risk ';
     v_sql := v_sql ||         ' WHERE entity_fk =' || to_char(i_insured_fk);
     v_sql := v_sql ||         ' UNION ALL ';
     v_sql := v_sql ||        ' SELECT cm_risk_pk FROM cm_risk, cm_policy ';
     v_sql := v_sql ||         ' WHERE cm_policy_fk = cm_policy_pk ';
     v_sql := v_sql ||           ' AND entity_insured_fk = ' || to_char(i_insured_fk);
  END IF;

  -- add an additional select if we have to find historical policy holders.  This is pretty client specific stuff.
  -- use ENTITY_ROLE to select historical policyholder information - HPOLHOLDER
  IF cs_get_system_parameter('CM_HPOLHLDR_POL_POS') is not null THEN
     v_sql := v_sql ||         ' UNION ALL ';
     v_sql := v_sql ||        ' SELECT cm_risk_pk FROM cm_risk, cm_policy, entity_role er ';
     v_sql := v_sql ||         ' WHERE er.role_type_code = ''HPOLHOLDER'' ';
     v_sql := v_sql ||           ' AND er.accounting_to_date = to_date(''01/01/3000'',''mm/dd/yyyy'') ';
     v_sql := v_sql ||           ' AND substr(policy_no, 1, length(policy_no) - to_number(nvl(cs_get_system_parameter(''CM_HPOLHLDR_POL_POS''), ''0''))) = er.external_id ';
     v_sql := v_sql ||           ' AND cm_policy_fk = cm_policy_pk ';
     v_sql := v_sql ||           ' AND er.entity_fk =' || to_char(i_insured_fk);
  END IF;

  -- add an additional select if we have to find entity haveng relation of type ADDNMINS to the insured.  This is pretty client specific stuff.
  IF cs_char2bool(cs_get_system_parameter('CM_CVGVER_CIS_ADDRSK')) = 'Y' THEN
     v_sql := v_sql ||         ' UNION ALL ';
     v_sql := v_sql ||        ' SELECT r.cm_risk_pk FROM entity_relation er, cm_risk r ';
     v_sql := v_sql ||         ' WHERE er.entity_parent_fk = r.entity_fk ';
     v_sql := v_sql ||           ' AND er.relation_type_code = ''ADDNMINS'' ';
     v_sql := v_sql ||           ' AND (er.accounting_to_date is null or er.accounting_to_date = to_date(''01/01/3000'',''mm/dd/yyyy'')) ';
     IF  Upper(nvl(cs_get_system_parameter('CM_CVGVER_INC_RANGE'),'N')) in ('N','NO','F','FALSE') THEN
         v_sql := v_sql ||           ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')';
         v_sql := v_sql ||           '     BETWEEN TRUNC(er.effective_from_date) and TRUNC(er.effective_to_date)';
     ELSE
         v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), TRUNC(er.effective_from_date) ) <= ';
         v_sql := v_sql ||            ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), TRUNC(er.effective_to_date) - 1/86400) ';
     END IF;
     v_sql := v_sql ||         ' AND greatest( '||eff_from_dt ||', TRUNC(er.effective_from_date) ) <= ';
     v_sql := v_sql ||            ' least('||eff_to_dt ||', TRUNC(er.effective_to_date) - 1/86400) ';
     v_sql := v_sql ||           ' AND er.entity_child_fk =' || to_char(i_insured_fk);
  END IF;

  -- close out the sub-query with a right paren.
  v_sql := v_sql ||        ' ) ';

  -- if we are doing entity via entity_relation of ADDNMINS we did a correlated sub-query above, but that is really
  -- slow.  So here we do pretty much the same query, but uncorredlated which Oracle will do first to whittle down
  -- the number of rows that go through the painful coorelated sub-query above.  This is basically a cut and paste of
  -- the code above.
  IF cs_char2bool(cs_get_system_parameter('CM_CVGVER_CIS_ADDRSK')) = 'Y' THEN
      IF cs_char2bool(cs_get_system_parameter('CM_CVGVER_RISK_ONLY')) = 'Y' THEN
      -- we only look in the CM_RISK to find our policies for the insured pass into here.
        v_sql := v_sql ||   ' AND r.cm_risk_pk IN ';
        v_sql := v_sql ||       ' (SELECT cm_risk_pk FROM cm_risk ';
        v_sql := v_sql ||         ' WHERE entity_fk =' || to_char(i_insured_fk);
     ELSE
     -- we have to look both in the CM_RISK and CM_POLICY tables to find our policies for the insured pass into here.
        v_sql := v_sql ||   ' AND r.cm_risk_pk IN ';
        v_sql := v_sql ||       ' (SELECT cm_risk_pk FROM cm_risk ';
        v_sql := v_sql ||         ' WHERE entity_fk =' || to_char(i_insured_fk);
        v_sql := v_sql ||         ' UNION ALL ';
        v_sql := v_sql ||        ' SELECT cm_risk_pk FROM cm_risk, cm_policy ';
        v_sql := v_sql ||         ' WHERE cm_policy_fk = cm_policy_pk ';
        v_sql := v_sql ||           ' AND entity_insured_fk = ' || to_char(i_insured_fk);
     END IF;

     -- add an additional select if we have to find historical policy holders.  This is pretty client specific stuff.
     -- use ENTITY_ROLE to select historical policyholder information - HPOLHOLDER
     IF cs_get_system_parameter('CM_HPOLHLDR_POL_POS') is not null THEN
        v_sql := v_sql ||         ' UNION ALL ';
        v_sql := v_sql ||        ' SELECT cm_risk_pk FROM cm_risk, cm_policy, entity_role er ';
        v_sql := v_sql ||         ' WHERE er.role_type_code = ''HPOLHOLDER'' ';
        v_sql := v_sql ||           ' AND er.accounting_to_date = to_date(''01/01/3000'',''mm/dd/yyyy'') ';
        v_sql := v_sql ||           ' AND substr(policy_no, 1, length(policy_no) - to_number(nvl(cs_get_system_parameter(''CM_HPOLHLDR_POL_POS''), ''0''))) = er.external_id ';
        v_sql := v_sql ||           ' AND cm_policy_fk = cm_policy_pk ';
        v_sql := v_sql ||           ' AND er.entity_fk =' || to_char(i_insured_fk);
     END IF;

     -- add an additional select if we have to find entity haveng relation of type ADDNMINS to the insured.  This is pretty client specific stuff.
     IF cs_char2bool(cs_get_system_parameter('CM_CVGVER_CIS_ADDRSK')) = 'Y' THEN
        v_sql := v_sql ||         ' UNION ALL ';
        v_sql := v_sql ||        ' SELECT r.cm_risk_pk FROM entity_relation er, cm_risk r ';
        v_sql := v_sql ||         ' WHERE er.entity_parent_fk = r.entity_fk ';
        v_sql := v_sql ||           ' AND er.relation_type_code = ''ADDNMINS'' ';
        v_sql := v_sql ||           ' AND (er.accounting_to_date is null or er.accounting_to_date = to_date(''01/01/3000'',''mm/dd/yyyy'')) ';
        IF  Upper(nvl(cs_get_system_parameter('CM_CVGVER_INC_RANGE'),'N')) in ('N','NO','F','FALSE') THEN
            v_sql := v_sql ||           ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')';
            v_sql := v_sql ||           '     BETWEEN TRUNC(er.effective_from_date) and TRUNC(er.effective_to_date)';
        ELSE
            v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), TRUNC(er.effective_from_date) ) <= ';
            v_sql := v_sql ||            ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), TRUNC(er.effective_to_date) - 1/86400) ';
        END IF;
        v_sql := v_sql ||           ' AND er.entity_child_fk =' || to_char(i_insured_fk);
     END IF;

     -- close out the sub-query with a right paren.
     v_sql := v_sql ||        ' ) ';

  END IF;

  v_sql := v_sql ||   ' AND c.policy_form = lc.code(+) ';
  v_sql := v_sql ||   ' AND lc.lookup_type_code(+) = ''POLICY_FORM_CODE''';

  -- Compare LOB if system is set up to do so
  -- this probably makes no more sense since we have split the claim LOB (renamed loss type)
  -- and the policy LOB, but keep it around for awhile  CJM 8/31/98
  IF Upper(cs_get_system_parameter('CM_CVGVER_INC_LOB')) in ('Y','YES','T','TRUE') THEN
    IF length(i_lob) >  0  THEN
      v_sql := v_sql ||   ' AND c.cm_lob_code = ''' || i_lob || ''' ';
    END IF;
  END IF;

  -- Compare coverage if system is set up to do so
  -- this probably makes no more sense since we have split the claim LOB (renamed loss type)
  -- and the policy LOB, but keep it around for awhile  CJM 8/31/98
  IF Upper(cs_get_system_parameter('CM_CVGVER_INC_CVG')) in ('Y','YES','T','TRUE') THEN
    IF length(i_coverage_type) >  0  THEN
      v_sql := v_sql ||   ' AND c.cm_coverage_type_code = ''' || i_coverage_type || ''' ';
    END IF;
  END IF;

  -- this code takes care of any restrictions on coverage based upon the claim's loss type
  v_sql := v_sql ||   ' AND ( EXISTS ';
  v_sql := v_sql ||        ' (SELECT 0 ';
  v_sql := v_sql ||           ' FROM cm_lob_filter ';
  v_sql := v_sql ||          ' WHERE filter_table_name = ''CM_POL_COVERAGE_TYPE'' ';
  v_sql := v_sql ||            ' AND c.cm_coverage_type_code = filter_code ';
  v_sql := v_sql ||            ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||        ' OR NOT EXISTS ';
  v_sql := v_sql ||           ' (SELECT 0 ';
  v_sql := v_sql ||              ' FROM cm_lob_filter ';
  v_sql := v_sql ||             ' WHERE filter_table_name = ''CM_POL_COVERAGE_TYPE'' ';
  v_sql := v_sql ||               ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||       ' )';

-- this code takes care of any restrictions on policy based upon the claim's loss type
   v_sql := v_sql ||   ' AND ( EXISTS ';
  v_sql := v_sql ||        ' (SELECT 0 ';
  v_sql := v_sql ||           ' FROM cm_lob_filter ';
  v_sql := v_sql ||          ' WHERE filter_table_name = ''CM_POL_LOB_CODE'' ';
  v_sql := v_sql ||            ' AND p.lob_code = filter_code ';
  v_sql := v_sql ||            ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||        ' OR NOT EXISTS ';
  v_sql := v_sql ||           ' (SELECT 0 ';
  v_sql := v_sql ||              ' FROM cm_lob_filter ';
  v_sql := v_sql ||             ' WHERE filter_table_name = ''CM_POL_LOB_CODE'' ';
  v_sql := v_sql ||               ' AND cm_lob_code = ''' || i_lob || ''')';
  v_sql := v_sql ||       ' )';

   -- If the user wants to see all coverages that have effective_from/to dates
  -- between a range of dates then the CM_CVGVER_ALL_RANGE system parameter
  -- has to be set to Y
  IF Upper(nvl(cs_get_system_parameter('CM_CVGVER_ALL_RANGE'),'N')) in ('Y', 'YES', 'T', 'TRUE') THEN
     v_sql := v_sql ||   ' AND (';
     v_sql := v_sql ||         ' (greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), ' || eff_from_dt || ' ) <= ';
     v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), ' || eff_to_dt || ' - 1/86400)) ';
     v_sql := v_sql ||             ' OR ( to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
     v_sql := v_sql ||                   ' BETWEEN ' || eff_from_dt || ' AND ' || eff_to_dt || ' - 1/86400 ';
     v_sql := v_sql ||                   ' AND c.retro_date <= to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''))) ';
  END IF;

  IF incl_invalid_b = 'N' THEN
     v_sql := v_sql ||    ' AND substr(' || cm_verify_func || ',';
     v_sql := v_sql ||                 ' 1, instr(' || cm_verify_func || ',''^'') - 1) = ''TRUE'' ';
     v_sql := v_sql ||   ' AND (';
     IF  Upper(nvl(cs_get_system_parameter('CM_CVGVER_INC_RANGE'),'N')) in ('N','NO','F','FALSE') THEN
          v_sql := v_sql ||        ' (c.policy_form = ''OCCURRENCE'' ';
          v_sql := v_sql ||         ' AND to_date(''' || i_loss_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||               ' BETWEEN ' || eff_from_dt || ' AND ' || eff_to_dt || ' - 1/86400 )';
          v_sql := v_sql ||        ' OR (c.policy_form = ''CM'' ';
          v_sql := v_sql ||            ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||                  ' BETWEEN ' || eff_from_dt || ' AND' || eff_to_dt || ' - 1/86400 ';
          v_sql := v_sql ||            ' AND c.retro_date <= to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')) ) ';
     ELSE
          v_sql := v_sql ||        ' (c.policy_form = ''OCCURRENCE'' ';
          v_sql := v_sql ||         ' AND greatest(to_date(''' || i_inc_start_date || ''',''mm/dd/yyyy''), ' || eff_from_dt || ' ) <= ';
          v_sql := v_sql ||             ' least(to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy''), ' || eff_to_dt || ' - 1/86400)) ';
          v_sql := v_sql ||        ' OR (c.policy_form = ''CM'' ';
          v_sql := v_sql ||            ' AND to_date(''' || i_report_date || ''',''mm/dd/yyyy'') ';
          v_sql := v_sql ||                  ' BETWEEN ' || eff_from_dt || ' AND ' || eff_to_dt || ' - 1/86400 ';
          v_sql := v_sql ||            ' AND c.retro_date <= to_date(''' || i_inc_end_date || ''',''mm/dd/yyyy'')) ) ';
     END IF;
     -- Add tail logic
     v_sql := v_sql ||   ' AND (nvl(c.tail_b,''N'') = ''N'' ';
     v_sql := v_sql ||        ' OR ' || eff_from_dt || ' > to_date(''' || i_loss_date || ''',''mm/dd/yyyy'')) ';
  END IF;

-- append any additional SQL for claim's proprietary coverages
  addl_sql := cs_get_system_parameter('CM_ADDLSQL4CVGVER1') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4CVGVER2') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4CVGVER3') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4CVGVER4') || ' ' ||
              cs_get_system_parameter('CM_ADDLSQL4CVGVER5');

  v_sql := v_sql || addl_sql;
  return v_sql;
END cm_find_claim_coverage_sql;
Динамическое DW было сделано потому что аргументы в процедуру не меняются, а вот лист колонок которые она возвращает всё время растёт...

2 - динамический SQL есть и на серверной стороне, а за использование его в РВ я подчинённых увольняю :-)

3. По сути дела существует только 3 метода переносимости приложений написанных на РВ между разными СУБД:
а) Все DW нарисованы в графическом режиме. Я в этот метод не верю, поскольку он приводит к наименьшему знаменателю с точкм зрения использования возможностей СУБД в DW
б) Иметь параллельные наборы DW для каждой СУБД
в) Весь CRUD, включая DW делать через хранимые процедуры и портать только хранимые процедуры. Я работал на продукте (успешно применяющемся в очень многих университетах США), который использует именно такой подход.
На мой взгляд вариант в более поддерживаем, чем вариант б
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34110702
Геннадич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky:
Очень часто бывает, что аргументы для запроса, включая их количество, не меняются, а вот технология вычисления данных меняется.
И что же получается в вашем случае: для изменения одной формы отчёта надо перекомпиливать все отчёты, которые входят в pbd, после этого не будет лишним протестировать их все. Но если данные вычисляются на сервере, то для изменения отчёта совсем не надо трогать ни exe ни pbd, - только процедуру на сервере. А по поводу универсального софта для любых баз - это В САД.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111138
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Anatoly Moskovsky:
И еще, тут помнится обсуждалась тема про автоматическую параметризацию запросов. Так вот, использование stored procedures не требует наличия такого механизма в СУБД, в отличие от тех запросов, которые формируются в DataWindow, для повторного использования плана исполнения запроса.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111334
AndrewN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001to AndrewN
....
Незачем оскорблять друг друга.
...


Что-то было немного эмоционально. Но я не вижу чтобы кто-то кого-то оскорблял.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111626
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Филипп:

1.
Не увидел ничего такого что нельзя сделать на клиенте.
Фильтр запроса там формируется в зависимости от некоторых параметров (скорее всего это права доступа и прикладные параметры)
Для переноса на клиентскую часть с сохранением системы прав можно применить метки данных (которые так или иначе можно было реализовать в любой версии Оракла)
Анализ остальных параметров, не относящихся к правам, просто один к одному переносится на клиент.

2.
Ну хоть как-то обоснуйте.
Я вижу только то что планы динамических запросов могут быть просто ужасными. Но на то есть DBA с ограничениями ресурсов выделяемых на запросы.

3. Я уже приводил пример приложения в котором DW (не в графике) автоматом переводились из Oracle в Postgres. Так что есть и другие способы мигрировать.
А вот портирование ХП в другую СУБД оказалось намного сложнее (причем как руками так и автоматом) чем портирование SQL запросов.
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111689
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГеннадичОчень часто бывает, что аргументы для запроса, включая их количество, не меняются, а вот технология вычисления данных меняется.
И что же получается в вашем случае: для изменения одной формы отчёта надо перекомпиливать все отчёты, которые входят в pbd, после этого не будет лишним протестировать их все. Но если данные вычисляются на сервере, то для изменения отчёта совсем не надо трогать ни exe ни pbd, - только процедуру на сервере. А по поводу универсального софта для любых баз - это В САД.
У нас все статические отчеты хранятся в таблице на сервере (грубо говоря в виде синтаксиса DW) и распространяются в таких же патчах что и структура БД, отдельно от EXE. ХП в них используются только там где нужно для оптимизации, а не как обязательное условие.

Про универсальный софт я вообще не говорил - откуда это?
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111715
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк2 Anatoly Moskovsky:
И еще, тут помнится обсуждалась тема про автоматическую параметризацию запросов. Так вот, использование stored procedures не требует наличия такого механизма в СУБД, в отличие от тех запросов, которые формируются в DataWindow, для повторного использования плана исполнения запроса.
Ну нашли же вроде решение.
Тем более что для последних Ораклов это уже неактуально :)
...
Рейтинг: 0 / 0
DW и процедура Oracle
    #34111836
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу скорректировать свою позицию в результате обсуждения.
Раньше я говорил, что использовать ХП в DW для выборки бессмысленно.
Теперь я считаю, что DW на ХП имеют такое же право на существование как и DW на SELECT, кроме полностью динамических запросов - их по-прежнему не имеет смысл выполнять через ХП.
Но указанные мной недостатки сохраняются:
- ХП сложнее отлаживать
- SQL намного проще портировать чем ХП
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 2 из 3
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / DW и процедура Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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