Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Есть процедура работающая с двумя одинаковыми по структуре таблицами, с некоторым входным параметром говорящим с какой именно из таблиц следует работать. Хотелось бы в начале процедуры поиметь некоторый указатель на таблицу, что бы потом не городить огороды. Т.е., сейчас я делаю так: CREATE PROCEDURE P (A INTEGER) LANGUAGE SQL BEGIN MERGE INTO TBL1 USING (SELECT * FROM TBL2 WHERE A = 1 UNION ALL SELECT * FROM TBL3 WHERE A <> 1) T ...; ... IF A = 1 THEN DELETE FROM TBL2; INSERT INTO TBL2 SELECT FROM TBL4; ELSE DELETE FROM TBL3; INSERT INTO TBL3 SELECT FROM TBL4; END IF; ... END А хотелось бы так: CREATE PROCEDURE P (A INTEGER) LANGUAGE SQL BEGIN IF A = 1 THEN "SET B = TBL2;" ELSE "SET B = TBL3;" END IF; MERGE INTO TBL1 USING (SELECT * FROM B) T ...; ... DELETE FROM B; INSERT INTO B SELECT FROM TBL4; ... END Есть ли такая возможность? Надеюсь, что выразился понятно. Использовать алиасы и виды уже попробовал - не получается (да если бы и получилось было бы некрасиво)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 16:31 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Курсор? Динамический SQL? Чем не устраивают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 18:28 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Есть такая возможность: CREATE VIEW B AS SELECT * FROM TBL2 UNION ALL SELECT * FROM TBL3 и позднее INSERT INTO B ... В какую именно таблицу попадут строки при вставке в B, зависит от constraints на TBL2 и TBL3. Чтобы это работало, нужно однозначное разрешение: вставляемая строка удовлетворяет ограничениям либо таблицы TBL2, либо TBL3, обязательно одной, не обоим сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 19:59 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
To Astron Курсор? Продемонстрируйте, пожалуйста, как в MERGE запихнуть этот самый курсор... Динамический SQL? То есть, вы предлагаете переписать на динамику всю процедуру? Зачем отвечать, не осмыслив вопрос? To Victor Metelitsa Я такой вариант уже продумывал, но дело в том, что указанные таблицы содержат часто пересекающиеся данные, т.е. наложить какие-либо ограничения, однозначно разделяющие информацию, не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 11:45 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Да я в том смысле, насколько необходимо использование всех указанных операторов DML. Если именно MERGE хочется, то конечно нет. Динамический SQL тоже имеет кучу ограничений, подойдет вам или нет - откуда я знаю? Где ваша задача может прогнуться, а где нет? В такой постановке "хочу ссылку на таблицу, и без вариантов" - сложно, почему я и спрашивал (а не наезжал, оно мне зачем?) чем не устраивают существующие возможности... Или вариант - операторы INSERT/MERGE/DELETE Или такой вариант - в процедурах можно CREATE/DROP VIEW В зависимости от параметра первой строчкой создаете CREATE tmpview AS SELECT * FROM tblA работаете с tmpview, а последней строчкой эту вьюшку сбрасываете (огородив это все заборами на случай несброса/несоздания). он плох, я понимаю, поэтому и спросил про курсоры или динамический SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 17:15 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
To Astron Извинияюсь, если обидел. Вариант с созданием VIEW по условию не пройдет. На конструкцию типа: IF A = 1 THEN CREATE VEW tmpview AS (SELECT * FROM TBL1); ELSE CREATE VEW tmpview AS (SELECT * FROM TBL2); END IF; компилятор ругнется примерно так: 'Объект tmpview типа TABLE уже существует в такой-то схеме'. Значение А заранее неизвестно, поэтому делается попытка скомпилировать и связать оба оператора CREATE VIEW сразу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 17:48 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Кутх To Victor Metelitsa Я такой вариант уже продумывал, но дело в том, что указанные таблицы содержат часто пересекающиеся данные, т.е. наложить какие-либо ограничения, однозначно разделяющие информацию, не получится. Если очень сильно захотеть, то получится. Добавить поле, значение которого и будет отделять информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 19:19 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
По сути вопроса. SQL-выражения у DB2 либо статические, либо динамические. Статические хранят прекомпилированный план в базе (неважно, появился этот план явным биндингом или неявным непосредственно перед первым выполнением запроса). Построение плана требует знания всех таблиц + индексов + статистики. Только динамические вы можете строить "на лету", подставлять имена таблиц, полей и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 19:25 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Честно говоря "ссылки" на таблицы я ни в одной базе не видел. :-((( наверно неграмотный... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 19:32 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Не удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 19:39 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Я тоже никогда не видел вещей подобных ссылкам (указателям), поэтому и решил у вас попытать. А вдруг... Мало ли чудес на свете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 09:11 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Victor MetelitsaНе удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п.. Насколько я знаю, в MySQL такое понятие как Static SQL напрочь отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 10:28 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
gardenman - да и не токо в MySQL, packages в понятии IBM отсутсвуют много где В DB2 Magazine был интересный цикл статей, поясняющих откуда есть и почему пошли пакеты много лет назад, когда стоимость компиляторов была высока и их небыло возможности держать на каждом mainframe, и тому подобное. Сделали давно, но на удивление толково, до сих пор красиво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 10:36 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
gardenman Victor MetelitsaНе удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п.. Насколько я знаю, в MySQL такое понятие как Static SQL напрочь отсутствует. Спешу успокоить - в MySQL так нельзя 100%. Плюс на динамический SQL они ограничений недавно добавили, в процедурах стало нельзя - сервер падал. Насчет Static SQL - имеется в виду EMBEDDED SQL, да? Я такой штуки действительно нигде не видел, даже спрашивал раньше на этом форуме что это за зверь.... А автору - а если обмануть так: сделать эти вьюшки с одним именем в разных схемах, а в процедуре первой же строчкой ставить Код: plaintext Последней строчкой ставить схему на место. Будет и мухой, и надежно, а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 11:04 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Что-то мне сдается что это ничерта работать не будет)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 12:46 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
gardenmanЧто-то мне сдается что это ничерта работать не будет)) Да я сам сомневаюсь :-) Но надеюсь что автор проверит и расскажет. Сам я проверять не стал, я сюда за хитрыми исходниками захожу, вот если б автор выложил кусок, тогда другое дело. Хотя, надо сказать, вопрос интересный :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 14:07 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa Если очень сильно захотеть, то получится. Добавить поле, значение которого и будет отделять информацию. +1, и это решает задачу. Но надо же проверить варианты? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 14:19 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
To Astron Даже если последнее предложение и работоспособно - реализация его несколько нестройная и запутанная (хотя оригинальная, не спорю). Очень не хочется, чтобы пришедший мне на смену выл матерно глядя в мои тексты (икать не люблю). А что касательно исходников, то в них очень много специфической воды, в которой без знания предметной области сложно разобраться (мы пенсиями занимаемся). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 14:23 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Проверил, не работает. Если в статическом операторе не указано имя схемы он компилируется с использованием текущей, поэтому меняй или не меняй схему в процессе работы - результат не изменится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 15:19 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Ну тогда остается показанный Виктором путь Код: plaintext 1. 2. 3. 4. и переправить все запросы в процедуре, добавив AND coolview.tbl_selector=input_parameter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 16:03 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Именно так. Спасибо всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 17:48 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
Astron Насчет Static SQL - имеется в виду EMBEDDED SQL, да? Я такой штуки действительно нигде не видел, даже спрашивал раньше на этом форуме что это за зверь.... Embedded SQL не синоним Static SQL, хотя использовать Static SQL из Embedded SQL проще всего. В Embedded SQL есть возможность конструировать SQL-выражения динамически; и напротив, CLI-приложение можно заставить использовать Static SQL (см. db2cap - CLI/ODBC Static Package Binding Tool Command ). Разница между Embedded SQL/SQLJ и прочим - в синтаксисе "встраивания", тогда как разница между статическим и динамическим - в моменте компиляции SQL-выражения. Динамический прекомпилируется во время выполнения приложения, статический - до выполнения приложения (с некоторыми оговорками, напр., инвалидный пакет перекомпилируется при первом обращении к нему). А автору - а если обмануть так: сделать эти вьюшки с одним именем в разных схемах, а в процедуре первой же строчкой ставить Код: plaintext Последней строчкой ставить схему на место. Будет и мухой, и надежно, а? Не выйдет. План Static SQL (нормально) прекомпилируется до первого использования (или, если пакет стал инвалидным или прибинден не помню с какой опцией - при первом использовании) и далее независим от того, кто его вызывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 21:06 |
|
||
|
Как бы об указателях
|
|||
|---|---|---|---|
|
#18+
AstronНу тогда остается показанный Виктором путь Код: plaintext 1. 2. 3. 4. AND coolview.tbl_selector=input_parameter Неужто работает? По-моему, insert into coolview сработать не должен, поскольку на таблицах нет constraint'ов a la Код: plaintext 1. 2. 3. Но я предложил это чисто формально, а сам бы, скорее всего (но необязательно - это ещё и от размера таблиц и ширины строк зависит), пожлобствовал и вместо добавления колонок и view просто создал бы процедуры P1 и P2 ;-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 21:19 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=33284783&tid=1605758]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 454ms |

| 0 / 0 |
