powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
26 сообщений из 26, показаны все 2 страниц
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808354
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача вкратце такова:
Имеется DB2/400 V5R2. Нужно реализовать некий атомарный апдейт нескольких таблиц внутри библиотеки (базы).
Т.е. имеется куча insert'ов, update'ов и т.д. - нужно, чтобы они либо все завершились, либо все не завершились, в случае ошибки в одном из запросов.

В TSQL я бы наваячил скрипт типа:
BEGIN TRAN
-- ... здесь insert'ы/update'ы, анализ @@ERROR, ROLLBACK, в случае если не 0 (в нужных случаях)
COMMIT

КАК(???) то же самое сделать в DB2/400?
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808370
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В DB2 транзакция начинается неявно... нет оператора BEGIN TRANSACTION
зото есть SAVEPOINT и COMMIT WORK
Но с AS-кой работать не доводилось. Если вы коннектитесь к ней с какой-нить машины (с виндузов, линуксов, юниксов) через CLP то уберите автокоммит:
db2 -c-
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808445
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
                         Run SQL Statements (RUNSQLSTM)                         
                                                                                
 Type choices, press Enter.                                                     
                                                                                
 Source file  . . . . . . . . . . > S             Name                          
   Library  . . . . . . . . . . .     *LIBL       Name, *LIBL, *CURLIB          
 Source member  . . . . . . . . . > S             Name                          
  Commitment control . . . . . . .   *CHG          *CHG, *ALL, *CS, *NONE...   
 Naming . . .  ................................................................ 
               :              Commitment control (COMMIT) - Help              : 
               :                                                              : 
               :  Specifies whether SQL statements are run under commitment   : 
               :  control.                                                    : 
               :                                                              : 
               :  The possible values are:                                    : 
               :                                                              : 
               :  *CHG or *UR                                                 : 
               :      Specifies the objects referred to in SQL ALTER, CALL,   : 
               :      COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME, and  : 
               :                                                     More...  : 
               :  F2=Extended help   F10=Move to top        F12=Cancel        : 
 F3=Exit   F4= :  F13=Information Assistant   F20=Enlarge   F24=More keys     : 
 F13=How to us :                                                              : 
               :..............................................................: 
вроде это опция.
из головы вылетело.
еще поспотри комаду strcmtctl.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808462
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanВ DB2 транзакция начинается неявно... нет оператора BEGIN TRANSACTION
зото есть SAVEPOINT и COMMIT WORK
Но с AS-кой работать не доводилось. Если вы коннектитесь к ней с какой-нить машины (с виндузов, линуксов, юниксов) через CLP то уберите автокоммит:
db2 -c-
Хмм... Нужно посмотреть... Но чего-то не помню я такой косточки

Да я нашел в хелпе Commit и Rollback, но
1. Не нашел, как оформить в несколько запросов в пакет (можно через ; а как управлять выполнением скрипта?)
2. Как проанализировать состояние выполнения запроса?
3. Как ее, транзакцию, начать??

NewYear, в принципе, я собираюсь пускать этот запрос не с зеленого экрана, а по ODBC. Поэтому нужен текст не на CL, а в виде SQL скрипта, если это возможно. Либо каким другим способом, (SP написать???), но чтобы это действие можно было запустить по ODBC.

Я слишком привык к TSQL и мыслю его категориями...
Народ, киньте пример... Задача разовая, и, в принципе несложная, но уже 2 дня убил и нифига :(
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808468
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причем CL? RUNSQLSTM запускает SQL скрипт. не нравится зеленый экран -- дело ваше. через ODBC см. ответ gardenman.


>2. Как проанализировать состояние выполнения запроса?
в скрипте??? посмотреть в лог. если необходимо, откатите все изменения.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808908
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uagg gardenmanВ DB2 транзакция начинается неявно... нет оператора BEGIN TRANSACTION
зото есть SAVEPOINT и COMMIT WORK
Но с AS-кой работать не доводилось. Если вы коннектитесь к ней с какой-нить машины (с виндузов, линуксов, юниксов) через CLP то уберите автокоммит:
db2 -c-
Хмм... Нужно посмотреть... Но чего-то не помню я такой косточки

Да я нашел в хелпе Commit и Rollback, но
1. Не нашел, как оформить в несколько запросов в пакет (можно через ; а как управлять выполнением скрипта?)
2. Как проанализировать состояние выполнения запроса?
3. Как ее, транзакцию, начать??

NewYear, в принципе, я собираюсь пускать этот запрос не с зеленого экрана, а по ODBC. Поэтому нужен текст не на CL, а в виде SQL скрипта, если это возможно. Либо каким другим способом, (SP написать???), но чтобы это действие можно было запустить по ODBC.

Я слишком привык к TSQL и мыслю его категориями...

Народ, киньте пример... Задача разовая, и, в принципе несложная, но уже 2 дня убил и нифига :(


У DB2 есть две похожие вещи - это хранимые процедуры и COMPOUND SQL:
Для качественного выполнения скрипта неплохо было бы задать разделитель между выражениями. У меня это сделано так:
В Far Manager для файлов *.sql прописал такую вещь:
Код: plaintext
1.
d:\sqllib\bin\db2clpex.exe db2 -с- -z !.log -td@ -v -f !.!
ну типа будет выполняться
db2 -z myfile.log -td@ -v -f myfile.sql
где @ - разделитель между командами
myfile.sql - файл со скриптом
myfile.log - результат выполнения

соорудите скрипт в таком виде:

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
-- посмотрим какие у нас базы данных есть
list db directory@
--подконнектимся к test2
connect to test2 user db2admin using ibmdb2@

drop table test@
commit@

create table test (id integer) @

commit work@

insert into test (id) values ( 1 ),( 2 ),( 3 )@

delete from test where id= 2 @
commit@


select * from test@

create unique index Itest on test (id)
@

commit
@
--а вот это уже составной SQL оператор,
--все выражения в котором должны либо выполниться полностью, либо должен 
--произойти откат

begin atomic
	insert into test (id) values ( 4 );
	insert into test (id) values ( 5 );
	--делаем намеренно ошибку
	insert into test (id) values ( 1 );
end
@

commit@

--здесь будет видно что все изменения сделанные COMPOUNDSQL
--откатились несмотря на коммит
select * from test@
commit@

результат:

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
list db directory

 Каталог системных баз данных

 Число записей в каталоге            =  2 

Запись базы данных  1 :

 Алиас базы данных               = TEST
 Имя базы данных             = TEST
 Диск базы данных                = D:\DB2
 Выпуск базы данных                                      = a. 00 
 Комментарии                             =
 Номер раздела базы данных каталога            =  0 

Запись базы данных  2 :

 Алиас базы данных               = TEST2
 Имя базы данных             = TEST2
 Диск базы данных                = D:\DB2
 Выпуск базы данных                                      = a. 00 
 Комментарии                             =
 Номер раздела базы данных каталога            =  0 

connect to test2 user db2admin using       

   Информация соединения с базой данных

 Сервер баз данных           = DB2/NT  8 . 2 . 0 
 ID авторизации SQL          = DB2ADMIN
 Алиас локальной базы данных = TEST2


drop table test
DB20000I  Команда SQL выполнена успешно.

commit
DB20000I  Команда SQL выполнена успешно.

create table test (id integer) 
DB20000I  Команда SQL выполнена успешно.

commit work
DB20000I  Команда SQL выполнена успешно.

insert into test (id) values ( 1 ),( 2 ),( 3 )
DB20000I  Команда SQL выполнена успешно.

delete from test where id= 2 
DB20000I  Команда SQL выполнена успешно.

commit
DB20000I  Команда SQL выполнена успешно.

select * from test

ID         
-----------
           1 
           3 

   2  записей выбрано.


create unique index Itest on test (id)
DB20000I  Команда SQL выполнена успешно.

commit
DB20000I  Команда SQL выполнена успешно.

begin atomic
	insert into test (id) values ( 4 );
	insert into test (id) values ( 5 );
	--делаем намеренно ошибку
	insert into test (id) values ( 1 );
end

DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0803N  Одно или несколько значений в операторе INSERT, в операторе UPDATE 
или при обновлении внешнего ключа, вызванном оператором DELETE, недопустимы, 
поскольку первичный ключ, ограничение уникальности или индекс уникальности "1" 
запрещают повторение строк для этих столбцов в таблице "DB2ADMIN.TEST".  
SQLSTATE= 23505 

commit
DB20000I  Команда SQL выполнена успешно.

select * from test

ID         
-----------
           1 
           3 

...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32808912
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще рекомендую посмотреть такую фичу как SELECT (DML), правда не знаю у вас на AS/400 она подерживается или нет. Полезная фича.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32812762
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде не аэске нет begin ATOMIC.
что-то похожее есть , можно запустить транзакцию внутри новой или именованной ACTIVATION GROUP (OS/400 фича)

впрочем, не помню.
Код: plaintext
1.
2.
3.
4.
--strsql
> begin atomic                                                     
  Token ATOMIC was not valid. Valid tokens: DECLARE.               
> begin atomic                                                     
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32812834
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хмм... Нашел несколько интересных вещей.
Во-первых, на AS/400 до тех пор, пока не включено журналирование на соответствующей схеме (это там так БД называются) - никаких транзакций не будет. Даже операции insert/update множества записей, похоже, не атомарны.
Команда (CL, с зеленого экрана) crtlib никакой схемы журналирования не предусматривает, и, соответственно, транзакций нету. Вообще.
(Поэтому мне не удалось получить нужного эффекта методом прямого изнасилования, выполнив методы begintran, commit/rollback объекта ADO.Connection).
А если создать БД с помощью SQL скрипта (create database или create shema) - БД создаётся с подключенной системой журналирования, и всё начинает работать изЮмительно. Это раз, как говориться.
Во-вторых, в DB2/400 версии v5 произошли радикальные изменения в сравнении с v4. Появился скриптовый SQL очень похожий на TSQL, и где-то даже более логичный (тем не менее требующий с непривычки диких усилий). Например - можно создавать на скриптовом SQL UDF, возвращающие таблицы. Но я полдня убил, прежде чем понял, как использовать их в запросе. [где то с 10-го раза увидел, что в описание синтаксиса команды одно из слов не стоит в скобкак, т.е. является обизательным модификатором. Т.е. Select * from ( table (myUDF(1,2))) as a ]
В-третьих DB2 UDB и DB2/400 - вещи, которые похожи разве что названием. Это я понял, когда пытался применить хелп одного к другому. И atomic там нету :(
В-четвертых, как начинать транзакцию явно внутри скрипта так и не нашел, так что вопрос по прежнему актуален.
:)
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32813822
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32813843
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.redbooks.ibm.com/redbooks/pdfs/sg246503.pdf
Как раз про вашу версию
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815221
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Команда (CL, с зеленого экрана) crtlib никакой схемы журналирования не предусматривает, и, соответственно, транзакций нету. Вообще.

тогда нужно еще 3 команды ввести с зеленого экрана:
crtjrnrcvr, crtjrn, strjrnpf


транзакцию явно открывать внутри скрипта не нужно.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815230
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>транзакцию явно открывать внутри скрипта не нужно.

если с зеленого экрана в runsqlstm нужно указать параметр COMMIT отличный от *NONE, или можно предварительно запустить команду strcmtstl
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815245
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>это там так БД называются
это там schema DB2 for Workstarion так называется. термин DB2/400 -- 'collection'

c помощья sql создается 'create collection'
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815370
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thnks, gardenman. Будем посмотрять. Самое обидное, что теоретически вся сопутствующая документация есть. Однако, с какой стороны ее обкусывать...
Блин... BOL просто на порядок удобнее и вразумительнее. Хотя и не так мелочно-подробна.

NewYearТогда нужно еще 3 команды ввести с зеленого экрана:
crtjrnrcvr, crtjrn, strjrnpf.
Угу. Я это нашел. Однако проще SQL Create Database, а потом настроить параметры вручную в ON мышкой :-)

NewYear>транзакцию явно открывать внутри скрипта не нужно.
если с зеленого экрана в runsqlstm нужно указать параметр COMMIT отличный от *NONE, или можно предварительно запустить команду strcmtstl
Да, это тоже понял. Только AS/400 там в "серверном" варианте, запускать запросы с зеленого экрана нельзя. (Т.е. можно, но сразу запускается паразитное задание отжирающее 90% процессора).
Впрочем, задача в любом случае не в этом.

NewYear>это там так БД называются
это там schema DB2 for Workstarion так называется. термин DB2/400 -- 'collection'

c помощья sql создается 'create collection'
Не-а. Насколько я понял, в V5 уже переиграли. По крайней мере 'create collection' не срабатывает. Впрочем Create Database нормально срабатывало всегда.

Спасибо! :-)
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815389
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
                              Enter SQL Statements                              
                                                                                
 Type SQL statement, press Enter.                                               
    > create collection test                                                    
      Collection TEST created.                                                  
 ===>                                                                           
                                                                                
                                                                                
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815438
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А версия какая? То, что эта штука работала на V4r5, к примеру, я в курсе :-)
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815441
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Впрочем, может я collection с ошибкой набрал, и не стал разбираться.

Но Create Shema и Create Database - точно работает. И, самое главное - когда в Навигаторе заказываешь скрипт библиотеки - она генерит базу как Create Shema.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32815442
uagg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS: И в доке по SQL v5r2 create collection уже нет.
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32817473
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде 5.2.
я так говорю потому что давно не слежу что тут на аэске.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                      Display Installed Licensed Programs            
                                                             System: 
 Licensed  Installed                                                 
 Program   Status       Description                                  
 5722SS1   *COMPATIBLE  OS/400 - Library QGPL                        
 5722SS1   *COMPATIBLE  OS/400 - Library QUSRSYS                     
 5722SS1   *COMPATIBLE  Operating System/400                         
 5722SS1   *COMPATIBLE  OS/400 - Extended Base Support               
 5722SS1   *COMPATIBLE  OS/400 - Online Information                  
 5722SS1   *COMPATIBLE  OS/400 - Extended Base Directory Support     
 5722SS1   *COMPATIBLE  OS/400 - Host Servers                        
 5722SS1   *COMPATIBLE  OS/400 - System Openness Includes            
 5722SS1   *COMPATIBLE  OS/400 - ObjectConnect                       
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32817476
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не. это 5.3
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32817482
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, это не так делается. может, завтра вспомню
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32817928
sergio2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А с винды достучаться можна до DB2/400 V5R2 ?

Извиняйте за глупый вопрос .
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32818020
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого нужно установить DB2 Connect
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32818233
sergio2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я к чему веду , я некада неработал с DB2/400 , ну если к ней можно достучаться исползуя db2cli.dll, а также исполюзуя dbexpdb2.dll - это библиотека с копонент dbExpres прямого доступак БД IBM ДБ2 , то я пишу прогу "DB2 Commander" , у нее на текущую версию имеется:
1. Редактор запросов - SQL Editor
2. Построитель запросов - SQL Builder
3. Редактор скриптов - Script Editor
4. Менеджер связей -
Ели кто работал с IBExpert . эт чете похожее и я написал.

Используя ее можно с лехкостю решить проблему описаную в даной теме.

Текущая версия DB2 Commander v1.0.4.1 , нормально работает под IBM ДБ2 в8.1 и ОС ХР

Ели кто заинтересовался то пишите
...
Рейтинг: 0 / 0
Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
    #32818517
Nikolay Kulikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это кончено прикольно. Но мы ждем новые plug-ins от лаборатории для Eclipse....
В которых обещается вся функциональность Development Center + часть функциональности СС которые будут включать всякие визарды по созданию таблиц, view, Триггеров. Также ходЮт слухи что там будет некоторое ER моделирование, типа как ервин но не до конца...
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Help!! Как реализовать тразакцию в SQL скрипте для DB2/400?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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