Как выполнить составной sql в DB2

Я столкнулся с проблемой, пытаясь понять DB2 sql (обратите внимание, я исхожу из MS SQL Server): P.

Вот сценарий: у меня есть 2 таблицы, в одной из которых есть идентификаторы и другие данные, во второй есть много другой информации, соответствующей каждому идентификатору.

  ID              Info for ID
_______      ____> _______
|     |     /      |     |
|  T1 |<---------> |  T2 |
|_____|     \____> |_____|

Исходя из SQL Server, я привык запускать такие сценарии, как:

Declare @ID  int
Declare @ID1 int

select @ID=ID from T1 where col1 = @ID1

select * from T2 where ID = @ID

Все это работает нормально и дает мне идентификатор, соответствующий ID1, который в дальнейшем можно использовать для получения всей информации об идентификаторе от T2.

К сожалению, в DB2 это взрывается прямо мне в лицо, я боюсь, что если я выполню этот запрос еще раз, он откажется от меня навсегда :(.

Я провел небольшое исследование и написал это (даже застрял в объявлении переменной).

--#SET TERMINATOR @
BEGIN ATOMIC
DECLARE UID char(30);
END @

Для других это работало отлично, но я получаю следующую ошибку:

BEGIN ATOMIC
DECLARE UID char(30);
END

ILLEGAL USE OF KEYWORD ATOMIC.  TOKEN  WAS EXPECTED. SQLCODE=-199, SQLSTATE=42601, DRIVER=3.63.108

Другая информация:

IBM DB2 для z/OS V9.1 IBM Data Studio V3.1.1.0

[EDIT: использование DECLARE] Еще одна вещь, которую я пробовал, не сработала:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

TIA, Abhinav


Обновление от 13 мая 2016 г. (пятница, 13-е)

Создание хранимой процедуры - единственный способ исправить это :(


person Abhinav    schedule 19.10.2012    source источник
comment
Что вы пытаетесь сделать, что JOIN не вариант? Взгляните на Справочник по DB2 — я думаю, что BEGIN ATOMIC — это только часть определения триггера (это то, что вы пытаетесь сделать?). Если вы просто пытаетесь выполнить это в командной оболочке, она, вероятно, ожидает DECLARE next, хотя я не думаю, что на самом деле это тот путь, которым вы хотите идти. Каков ваш настоящий вопрос?   -  person Clockwork-Muse    schedule 20.10.2012
comment
@Clockwork-Muse Мне просто нужно сохранить идентификатор в переменной из таблицы T1, а затем использовать эту переменную в остальной части скрипта. Позже этот скрипт станет хранимой процедурой, но сейчас я только начинаю, поэтому нужно немного узнать об объявлениях переменных и т. д.   -  person Abhinav    schedule 20.10.2012
comment
Итак, после долгих обсуждений с администратором баз данных я понял, что в этой версии DB2 для z/OS V9.1 это невозможно. Он предложил, чтобы я скорее обернул его в хранимую процедуру, а затем проверил. Я обновлю, если это сработает.   -  person Abhinav    schedule 23.10.2012


Ответы (2)


Вот основной синтаксис для вашего первого случая:

create variable id_var  integer;
create variable id_var1 integer;

set id_var = 100;

set id_var1 = (select id from t1 where id = id_var);

select * from t2 where id = id_var1;

Однако в этом примере вы пытаетесь использовать переменную в качестве имени столбца:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

К сожалению, вы не можете сделать это в DB2. Единственный способ сделать что-то подобное — создать динамический оператор sql и выполните его. Это какая-то неразбериха: вы создаете sql-команду в строке, а затем подготавливаете и выполняете ее. Также существуют ограничения на использование SELECT непосредственно в динамическом sql. Вероятно, лучше подумать о другом дизайне, который решит вашу проблему, чем идти по этому пути.

person dan1111    schedule 22.10.2012

Ваша команда отлично работает в DB2 10 для LUW. Версия студии данных не имеет значения, так как она работает одинаково с CLP. Я протестировал этот код в образце базы данных:

BEGIN ATOMIC
 DECLARE UID char(30);
 SET UID = 200280;
 SELECT FIRSTNME, LASTNAME FROM ANDRES.EMPLOYEE WHERE EMPNO = UID;
END @

Вероятно, используемая вами версия z/OS не поддерживает встроенный SQL (Begin atomic). Я не являюсь администратором баз данных zOS и знаю, что между LUW, iSeries и zOS существует много различий в SQL.

Пожалуйста, проверьте кроссплатформенную совместимость. Это очень хороший блог для понимания проблемы: https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/crossplatformsqlrefv4?lang=en

person AngocA    schedule 21.10.2012
comment
Это также может помочь (немного устарело) ibm.com/developerworks/data/ библиотека/техническая статья/db2common - person AngocA; 21.10.2012