powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Динамическое изменение IN в скрипте
19 сообщений из 19, страница 1 из 1
Динамическое изменение IN в скрипте
    #35356358
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно в СКРИПТЕ сделать такой UPDATE:
Код: plaintext
1.
2.
3.
long ll_1
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(...);
В зависимости от ll_1 нужно поменять значение в IN. Очень бы не хотелось для каждого значения ll_1 переписывать ВЕСЬ UPDATE.
Т.е. нужно написать что-нибудь такое:
Код: plaintext
1.
2.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(case :ll_1 when  1  then ( 0 ,  1 ,  2 ,  3 ) when  2  then ( 0 ,  5 ));
В таком виде не работает. А как правильно написать динамическое изменение в IN?
Обращаю Ваше внимание, что поле kakojto_number - NUMBER!
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356444
создать табличку типа

Код: plaintext
value_map

value_invalue_out101112132025

Код: plaintext
1.
2.
3.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' 
AND kakojto_number in(select value_out from value_map where value_in=:ll_1);
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356453
ono?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oнo ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND 
( :ll_1 =  1   and kakojto_number in ( 0 ,  1 ,  2 ,  3 ) 
  OR
  :ll_1 =  2   and kakojto_number in ( 0 ,  5 ) 
  OR ...
)
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356477
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaНужно в СКРИПТЕ сделать такой UPDATE:
Код: plaintext
1.
2.
3.
long ll_1
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(...);
В зависимости от ll_1 нужно поменять значение в IN. Очень бы не хотелось для каждого значения ll_1 переписывать ВЕСЬ UPDATE.
Т.е. нужно написать что-нибудь такое:

Код: plaintext
1.
2.
3.
string s
s = "UPDATE table1 SET id = 0WHERE name = 'Vasya' AND kakojto_number in(...)"
execute immediate :s;
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356617
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaНужно в СКРИПТЕ сделать такой UPDATE:Плохая практика...

RiskaТ.е. нужно написать что-нибудь такое:
Код: plaintext
1.
2.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(case :ll_1 when  1  then ( 0 ,  1 ,  2 ,  3 ) when  2  then ( 0 ,  5 ));
В таком виде не работает. А как правильно написать динамическое изменение в IN?
А в таком работает?
Код: plaintext
1.
2.
3.
4.
5.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(
case :ll_1 when  1  then ( 0 ,  1 ,  2 ,  3 ) when  2  then ( 0 ,  5 )
END
);
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356648
VanoR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да сам вопрос отвечает на себя...
Марк прав... Если нужно динамическое изменение запроса, значит и нужно использовать динамический SQL. Чего там еще думать то?!
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356671
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ono?oнo ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND 
( :ll_1 =  1   and kakojto_number in ( 0 ,  1 ,  2 ,  3 ) 
  OR
  :ll_1 =  2   and kakojto_number in ( 0 ,  5 ) 
  OR ...
)

Онo!
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356690
craftyman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaОнo!
ну вот видите, как все просто. и никакого динамического SQL
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356709
Sashuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska ono?oнo ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND 
( :ll_1 =  1   and kakojto_number in ( 0 ,  1 ,  2 ,  3 ) 
  OR
  :ll_1 =  2   and kakojto_number in ( 0 ,  5 ) 
  OR ...
)

Онo!
А если нужно через переменную передать (1, 2, 3..) то какого типа переменную создать?
string не покатит т.к. - будет не соотв. типов.. а int[] тож ругаеться...
Нужно например как в ДВ тип - number array.
что предложите?
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356738
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99А в таком работает?
Код: plaintext
1.
2.
3.
4.
5.
UPDATE table1 
SET id =  0 
WHERE name = 'Vasya' AND kakojto_number in(
case :ll_1 when  1  then ( 0 ,  1 ,  2 ,  3 ) when  2  then ( 0 ,  5 )
END
);

Не работает
Код: plaintext
1.
2.
SQLSTATE =  42000 
Microsoft OLE DB Provider for SQL Server
Incorrect syntax near ','.
Самое простое решение предложил ono?
За что ему/ей отдельное спасибо :)
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356741
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashukА если нужно через переменную передать (1, 2, 3..) то какого типа переменную создать?
string не покатит т.к. - будет не соотв. типов.. а int[] тож ругаеться...
Нужно например как в ДВ тип - number array.
что предложите?
http://www.sql.ru/forum/actualpost.aspx?bid=39&tid=564528&mid=5764706&p=1&act=quot#5764228
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356755
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashuk
А если нужно через переменную передать (1, 2, 3..) ...
Тогда можно и через EXECUTE IMMEDIATE
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356774
Sashuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska Sashuk
А если нужно через переменную передать (1, 2, 3..) ...
Тогда можно и через EXECUTE IMMEDIATE
а не будет ошибки при преведении типов?
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356777
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashuk Riska Sashuk
А если нужно через переменную передать (1, 2, 3..) ...
Тогда можно и через EXECUTE IMMEDIATE
а не будет ошибки при преведении типов?
Какое приведение типов? EXECUTE IMMEDIATE выполняет переданную текстовую строку.
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35356785
Sashuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркКакое приведение типов? EXECUTE IMMEDIATE выполняет переданную текстовую строку.
сорри... провтыкал
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35358322
ono?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
решение от:
1. с новым годом - не вегда есть возможность менять структуру БД
2. Локшин Марк - чаще запросы хранятся в БД для последующего их изменения без перекомпиляции программы ...

ЗЫ: все зависит от поставленной задачи :)
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35358540
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ono?решение от:
2. Локшин Марк - чаще запросы хранятся в БД для последующего их изменения без перекомпиляции программы ...

Если что-то пишут в СКРИПТЕ (как сказано в исходном письме!), то оно никак не может храниться в БД и исправляться без перекомпиляции программы.
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35360600
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaНужно в СКРИПТЕ сделать такой UPDATE:


Риска, а за чем вообше так делать?
В смысле писать update в скрипте.
Напиши процедуру и пусть твой update просходит в базе данных

string s_name, s_number
long l_id

s_name = 'Вася'
s_number = '1,2,3,9,19'

l_id = 0


DECLARE sp_test PROCEDURE FOR sp_test
@id = :l_id,
@name = :s_name,
@kakojto_number = :s_number;

SetPointer(HourGlass!)

EXECUTE sp_test;

SetPointer(Arrow!)

IF sqlca.SQLCode = -1 THEN
MessageBox("SQL Error", sqlca.SQLErrText)
ELSE
FETCH sp_test INTO :l_return;
IF sqlca.SQLCode = -1 THEN
MessageBox("SQL Error", sqlca.SQLErrText)
END IF
END IF

CLOSE sp_test;


ну и в процедуре:

create procedure sp_test
@id int,
@name varchar(30),
@kakojto_number varchar(7900)

as

set nocount on

DECLARE @separator_position int, @array_value varchar(1000), @sql_string varchar(4000)

set @separator_position = ','


CREATE TABLE #tmp (array_value Int)

SELECT @kakojto_number = @kakojto_number + @separator

WHILE Patindex('%' + @separator + '%' , @kakojto_number ) <> 0

BEGIN

SELECT @sql_string = '',
@separator_position = Patindex('%' + @separator + '%' , @kakojto_number ),
@array_value = Left@kakojto_number , @separator_position - 1)

INSERT INTO #tmp VALUES (convert(int, @array_value))

SELECT @kakojto_number = Stuff(@kakojto_number , 1, @separator_position, '')

END

//ну и потом ..

begin transaction

UPDATE table1
SET id = @id
WHERE name = @name AND kakojto_number in (select array_value from #tmp )

if @@error <> 0
rollback transaction
select @@error
return
end
else
commit transaction
select 0
...
Рейтинг: 0 / 0
Динамическое изменение IN в скрипте
    #35360608
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично моя точка зрения, это "зачем насиловать скрипт там, где проше сделать в базе данных"
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Динамическое изменение IN в скрипте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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