Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Динамический SQL / 20 сообщений из 20, страница 1 из 1
08.07.2003, 14:33
    #32202048
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
Кто - нибудь знает как провернуть подобное: Нужно сделать SQL процедуру, которая будет динамически составлять SQL Statement, в зависимости от параметров процедуры, т.е. в процедуре имеются параметры, в зависимости от того какой параметр/параметры введены составляется SQL запрос.?
...
Рейтинг: 0 / 0
08.07.2003, 14:38
    #32202068
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
ну я знаю. толко не понятно, что тебя смущает. поясни детальнее, а то не понятно, об чем отвечать.
...
Рейтинг: 0 / 0
08.07.2003, 14:59
    #32202110
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
Нужно что - то вроде этого
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
08.07.2003, 15:18
    #32202141
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
ну проблемы то ты не описал.... все ж здесь рабочее в принципе.
просто пример что ли нужно ?
...
Рейтинг: 0 / 0
08.07.2003, 15:44
    #32202194
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
Давай пример, а то этот не работает.
...
Рейтинг: 0 / 0
08.07.2003, 15:51
    #32202207
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
куда слать?


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

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

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

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

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

1 record(s) selected.
...
Рейтинг: 0 / 0
09.07.2003, 08:38
    #32202648
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
Тьфу ты, млин получилось наконец - то. Только в примере выше ошибочка маленькая, должно быть так:
<Одинарная кавычка>where type=<Одинарная кавычка><Одинарная кавычка>ИМ<Одинарная кавычка><Одинарная кавычка><Одинарная кавычка>
Сэнкс э лот.
...
Рейтинг: 0 / 0
09.07.2003, 11:04
    #32202852
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
это не ошибка, а очепятка!
...
Рейтинг: 0 / 0
09.07.2003, 13:53
    #32203166
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
тончо :)з
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.04.2005, 10:53
    #32997572
poiuytr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
2riman
Запости, пожалуйста, сюда, что у тебя получилось.
...
Рейтинг: 0 / 0
05.04.2005, 11:24
    #32997648
riman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический 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.
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
05.04.2005, 14:09
    #32998142
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL
WHERE TK.KntType=''ЭК''' AND (TK.NomKont=TempCom2 OR TempCom2 Is Null)
или
WHERE TK.KntType=''ЭК''' AND TK.NomKont=COALESCE(TempCom2,TK.NomKont)

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

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


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