powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Динамический SQL
20 сообщений из 20, страница 1 из 1
Динамический SQL
    #32202048
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто - нибудь знает как провернуть подобное: Нужно сделать SQL процедуру, которая будет динамически составлять SQL Statement, в зависимости от параметров процедуры, т.е. в процедуре имеются параметры, в зависимости от того какой параметр/параметры введены составляется SQL запрос.?
...
Рейтинг: 0 / 0
Динамический SQL
    #32202068
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я знаю. толко не понятно, что тебя смущает. поясни детальнее, а то не понятно, об чем отвечать.
...
Рейтинг: 0 / 0
Динамический SQL
    #32202110
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно что - то вроде этого
CREATE PROCEDURE Test(IN Parameter1 INTEGER, IN Parameter2 INTEGER)
....
P1:BEGIN
DECLARE WhereClause VARCHAR(200);
DECLARE MyCursor CURSOR WITH RETURN FOR
/*код который выбирает какую из оставшихся частей селекта выбрать*/
--что то вроде if(Parameter1=12) THEN WhereClase="WHERE MyField="MyValue"";
else WhereClause="WHERE ...."
SELECT * FROM MyTable + WhereClause;
END P1

Пример грубый, но примерно это мне нужно.
...
Рейтинг: 0 / 0
Динамический SQL
    #32202141
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну проблемы то ты не описал.... все ж здесь рабочее в принципе.
просто пример что ли нужно ?
...
Рейтинг: 0 / 0
Динамический SQL
    #32202194
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай пример, а то этот не работает.
...
Рейтинг: 0 / 0
Динамический SQL
    #32202207
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
куда слать?


как создавать таблички не дам !!!
...
Рейтинг: 0 / 0
Динамический SQL
    #32202237
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие таблицы?
Мне только пример нужен. Вот моё мыло: riman_lv@front.ru
А почему в форум отослать не хочешь?
...
Рейтинг: 0 / 0
Динамический SQL
    #32202270
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лови. тока она под OS/390 :)
но ничего, лишние детали убрать-сгодится :)
...
Рейтинг: 0 / 0
Динамический SQL
    #32202394
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот млин. Всё отлично, только есть одна какашка:
Допустим я пишу stmt='where type='ИМ'' как сохранить кавычки перед и после ИМ? Т.е. какие - там в SQL'е эскейп последовательности?
...
Рейтинг: 0 / 0
Динамический SQL
    #32202413
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stmt='where type=''ИМ'''
...
Рейтинг: 0 / 0
Динамический SQL
    #32202436
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нееет. Не хочет работать. Выдает:SQL0206N "ИМ" is not valid in the context where it is used. SQLSTATE=42703
Какие эскейп последовательности в SQL'e есть?
...
Рейтинг: 0 / 0
Динамический SQL
    #32202440
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stmt=<одинарная кавычка>where type=<одинарная кавычка>ИМ<одинарная кавычка><одинарная кавычка><одинарная кавычка>

<одинарная кавычка>, т.е '
превращается в <одинарная кавычка><одинарная кавычка>, т.е ''
внутри строки.

как так у меня работает а у тебя нет...
...
Рейтинг: 0 / 0
Динамический SQL
    #32202447
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-------------------------------- Script --------------------------------
select '''''''''''''''''''' from sysibm.sysdummy1;

------------------------------------------------------------------------

1
---------
'''''''''

1 record(s) selected.
...
Рейтинг: 0 / 0
Динамический SQL
    #32202648
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу ты, млин получилось наконец - то. Только в примере выше ошибочка маленькая, должно быть так:
<Одинарная кавычка>where type=<Одинарная кавычка><Одинарная кавычка>ИМ<Одинарная кавычка><Одинарная кавычка><Одинарная кавычка>
Сэнкс э лот.
...
Рейтинг: 0 / 0
Динамический SQL
    #32202852
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не ошибка, а очепятка!
...
Рейтинг: 0 / 0
Динамический SQL
    #32203166
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тончо :)з
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Динамический SQL
    #32997572
poiuytr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2riman
Запости, пожалуйста, сюда, что у тебя получилось.
...
Рейтинг: 0 / 0
Динамический SQL
    #32997648
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
CREATE PROCEDURE PROC1 (IN StDate date, IN EnDate date, IN TempCom1 VARCHAR( 50 ), IN TempCom2 VARCHAR( 50 ), IN WhichQuery VARCHAR( 6 ))

 DYNAMIC RESULT SETS  1  
 LANGUAGE SQL 
 SPECIFIC PROC1
 NOT DETERMINISTIC 
 MODIFIES SQL DATA 
 CALLED ON NULL INPUT 
--
-- SQL Stored Procedure 
--
P1: BEGIN 
DECLARE stmt16 VARCHAR( 6144 );
DECLARE v_sqlstmt16 VARCHAR( 6144 );

DECLARE GTK16 CURSOR WITH RETURN FOR stmt16;


CASE WHICHQUERY

WHEN 'GTK16' THEN SET v_sqlstmt16='
WITH DefSums AS 
(SELECT TD.KntID AS dfsmsKntID 
 ,SUM(TD.InvCost*TK.CurrRate_c) AS dfsmsTDInv  
,SUM(case when top.C_oplat is not null then TOP.C_Oplat*TK.CurrRate_r else 0 end) AS dfsmsTOpC_Opl 
FROM (BASE1.Table2 TD
 LEFT OUTER JOIN BASE1.Table1 TK ON TK.KntID=TD.KntID)
 LEFT OUTER JOIN BASE1.Table3 TOP ON TD.KntID=TOP.KntID 
WHERE (''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''')>TD.BoardDate GROUP BY TD.KntID
having SUM(TD.InvCost*TK.CurrRate_c)<>SUM(case when top.c_oplat is not null then TOP.C_Oplat*TK.CurrRate_r else 0 end)
 AND SUM(TD.InvCost*TK.CurrRate_c)>SUM(case when top.c_oplat is not null then TOP.C_Oplat*TK.CurrRate_r else 0 end)) 
,dfKntSum AS 
(SELECT TA.KntID AS TAgrmKntID
 ,MAX(TA.Agrmno) AS TAgrmNo
 ,TA.AgrmSum AS TAgrmSum
 ,TA.CurrRate AS TAgrmCurrRate 
FROM BASE1.Table4 TA 
GROUP BY TA.KntID
 ,TA.AgrmSum
 ,TA.CurrRate)

SELECT TK.Name_ExpFir AS "Наим. эксп-ра" 
 ,TK.Name_ImpFir AS "Наим. получ" 
 ,TK.NomKont CONCAT ' CONCAT ''' '' CONCAT CAST(TK.D_Kont AS CHAR(10)) AS "Номер и дата закл. контр." 
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum ELSE TK.KntSum END AS "Сумма в вал. конт." 
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum*TAgrmCurrRate/TD.G13 ELSE TK.KntSum*TK.CurrRate_c/TD.G13 END AS "Сумма в дол. США" 
 ,SUM(CASE WHEN TOpl.KntID=TK.KntID AND YEAR(TOpl.D_Oplat)=YEAR(''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TOpl.C_Oplat*TK.CurrRate_r ELSE 0 END) AS "Пост. вал. выр. с нач. года" 
 ,SUM(CASE WHEN TOpl.KntID=TK.KntID AND TOpl.D_Oplat BETWEEN ('''CONCAT CAST(StDate AS VARCHAR( 10 )) CONCAT''') AND (''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TOpl.C_Oplat*TK.CurrRate_r ELSE 0 END) AS "Пост. вал. выр. за период" 
 ,SUM(CASE WHEN TCSl.KntID=TK.KntID AND YEAR(TCSl.PmDate)=YEAR(''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TCSl.PmSum*TCSl.CurrRate/TCSl.CurrCount ELSE 0 END) AS "Обяз. прод с нач. года" 
 ,SUM(CASE WHEN TCSl.KntID=TK.KntID AND TCSl.PmDate BETWEEN ('''CONCAT CAST(StDate AS VARCHAR( 10 )) CONCAT''') AND (''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TCSl.PmSum*TCSl.CurrRate/TCSl.CurrCount ELSE 0 END) AS "Обяз. прод с нач. мес." 
 ,dfsmsTDInv-dfsmsTOpC_Opl AS "Деб. задолж." 
,SUM(CASE WHEN UCASE(TK.VidExpOp)=''К'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 180>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 180 WHEN UCASE(TK.VidExpOp)=''Д'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 60>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 60 WHEN UCASE(TK.VidExpOp)=''Ц'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 80>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 80 ELSE 0 END) AS "Просроченная деб. зад-ть"
,''_'' AS "Снятие с учета" FROM ((((DefSums INNER JOIN BASE1.Table1 TK ON TK.KntID=dfsmsKntID)
 LEFT OUTER JOIN BASE1.Table2 TD ON TK.KntID=TD.KntID)
 LEFT OUTER JOIN BASE1.Table5 TCSl ON TCSl.KntID=TK.KntID)
 LEFT OUTER JOIN BASE1.Table3 TOpl ON TOpl.KntID=TK.KntID)LEFT OUTER JOIN dfKntSum ON TK.KntID=TAgrmKntID 
WHERE TK.KntType=''ЭК''';
IF TempCom2 IS NULL
THEN SET v_sqlstmt16=v_sqlstmt16 CONCAT ' GROUP BY TK.Name_ExpFir 
 ,TK.Name_ImpFir 
 ,TK.NomKont CONCAT ' CONCAT ''' '' CONCAT CAST(TK.D_Kont AS CHAR(10)) 
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum ELSE TK.KntSum END
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum*TAgrmCurrRate/TD.G13 ELSE TK.KntSum*TK.CurrRate_c/TD.G13 END
 ,dfsmsTDInv-dfsmsTOpC_Opl 
,''_''';
ELSE SET v_sqlstmt16=v_sqlstmt16 CONCAT ' AND TK.NomKont=''' CONCAT TempCom2 CONCAT ''' GROUP BY TK.Name_ExpFir 
 ,TK.Name_ImpFir 
 ,TK.NomKont CONCAT ' CONCAT ''' '' CONCAT CAST(TK.D_Kont AS CHAR(10)) 
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum ELSE TK.KntSum END
 ,CASE WHEN TK.KntID=TAgrmKntID AND TAgrmSum<>0 THEN TAgrmSum*TAgrmCurrRate/TD.G13 ELSE TK.KntSum*TK.CurrRate_c/TD.G13 END
 ,dfsmsTDInv-dfsmsTOpC_Opl 
,''_''';
END IF;
SET v_sqlstmt16=v_sqlstmt16 CONCAT ' UNION ALL SELECT ''ИТОГО'' 
 ,''_'' 
 ,''_'' 
 ,SUM(CASE WHEN TK.KntID=TAgrmKntID THEN TAgrmSum ELSE TK.KntSum END) 
 ,SUM(CASE WHEN TK.KntID=TAgrmKntID THEN TAgrmSum*TAgrmCurrRate/TD.G13 ELSE TK.KntSum*TK.CurrRate_c/TD.G13 END) 
 ,SUM(CASE WHEN TOpl.KntID=TK.KntID AND YEAR(TOpl.D_Oplat)=YEAR(''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TOpl.C_Oplat*TK.CurrRate_r ELSE 0 END) AS "Пост. вал. выр. с нач. года" 
 ,SUM(CASE WHEN TOpl.KntID=TK.KntID AND TOpl.D_Oplat BETWEEN ('''CONCAT CAST(StDate AS VARCHAR( 10 )) CONCAT''') AND (''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TOpl.C_Oplat*TK.CurrRate_r ELSE 0 END) AS "Пост. вал. выр. с нач. мес." 
 ,SUM(CASE WHEN TCSl.KntID=TK.KntID AND YEAR(TCSl.PmDate)=YEAR(''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TCSl.PmSum*TCSl.CurrRate/TCSl.CurrCount ELSE 0 END) AS "Обяз. прод с нач. года" 
 ,SUM(CASE WHEN TCSl.KntID=TK.KntID AND TCSl.PmDate BETWEEN ('''CONCAT CAST(StDate AS VARCHAR( 10 )) CONCAT''') AND (''' CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT ''') THEN TCSl.PmSum*TCSl.CurrRate/TCSl.CurrCount ELSE 0 END) AS "Обяз. прод с нач. мес." 
 ,SUM(dfsmsTDInv-dfsmsTOpC_Opl) AS "Деб. задолж." 
 ,SUM(CASE WHEN UCASE(TK.VidExpOp)=''К'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 180>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 180 WHEN UCASE(TK.VidExpOp)=''Д'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 60>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 60 WHEN UCASE(TK.VidExpOp)=''Ц'' AND dfsmsTDInv<dfsmsTOpC_Opl AND '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 80>0 THEN '''CONCAT CAST(EnDate AS VARCHAR( 10 )) CONCAT''' - TD.BoardDate - 80 ELSE 0 END) AS "Просроченная деб. зад-ть"
 ,''_'' FROM ((((DefSums INNER JOIN BASE1.Table1 TK ON TK.KntID=dfsmsKntID)
 LEFT OUTER JOIN BASE1.Table2 TD ON TK.KntID=TD.KntID)
 LEFT OUTER JOIN BASE1.Table5 TCSl ON TCSl.KntID=TK.KntID)
 LEFT OUTER JOIN BASE1.Table3 TOpl ON TOpl.KntID=TK.KntID)LEFT OUTER JOIN dfKntSum ON TK.KntID=TAgrmKntID
WHERE TK.KntType=''ЭК'' GROUP BY ''ИТОГО'' 
 ,''_'' 
 ,''_'' 
 ,''_'' '; 
PREPARE stmt16 FROM v_sqlstmt16;
OPEN GTK16;

END CASE;
END P1
...
Рейтинг: 0 / 0
Динамический SQL
    #32998142
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE TK.KntType=''ЭК''' AND (TK.NomKont=TempCom2 OR TempCom2 Is Null)
или
WHERE TK.KntType=''ЭК''' AND TK.NomKont=COALESCE(TempCom2,TK.NomKont)

без всякой динамики. Статика кстати быстрее работает.
...
Рейтинг: 0 / 0
Динамический SQL
    #32998248
Фотография riman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaWHERE TK.KntType=''ЭК''' AND (TK.NomKont=TempCom2 OR TempCom2 Is Null)
или
WHERE TK.KntType=''ЭК''' AND TK.NomKont=COALESCE(TempCom2,TK.NomKont)

без всякой динамики. Статика кстати быстрее работает.
Спасибо, но тот пример только для ознакомления - всё равно был переделан под Яву.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Динамический SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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