Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
Всем доброе время суток.

C DB2 почти не работал.
Не могу решить следующую задачу.
Есть таблица:
CREATE TABLE "SHL "."NSTOCK" (
"ID" INTEGER NOT NULL ,
"GROUPID" INTEGER NOT NULL ,
"CATALOGNO" CHAR(24) NOT NULL ,
"CATALOGMOPAR" CHAR(24) WITH DEFAULT ,
"NAMER" CHAR(100) WITH DEFAULT ,
"NAMEA" CHAR(100) WITH DEFAULT ,
"SALE" DOUBLE WITH DEFAULT ,
"MODEL" CHAR(5) NOT NULL WITH DEFAULT ,
"ISCONST" CHAR(1) NOT NULL ,
"WARRANTYTYPE" SMALLINT ,
"WARRANTY" INTEGER ,
"SELFCOST" DOUBLE WITH DEFAULT ,
"HASIMAGE1" INTEGER WITH DEFAULT ,
"HASIMAGE2" INTEGER WITH DEFAULT ,
"HASDESC" INTEGER WITH DEFAULT ,
"VES" DOUBLE WITH DEFAULT ,
"NU" INTEGER WITH DEFAULT ,
"HANDCOST" CHAR(1) NOT NULL WITH DEFAULT 'N' ,
"COUNTRYCOUNT" INTEGER WITH DEFAULT ,
"SSLCNT" INTEGER WITH DEFAULT ,
"STIMCNT" INTEGER WITH DEFAULT ,
"MAKERID" INTEGER ,
"ANCNT" INTEGER WITH DEFAULT ,
"CCID" INTEGER )
IN "USERSPACE1" ;

CREATE INDEX "SHL "."NS_GID" ON "SHL "."NSTOCK"
("GROUPID" ASC,
"ID" ASC)
DISALLOW REVERSE SCANS;


CREATE INDEX "SHL "."NST_C_D" ON "SHL "."NSTOCK"
("CATALOGNO" DESC)
DISALLOW REVERSE SCANS;

CREATE INDEX "SHL "."NSTGSI" ON "SHL "."NSTOCK"
("GROUPID" ASC,
"SALE" ASC,
"ID" ASC)
DISALLOW REVERSE SCANS;

CREATE INDEX "SHL "."NSTIDD" ON "SHL "."NSTOCK"
("ID" DESC)
DISALLOW REVERSE SCANS;

CREATE UNIQUE INDEX "SHL "."NSTOCKBYCATALOG" ON "SHL "."NSTOCK"
("CATALOGNO" ASC)
DISALLOW REVERSE SCANS;

CREATE INDEX "SHL "."NSTOCKBYGROUPS" ON "SHL "."NSTOCK"
("GROUPID" ASC)
DISALLOW REVERSE SCANS;

ALTER TABLE "SHL "."NSTOCK"
ADD PRIMARY KEY
("ID");

Необходимо обновить поля GROUPID, SALE и SELFCOST по полю CATALOGNO из mdb.
Притом в mdb есть записи которых нет в таблице NSTOCK.

1. Пытаюсь сделать это с помощь LOAD, но не знаю как указать, чтобы данные обновлялись по полю CATALOGNO.
2. Не знаю как выполнить это из php. Я так понимаю что надо делать это через CLP, но положительного результата так и не добился
15 янв 09, 18:19    [6692990]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
из mdb генерирую предварительно файл:
000010006 33 33 0.83 1.57
000010006E 33 33 21.61 41.05
000010007F 33 33 44.92 85.35
000010018C 33 33 85.38 162.23
000010230A 33 33 61.87 117.55
000097059B 26 33 488.89 958.22
000098650 29 29 371.39 724.22
000098651 29 29 371.39 724.22
...
15 янв 09, 18:21    [6692993]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Добрый день.

Создаете таблицу для загрузки из файла (1 раз, дальше можно её постоянно использовать):
create table shl.mdb_tmp (
"GROUPID" INTEGER NOT NULL ,
"CATALOGNO" CHAR(24) NOT NULL ,
"SALE" DOUBLE WITH DEFAULT ,
"SELFCOST" DOUBLE WITH DEFAULT
) in userspace1;
1. Кладёте файл mdb.txt на сервер. Используйте в качестве разделителя полей в нём какой-нибудь другой символ вместо пробела (например |).
2.
CALL ADMIN_CMD('load from full_path\mdb.txt of del modified by coldel| method p(1,3,4,5) replace into shl.mdb_tmp(CATALOGNO, GROUPID, SALE, SELFCOST) nonrecoverable')
3.
MERGE INTO "SHL "."NSTOCK" B USING shl.mdb_tmp T ON B.CATALOGNO=T.CATALOGNO
WHEN MATCHED THEN UPDATE SET (GROUPID, SALE, SELFCOST)=(T.GROUPID, T.SALE, T.SELFCOST)
16 янв 09, 10:53    [6694999]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
В файле [TAB], просто так скопировалось.

Возможно я что-то не правильно понимаю.
пробовал запросы:
1. CALL ADMIN_CMD('load from full_path\mdb.txt of del modified by coldel0x09 method p(2, 3, 4, 5, 6, 7, 1) replace into shl.mdb_tmp(CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) nonrecoverable')

2. LOAD CLIENT FROM "Z:\home\sitevw.ru\www\dataInNstock.ls" OF DEL MODIFIED BY COLDEL0x09 METHOD P (2, 3, 4, 5, 6, 7, 1) MESSAGES "Z:\home\sitevw.ru\www\price\log.ls" REPLACE INTO SHL.LOADPRICE (CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) NONRECOVERABLE

3. CALL ADMIN_CMD('LOAD CLIENT FROM "Z:\home\sitevw.ru\www\dataInNstock.ls" OF DEL MODIFIED BY COLDEL0x09 METHOD P (2, 3, 4, 5, 6, 7, 1) MESSAGES "Z:\home\sitevw.ru\www\price\log.ls" REPLACE INTO SHL.LOADPRICE (CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) NONRECOVERABLE')

запрос выполняю с помощью $stmt = db2_exec($connDB2, $sql) в PHP, но результат:
Warning: db2_exec() [function.db2-exec]: Statement Execute Failed in Z:\home\sitevw.ru\www\load.php on line 9


и возможно ли обновлять данные сразу в двух таблицах:

CREATE TABLE "SHL"."STOCKCOST" (
"STOCKID" INTEGER NOT NULL ,
"CUSTCLASSID" SMALLINT NOT NULL ,
"COST1" DOUBLE WITH DEFAULT ,
"COST2" DOUBLE WITH DEFAULT ,
"COST3" DOUBLE WITH DEFAULT ,
"COST4" DOUBLE WITH DEFAULT ,
"COST5" DOUBLE WITH DEFAULT )
IN "USERSPACE1" ;
и указанную ранее
16 янв 09, 14:47    [6696998]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
L0gica
Возможно я что-то не правильно понимаю.
пробовал запросы:...

Какой результат выполнения первых 2-х команд?
3-я не будет работать, т.к. хранимая процедура не может работать с файлами на клиенте и предложение messages - не правильное.
LOAD command using the ADMIN_CMD procedure.
Т.е. если вы захотите с локальной машины грузить файлы, то это можно делать из командной строки клиента, а не хранимой процедурой.
L0gica
и возможно ли обновлять данные сразу в двух таблицах:

CREATE TABLE "SHL"."STOCKCOST" (
"STOCKID" INTEGER NOT NULL ,
"CUSTCLASSID" SMALLINT NOT NULL ,
"COST1" DOUBLE WITH DEFAULT ,
"COST2" DOUBLE WITH DEFAULT ,
"COST3" DOUBLE WITH DEFAULT ,
"COST4" DOUBLE WITH DEFAULT ,
"COST5" DOUBLE WITH DEFAULT )
IN "USERSPACE1" ;
и указанную ранее
Если я правильно понял вопрос, то ничто не мешает использовать однажды прогруженную временную таблицу SHL.LOADPRICE несколько раз.
16 янв 09, 15:55    [6697563]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
<?php
include($HTTP_SERVER_VARS['DOCUMENT_ROOT']."/include/db2.inc.php");

$connDB2 = connectDB2('CMS');

$sql = "CALL ADMIN_CMD('LOAD FROM \"C:\LoadPrice\dataInNstock.ls\" OF DEL MODIFIED BY COLDEL0x09 METHOD P (2, 3, 4, 5, 6, 7, 1) REPLACE INTO SHL.LOADPRICE (CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) NONRECOVERABLE')";
$stmt = db2_exec($connDB2, $sql);
db2_free_stmt($stmt);
closeBB2($connDB2);
?>

результат:
Warning: db2_exec() [function.db2-exec]: Statement Execute Failed in Z:\home\sitevw.ru\www\load.php on line 7


а другой вопрос был про возможность в одном запросе обновлять данные в двух таблицах:
GROUPID и SALE по CATALOGNO
CREATE TABLE "SHL "."NSTOCK" (
"ID" INTEGER NOT NULL , 
"GROUPID" INTEGER NOT NULL , 
"CATALOGNO" CHAR(24) NOT NULL , 
"CATALOGMOPAR" CHAR(24) WITH DEFAULT , 
"NAMER" CHAR(100) WITH DEFAULT , 
"NAMEA" CHAR(100) WITH DEFAULT , 
"SALE" DOUBLE WITH DEFAULT , 
"MODEL" CHAR(5) NOT NULL WITH DEFAULT , 
"ISCONST" CHAR(1) NOT NULL , 
"WARRANTYTYPE" SMALLINT , 
"WARRANTY" INTEGER , 
"SELFCOST" DOUBLE WITH DEFAULT , 
"HASIMAGE1" INTEGER WITH DEFAULT , 
"HASIMAGE2" INTEGER WITH DEFAULT , 
"HASDESC" INTEGER WITH DEFAULT , 
"VES" DOUBLE WITH DEFAULT , 
"NU" INTEGER WITH DEFAULT , 
"HANDCOST" CHAR(1) NOT NULL WITH DEFAULT 'N' , 
"COUNTRYCOUNT" INTEGER WITH DEFAULT , 
"SSLCNT" INTEGER WITH DEFAULT , 
"STIMCNT" INTEGER WITH DEFAULT , 
"MAKERID" INTEGER , 
"ANCNT" INTEGER WITH DEFAULT , 
"CCID" INTEGER ) 
IN "USERSPACE1" ; 

и

COST1, по STOCKID
для CUSTCLASSID = 1 COST1 = COST1
для CUSTCLASSID = 2 COST1 = COST2
для CUSTCLASSID = 3 COST1 = COST3


CREATE TABLE "SHL"."STOCKCOST" (
"STOCKID" INTEGER NOT NULL , 
"CUSTCLASSID" SMALLINT NOT NULL , 
"COST1" DOUBLE WITH DEFAULT , 
"COST2" DOUBLE WITH DEFAULT , 
"COST3" DOUBLE WITH DEFAULT , 
"COST4" DOUBLE WITH DEFAULT , 
"COST5" DOUBLE WITH DEFAULT ) 
IN "USERSPACE1" ; 

исходный файл чуть изменился:
STOCKID___CATALOGNO____OLDGROUPID_NEWGROUPID__COST1_____COST2______COST3
130015____000300043 X____33_________33___________171729.06__326285.21___188901.96
130016____000300043A_____33_________33___________71729.06___326285.21___188901.96
130017____000300043AX____33_________33___________171729.06__326285.21___188901.96
130018____000300043BX____33_________33___________171729.06__326285.21___188901.96


[TAB] заменил на _ для корректного отображения здесь
16 янв 09, 17:06    [6698253]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
L0gica,

Вы можете на сервере из db2cmd выполнить 2 команды:
db2 connect to your_db_name user ... using ...

db2 CALL ADMIN_CMD('LOAD FROM C:\LoadPrice\dataInNstock.ls OF DEL MODIFIED BY COLDEL0x09 METHOD P (2, 3, 4, 5, 6, 7, 1) REPLACE INTO SHL.LOADPRICE (CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) NONRECOVERABLE')
?
Что вернет последняя команда?
16 янв 09, 17:41    [6698583]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
тоже самое, что и при выполнении через центр управления:

  Набор результатов 1
--------------

ROWS_READ ROWS_SKIPPED ROWS_LOADED ROWS_REJECTED ROWS_DELETED ROWS_COMMITTED ROWS_PARTITIONED NUM_AGENTINFO_ENTRIES MSG_RETRIEVAL MSG_REMOVAL
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
398024 0 398024 0 0 398024 - - - -

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

Статус возврата = 0
16 янв 09, 18:03    [6698736]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
У меня с db2 v9.1.6a и

>php -v
PHP 5.2.6 (cli) (built: May 2 2008 18:02:07)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

<?php
$database = 'sample';
$user = '***';
$password = '***';
$conn = db2_connect($database, $user, $password);
if ($conn) {
   $sql = "CALL ADMIN_CMD('load from \"full_path\mdb.txt\" of del modified by coldel| method p(1,3,4,5) replace into shl.mdb_tmp(CATALOGNO, GROUPID, SALE, SELFCOST) nonrecoverable')";
   if (!db2_exec($conn, $sql))
     printf("Load failed.\n%s\n", db2_conn_errormsg());
   db2_close($conn);
}
else {
   printf("Connection failed.\n%s\n", db2_conn_errormsg());
}
?>
нормально грузит файл в таблицу.
19 янв 09, 12:40    [6704197]     Ответить | Цитировать Сообщить модератору
 Re: Обновление таблицы из mdb  [new]
L0gica
Member

Откуда:
Сообщений: 25
<?php
include($HTTP_SERVER_VARS['DOCUMENT_ROOT']."/include/db2.inc.php");

$connDB2 = connectDB2('CMS');

if ($connDB2) {
	$sql = "CALL ADMIN_CMD('LOAD FROM \"C:\LoadPrice\dataInNstock.ls\" OF DEL MODIFIED BY COLDEL0x09 METHOD P (2, 3, 4, 5, 6, 7, 1) REPLACE INTO SHL.LOADPRICE (CATALOGNO, NEWGROUPID, OLDGROUPID, COST1, COST2, COST3, STOCKID) NONRECOVERABLE')";
	if (!db2_exec($connDB2, $sql)) {
		printf("Load failed.\n%s\n", db2_conn_errormsg());
		db2_close($connDB2);
	}
} else {
	printf("Connection failed.\n%s\n", db2_conn_errormsg());
}
?>

Warning: db2_exec() [function.db2-exec]: Statement Execute Failed in Z:\home\sitevw.ru\www\load.php on line 8
Load failed.

У меня скрипт выполняется не на сервере с db2
19 янв 09, 13:13    [6704429]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить