powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как бы об указателях
23 сообщений из 23, страница 1 из 1
Как бы об указателях
    #33279358
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть процедура работающая с двумя одинаковыми по структуре таблицами,
с некоторым входным параметром говорящим с какой именно из таблиц следует работать. Хотелось бы в начале процедуры поиметь некоторый указатель на таблицу, что бы потом не городить огороды. Т.е., сейчас я делаю так:
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

Есть ли такая возможность?
Надеюсь, что выразился понятно. Использовать алиасы и виды уже попробовал - не получается (да если бы и получилось было бы некрасиво)...
...
Рейтинг: 0 / 0
Как бы об указателях
    #33279796
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курсор?
Динамический SQL?
Чем не устраивают?
...
Рейтинг: 0 / 0
Как бы об указателях
    #33279934
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая возможность:

CREATE VIEW B AS
SELECT * FROM TBL2
UNION ALL
SELECT * FROM TBL3

и позднее

INSERT INTO B ...

В какую именно таблицу попадут строки при вставке в B, зависит от constraints на TBL2 и TBL3. Чтобы это работало, нужно однозначное разрешение: вставляемая строка удовлетворяет ограничениям либо таблицы TBL2, либо TBL3, обязательно одной, не обоим сразу.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33280762
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Astron

Курсор? Продемонстрируйте, пожалуйста, как в MERGE запихнуть этот самый курсор... Динамический SQL? То есть, вы предлагаете переписать на динамику всю процедуру? Зачем отвечать, не осмыслив вопрос?

To Victor Metelitsa

Я такой вариант уже продумывал, но дело в том, что указанные таблицы содержат часто пересекающиеся данные, т.е. наложить какие-либо ограничения, однозначно разделяющие информацию, не получится.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282035
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я в том смысле, насколько необходимо использование всех указанных операторов DML. Если именно MERGE хочется, то конечно нет. Динамический SQL тоже имеет кучу ограничений, подойдет вам или нет - откуда я знаю? Где ваша задача может прогнуться, а где нет? В такой постановке "хочу ссылку на таблицу, и без вариантов" - сложно, почему я и спрашивал (а не наезжал, оно мне зачем?) чем не устраивают существующие возможности...
Или вариант - операторы INSERT/MERGE/DELETE
Или такой вариант - в процедурах можно CREATE/DROP VIEW
В зависимости от параметра первой строчкой создаете
CREATE tmpview AS SELECT * FROM tblA
работаете с tmpview, а последней строчкой эту вьюшку сбрасываете (огородив это все заборами на случай несброса/несоздания).
он плох, я понимаю, поэтому и спросил про курсоры или динамический SQL.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282169
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 сразу...
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282373
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кутх
To Victor Metelitsa

Я такой вариант уже продумывал, но дело в том, что указанные таблицы содержат часто пересекающиеся данные, т.е. наложить какие-либо ограничения, однозначно разделяющие информацию, не получится.

Если очень сильно захотеть, то получится. Добавить поле, значение которого и будет отделять информацию.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282382
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути вопроса. SQL-выражения у DB2 либо статические, либо динамические. Статические хранят прекомпилированный план в базе (неважно, появился этот план явным биндингом или неявным непосредственно перед первым выполнением запроса). Построение плана требует знания всех таблиц + индексов + статистики. Только динамические вы можете строить "на лету", подставлять имена таблиц, полей и т.д.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282391
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря "ссылки" на таблицы я ни в одной базе не видел. :-((( наверно неграмотный...
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282398
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п..
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282785
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже никогда не видел вещей подобных ссылкам (указателям), поэтому и решил у вас попытать. А вдруг... Мало ли чудес на свете...
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282952
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНе удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п..
Насколько я знаю, в MySQL такое понятие как Static SQL напрочь отсутствует.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33282973
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
gardenman - да и не токо в MySQL, packages в понятии IBM отсутсвуют много где
В DB2 Magazine был интересный цикл статей, поясняющих откуда есть и почему пошли пакеты много лет назад, когда стоимость компиляторов была высока и их небыло возможности держать на каждом mainframe, и тому подобное. Сделали давно, но на удивление толково, до сих пор красиво.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283048
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman Victor MetelitsaНе удивлюсь, если имя таблицы в качестве параметра можно передать в MySQL и т.п..
Насколько я знаю, в MySQL такое понятие как Static SQL напрочь отсутствует.

Спешу успокоить - в MySQL так нельзя 100%. Плюс на динамический SQL они ограничений недавно добавили, в процедурах стало нельзя - сервер падал. Насчет Static SQL - имеется в виду EMBEDDED SQL, да? Я такой штуки действительно нигде не видел, даже спрашивал раньше на этом форуме что это за зверь....
А автору - а если обмануть так: сделать эти вьюшки с одним именем в разных схемах, а в процедуре первой же строчкой ставить
Код: plaintext
SET CURRENT SCHEMA = 'for_tbl_1' | 'for_tbl_2'
наставить по коду квалификаторов на все остальное, кроме этих вьюх.
Последней строчкой ставить схему на место. Будет и мухой, и надежно, а?
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283393
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне сдается что это ничерта работать не будет))
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283689
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanЧто-то мне сдается что это ничерта работать не будет))
Да я сам сомневаюсь :-) Но надеюсь что автор проверит и расскажет. Сам я проверять не стал, я сюда за хитрыми исходниками захожу, вот если б автор выложил кусок, тогда другое дело. Хотя, надо сказать, вопрос интересный :-)
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283738
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa
Если очень сильно захотеть, то получится. Добавить поле, значение которого и будет отделять информацию.

+1, и это решает задачу. Но надо же проверить варианты? :-)
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283771
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Astron

Даже если последнее предложение и работоспособно - реализация его несколько нестройная и запутанная (хотя оригинальная, не спорю). Очень не хочется, чтобы пришедший мне на смену выл матерно глядя в мои тексты (икать не люблю). А что касательно исходников, то в них очень много специфической воды, в которой без знания предметной области сложно разобраться (мы пенсиями занимаемся).
...
Рейтинг: 0 / 0
Как бы об указателях
    #33283953
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил, не работает.
Если в статическом операторе не указано имя схемы он компилируется с использованием текущей, поэтому меняй или не меняй схему в процессе работы - результат не изменится...
...
Рейтинг: 0 / 0
Как бы об указателях
    #33284129
Astron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну тогда остается показанный Виктором путь
Код: plaintext
1.
2.
3.
4.
CREATE VIEW coolview AS
SELECT tbl1.*,  1  as TBL_SELECTOR FROM tbl1
UNION ALL
SELECT tbl2.*,  2  as TBL_SELECTOR FROM tbl2

и переправить все запросы в процедуре, добавив
AND coolview.tbl_selector=input_parameter
...
Рейтинг: 0 / 0
Как бы об указателях
    #33284525
Кутх
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Именно так. Спасибо всем.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33284773
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SET CURRENT SCHEMA = 'for_tbl_1' | 'for_tbl_2'
наставить по коду квалификаторов на все остальное, кроме этих вьюх.
Последней строчкой ставить схему на место. Будет и мухой, и надежно, а?
Не выйдет. План Static SQL (нормально) прекомпилируется до первого использования (или, если пакет стал инвалидным или прибинден не помню с какой опцией - при первом использовании) и далее независим от того, кто его вызывает.
...
Рейтинг: 0 / 0
Как бы об указателях
    #33284783
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AstronНу тогда остается показанный Виктором путь
Код: plaintext
1.
2.
3.
4.
CREATE VIEW coolview AS
SELECT tbl1.*,  1  as TBL_SELECTOR FROM tbl1
UNION ALL
SELECT tbl2.*,  2  as TBL_SELECTOR FROM tbl2
и переправить все запросы в процедуре, добавив
AND coolview.tbl_selector=input_parameter

Неужто работает? По-моему, insert into coolview сработать не должен, поскольку на таблицах нет constraint'ов a la
Код: plaintext
1.
2.
3.
alter table tbl1
  add column tbl_selector shortint not null with default  1 
  add constraint "tbl_selector1" check(tbl_selector= 1 );
(или char вместо shortint, чтобы сэкономить байт)

Но я предложил это чисто формально, а сам бы, скорее всего (но необязательно - это ещё и от размера таблиц и ширины строк зависит), пожлобствовал и вместо добавления колонок и view просто создал бы процедуры P1 и P2 ;-).
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как бы об указателях
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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