|
|
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Нужен совет. Ситуация такая. Есть запрос на удаление нескольких (количестко не постоянное) строк по ID, допустим Код: plaintext Список ID формируется на клиенте. Но как-то душа не лежит формировать на клиенте полностью весь запрос типа Javastring ids = "1,2,3,4,5"; //[.....] ResultSet rs = s.executeQuery("delete from table1 where id in(" + ids + ")"); Хочется сделать это в виде некой серверной сущности (типа вью или ХП) с разделением прав, SQL-дезинъекцией и т.д. которой просто передавать список ID. Путем долгих мучений коллег тут и тут выяснилось, что чтобы передать массив из кода Java нужны танцы с бубнами: 1. реализовать java.sql.Array (готовой реализации я не нашел) 2. пользовать connection.createArrayOf() (подозреваю, хотя не вникал, что он не творит чудеса а ищит в драйвере реализацию (которую, повторюсь, я не нашел) или что-то типа того) или же 3. пересмотреть архитектуру. Вот третий вариант мне кажется наиболее правильным по таким соображениям 1. Все сложное от лукавого 2. На данный момент СУБД - Postgres. ТЕОРЕТИЧЕСКИ она может поменяться, поэтому хочется найти как можно более общее решение. Сейчас единственный рабочий вариант это сделать что-то на подобии victor_krcreate function delsmth(ids character varying) returns void as $body$ begin execute 'delete from table1 where id in(' + ids + ')'; end; $body$ LANGUAGE 'plpgsql' VOLATILE; и передавать туда стринг с id через запятую. Есть также мысль сделать 2 хранимки: одна сохраняет в БД ID для удаления, другая удаляет, но мне кажется что есть более кошерный варианты чем вызывать ХП N+1 раз. Какие еще варианты? Буду рад любым идеям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 12:09 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
вариант со стрингами выглядит... более привлекательно, имхо )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 12:18 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Для "паритета" приведу второй вариант: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 12:30 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Саабразим Аль-каши БуханиНужен совет. Ситуация такая. Есть запрос на удаление нескольких (количестко не постоянное) строк по ID, допустим Код: plaintext Список ID формируется на клиенте. Но как-то душа не лежит формировать на клиенте полностью весь запрос типа Javastring ids = "1,2,3,4,5"; //[.....] ResultSet rs = s.executeQuery("delete from table1 where id in(" + ids + ")"); ... Сейчас единственный рабочий вариант это сделать что-то на подобии victor_krcreate function delsmth(ids character varying) returns void as $body$ begin execute 'delete from table1 where id in(' + ids + ')'; end; $body$ LANGUAGE 'plpgsql' VOLATILE; и передавать туда стринг с id через запятую. Есть также мысль сделать 2 хранимки: одна сохраняет в БД ID для удаления, другая удаляет, но мне кажется что есть более кошерный варианты чем вызывать ХП N+1 раз. Какие еще варианты? Буду рад любым идеям. и egorychвариант со стрингами выглядит... более привлекательно, имхо )))) Только это... Не надо забывать, что длина у стринга тоже ограничена... У Оракула, вроде бы максимальная длина строки, передаваемой "извне" равна 8Кб (между ХП что-то около 30 Кб)... Если уложитесь, то без проблем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 12:31 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Станислав С...кийУ Оракула, вроде бы максимальная длина строки, передаваемой "извне" равна 8КбЕсли вы про тип VARCHAR2, то 4000 байт. я бы еще предложил вариант с циклом и параметрами (т.е. удалять по одной записи, id передавать параметром), но это не всегда оптимально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 13:20 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
miksoft я бы еще предложил вариант с циклом и параметрами (т.е. удалять по одной записи, id передавать параметром), но это не всегда оптимально. Не очень понял. Можно подробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 13:28 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Саабразим Аль-каши Буханиmiksoft я бы еще предложил вариант с циклом и параметрами (т.е. удалять по одной записи, id передавать параметром), но это не всегда оптимально.Не очень понял. Можно подробнее?примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 13:37 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Массивы и списки в SQL Server Статья по MSSQL, но идеи общие, разберетесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 13:56 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Саабразим Аль-каши БуханиКакие еще варианты? Буду рад любым идеям. Загнать список во временную таблицу - длина списка не ограничена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 14:56 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Если Вас смущает SQL-injection, первый вариант - execute 'delete from table1 where id in(' + ids + ')' - как раз не очень подходит, покольку ids может содержать все что угодно. Что касается PostgreSQL, можно как-нибудь так: Код: 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. И далее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Но ведь у Вас на клиенте, наверно, не один запрос вызывается. Если Вы вообще не хотите запросы в явном виде в коде писать, логично тогда их все через хранимые процедуры реализовывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 16:56 |
|
||
|
Стринги против массивов, или я достану всех. =)
|
|||
|---|---|---|---|
|
#18+
Золотая рыбкаЕсли Вас смущает SQL-injection, первый вариант - execute 'delete from table1 where id in(' + ids + ')' - как раз не очень подходит, покольку ids может содержать все что угодно. Поэтому мне это вариант и не особо нравится. Золотая рыбка Что касается PostgreSQL, можно как-нибудь так: Спасибо! Кстати получилось передавать параметр из java вот так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 17:27 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=87&tid=1543220]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 423ms |

| 0 / 0 |
