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

Откуда: Novosibirsk
Сообщений: 132
всем доброго времени суток!

как установить размер привязываемого параметра для db2_bind_param ?
по-умолчанию размер строкового параметра не более 1МБ
bool db2_bind_param  ( 
   resource $stmt  , 
   int $parameter-number  , 
   string $variable-name  
   [, int $parameter-type  [, int $data-type = 0  [, int $precision = -1  [, int $scale = 0  ]]]] )
ru2.php.net
precision

Specifies the precision with which the variable should be bound to the database. This parameter can also be used for retrieving XML output values from stored procedures. A non-negative value specifies the maximum size of the XML data that will be retrieved from the database. If this parameter is not used, a default of 1MB will be assumed for retrieving the XML output value from the stored procedure.

при попытке выполнить привязку параметра
$sql = "INSERT INTO NULLID.XML_INPUT (FROM_FILE,XML_DATA)
   			VALUES ( '$fname',XMLPARSE(
   					 document cast(? as Clob) preserve whitespace
                   			  )
   		  		    )";
$stmt = db2_prepare($conn, $sql);
$XMLDataString = $xml_source;
if(db2_bind_param($stmt, 1, "XMLDataString", DB2_PARAM_IN) === false) {		    
    print_r (db2_stmt_errormsg());
выдает сообщение об ошибке
[IBM][CLI Driver] CLI0131E Недопустимая длина строки или буфера. SQLSTATE=HY090 SQLCODE=-99999

ни в примерах, ни в доках нигде не нашел путей решения проблемы... :(
27 авг 10, 10:57    [9335715]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,

Какая версия DB2 ? В состав какого решения входит ?

С уважением,
Вадим.
27 авг 10, 12:35    [9336830]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,

Попробуй через файл ...
db2_bind_param( ...., DB2_PARAM_FILE)

<?php
$stmt = db2_prepare($conn, "INSERT INTO animal_pictures(picture) VALUES (?)");

$picture = "/opt/albums/spook/grooming.jpg";
$rc = db2_bind_param($stmt, 1, "picture", DB2_PARAM_FILE);
$rc = db2_execute($stmt);
?>

С уважением,
Вадим.
27 авг 10, 12:46    [9336926]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
GVF112GVF

Какая версия DB2 ? В состав какого решения входит ?

DB2 LUW 9.7 express-c

GVF112GVF

Попробуй через файл ...
db2_bind_param( ...., DB2_PARAM_FILE)

<?php
$stmt = db2_prepare($conn, "INSERT INTO animal_pictures(picture) VALUES (?)");

$picture = "/opt/albums/spook/grooming.jpg";
$rc = db2_bind_param($stmt, 1, "picture", DB2_PARAM_FILE);
$rc = db2_execute($stmt);
?>

предварительно сделал сохранение текстовой переменной во временный файл
$filename = "C:\\work\\xml_data\\tmp$fname";
$file1 = fopen($filename,'w');
fwrite($file1,$XMLDataString);
fclose($file1);
//echo $filename;
if(db2_bind_param($stmt, 1, "filename", DB2_PARAM_FILE) === false) {	
увы - "не выходит каменный цветок..."
XML[IBM][CLI Driver][DB2/NT] SQL0302N 
Значение переменной хоста, заданной в операторе EXECUTE или OPEN, 
вне диапазона для предполагаемого использования. SQLSTATE=22001 SQLCODE=-302
27 авг 10, 13:17    [9337243]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,

Посмотри здесь: DB2 Viper
http://www.ibm.com/developerworks/data/library/techarticle/dm-0511singh/


Create a database connection
$conn =db2_connect($dbname, $dbuser, $dbpass);

Open the document from the file into a variable
$fileContents = file_get_contents("products/p1.xml");

Create a simple XML object from this variable
$dom = simplexml_load_string($fileContents);

Extract the product ID from the document
$prodID = (string) $dom["pid"];

Create a prepared statement to insert the XML document into the database
$stmt =db2_prepare($conn, "INSERT INTO xmlproduct VALUES (?, ?)");


Pass the product ID extracted from the document along with the document as a parameter to the query

db2_execute($stmt, array($prodID, $fileContents);

С уважением,
Вадим.
27 авг 10, 18:54    [9340202]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,


PS:

DB2 9 pureXML Guide
http://www.redbooks.ibm.com/redbooks/pdfs/sg247315.pdf

DB2 Express-C: The Developer Handbook for XML, PHP, C/C++, Java, and .NET
http://www.redbooks.ibm.com/redbooks/pdfs/sg247301.pdf

С уважением,
Вадим.
27 авг 10, 19:04    [9340245]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk
всем доброго времени суток!

как установить размер привязываемого параметра для db2_bind_param ?
по-умолчанию размер строкового параметра не более 1МБ
bool db2_bind_param  ( 
   resource $stmt  , 
   int $parameter-number  , 
   string $variable-name  
   [, int $parameter-type  [, int $data-type = 0  [, int $precision = -1  [, int $scale = 0  ]]]] )
ru2.php.net
precision

Specifies the precision with which the variable should be bound to the database. This parameter can also be used for retrieving XML output values from stored procedures. A non-negative value specifies the maximum size of the XML data that will be retrieved from the database. If this parameter is not used, a default of 1MB will be assumed for retrieving the XML output value from the stored procedure.

при попытке выполнить привязку параметра
$sql = "INSERT INTO NULLID.XML_INPUT (FROM_FILE,XML_DATA)
   			VALUES ( '$fname',XMLPARSE(
   					 document cast(? as Clob) preserve whitespace
                   			  )
   		  		    )";
$stmt = db2_prepare($conn, $sql);
$XMLDataString = $xml_source;
if(db2_bind_param($stmt, 1, "XMLDataString", DB2_PARAM_IN) === false) {		    
    print_r (db2_stmt_errormsg());
выдает сообщение об ошибке
[IBM][CLI Driver] CLI0131E Недопустимая длина строки или буфера. SQLSTATE=HY090 SQLCODE=-99999

ни в примерах, ни в доках нигде не нашел путей решения проблемы... :(


Не уверен что поможет,
можно попробывать увеличить значение параметра- (rqrioblk), сlient I/O block size configuration parameter.

С уважением,
Вадим.
28 авг 10, 10:24    [9342192]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
GVF112GVF


Не уверен что поможет,
можно попробывать увеличить значение параметра- (rqrioblk), сlient I/O block size configuration parameter.

С уважением,
Вадим.


ПХП - таки open-source... :)
смотрю в исходниках
там есть любопытный кусок кода
PHP_FUNCTION(db2_bind_param)
{
	char *varname = NULL;
	int argc = ZEND_NUM_ARGS();
	int stmt_id = -1;
	int varname_len;
	long param_type; /* set default here */
	/* LONG types used for data being passed in */
	long param_no = 0;
	long data_type = 0;
	long precision = -1;
	long scale = 0;

        ...
		switch (argc) {
			/* if argc == 3, then the default value for param_type will be used */
			case 3:
				param_type = DB2_PARAM_IN;
				/* Fall through */

			/* Otherwise, param_type will contain the value passed in */
			case 4:
			case 5:
			case 6:
				/* No param data specified */
                                ....
				if((sql_data_type == SQL_XML) && ((param_type == DB2_PARAM_OUT) || (param_type == DB2_PARAM_INOUT)))
				{
					if(precision < 0)
					{
						sql_precision = 1048576;
					}
					else
					{
						sql_precision = (SQLUINTEGER)precision;
					}
				}
полагаю, что нужно попробовать через хранимую процедуру, т.к. на insert DB2_PARAM_INOUT никак не пойдет
в примерах в исходниках есть что-то подобное...
    $stmt = db2_prepare($dbconn, 'CALL test_xml2(?, ?, ?, ?, ?, ?)');
    $xmlResult1 = '';
    $xmlResult2 = '';
    $xmlResult3 = '';
    $xmlResult4 = '';
    $xmlResult5 = '';
    $xmlResult6 = '';

    db2_bind_param($stmt, 1, "xmlResult1", DB2_PARAM_IN, DB2_XML, 2);
    db2_bind_param($stmt, 2, "xmlResult2", DB2_PARAM_IN, DB2_XML, 5, 3);
    db2_bind_param($stmt, 3, "xmlResult3", DB2_PARAM_OUT, DB2_XML, 5);
    db2_bind_param($stmt, 4, "xmlResult4", DB2_PARAM_OUT, DB2_XML, -1, 10);
    db2_bind_param($stmt, 5, "xmlResult5", DB2_PARAM_INOUT, DB2_XML, 0, 4);
    db2_bind_param($stmt, 6, "xmlResult6", DB2_PARAM_INOUT, DB2_XML, 2, 4);
    $res = db2_execute($stmt);
    if (!$res) {
        echo db2_stmt_errormsg();
    }
28 авг 10, 11:09    [9342259]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
однако, как оказалось, не всё так просто...

посмотрел пример создания хранимой процедуры с использованием функций поддержки XML

попробовал создать подобное в редакторе команд...
ан нет!
автор
SQL0440N Не найдено доступной подпрограммы "XMLPARSE" типа "FUNCTION


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

Сервер баз данных = DB2/NT 9.7.2
ID авторизации SQL = USER
Алиас локальной базы данных = SAMPLE
28 авг 10, 11:58    [9342355]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk
GVF112GVF


Не уверен что поможет,
можно попробывать увеличить значение параметра- (rqrioblk), сlient I/O block size configuration parameter.

С уважением,
Вадим.


ПХП - таки open-source... :)
смотрю в исходниках
там есть любопытный кусок кода
PHP_FUNCTION(db2_bind_param)
{
	char *varname = NULL;
	int argc = ZEND_NUM_ARGS();
	int stmt_id = -1;
	int varname_len;
	long param_type; /* set default here */
	/* LONG types used for data being passed in */
	long param_no = 0;
	long data_type = 0;
	long precision = -1;
	long scale = 0;

        ...
		switch (argc) {
			/* if argc == 3, then the default value for param_type will be used */
			case 3:
				param_type = DB2_PARAM_IN;
				/* Fall through */

			/* Otherwise, param_type will contain the value passed in */
			case 4:
			case 5:
			case 6:
				/* No param data specified */
                                ....
				if((sql_data_type == SQL_XML) && ((param_type == DB2_PARAM_OUT) || (param_type == DB2_PARAM_INOUT)))
				{
					if(precision < 0)
					{
						sql_precision = 1048576;
					}
					else
					{
						sql_precision = (SQLUINTEGER)precision;
					}
				}
полагаю, что нужно попробовать через хранимую процедуру, т.к. на insert DB2_PARAM_INOUT никак не пойдет
в примерах в исходниках есть что-то подобное...
    $stmt = db2_prepare($dbconn, 'CALL test_xml2(?, ?, ?, ?, ?, ?)');
    $xmlResult1 = '';
    $xmlResult2 = '';
    $xmlResult3 = '';
    $xmlResult4 = '';
    $xmlResult5 = '';
    $xmlResult6 = '';

    db2_bind_param($stmt, 1, "xmlResult1", DB2_PARAM_IN, DB2_XML, 2);
    db2_bind_param($stmt, 2, "xmlResult2", DB2_PARAM_IN, DB2_XML, 5, 3);
    db2_bind_param($stmt, 3, "xmlResult3", DB2_PARAM_OUT, DB2_XML, 5);
    db2_bind_param($stmt, 4, "xmlResult4", DB2_PARAM_OUT, DB2_XML, -1, 10);
    db2_bind_param($stmt, 5, "xmlResult5", DB2_PARAM_INOUT, DB2_XML, 0, 4);
    db2_bind_param($stmt, 6, "xmlResult6", DB2_PARAM_INOUT, DB2_XML, 2, 4);
    $res = db2_execute($stmt);
    if (!$res) {
        echo db2_stmt_errormsg();
    }



А что это за параметр - sql_precision = 1048576 ?!
Если его увеличить в два раза .... :)

С уважением,
Вадим.
28 авг 10, 12:20    [9342398]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
FYI ...

precision - Specifies the precision with which the variable should be bound to the database. This parameter can also be used for retrieving XML output values from stored procedures. A non-negative value specifies the maximum size of the XML data that will be retrieved from the database. If this parameter is not used, a default of 1MB will be assumed for retrieving the XML output value from the stored procedure.

http://php.net/manual/en/function.db2-bind-param.php

db2_bind_param ibm_db2 function - Binds a PHP variable to an SQL statement parameter -
http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.php.doc/doc/r0022495.htm

Binding PHP variables to a prepared statement
The SQL statement in the following example uses two input parameters in the WHERE clause. We call db2_bind_param() to bind two PHP variables to the corresponding SQL parameters. Notice that the PHP variables do not have to be declared or assigned before the call to db2_bind_param(); in the example, $lower_limit is assigned a value before the call to db2_bind_param(), but $upper_limit is assigned a value after the call to db2_bind_param(). The variables must be bound and, for parameters that accept input, must have any value assigned, before calling db2_execute().

С уважением,
Вадим.
28 авг 10, 12:32    [9342419]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
GVF112GVF
jack_nsk


ПХП - таки open-source... :)
смотрю в исходниках
там есть любопытный кусок кода
PHP_FUNCTION(db2_bind_param)
{
	long precision = -1;
	long scale = 0;

        ...
		switch (argc) {

			case 6:
				/* No param data specified */
                                ....
				if((sql_data_type == SQL_XML) && ((param_type == DB2_PARAM_OUT) || (param_type == DB2_PARAM_INOUT)))
				{
					if(precision < 0)
					{
						sql_precision = 1048576;
					}
					else
					{
						sql_precision = (SQLUINTEGER)precision;
					}
				}



А что это за параметр - sql_precision = 1048576 ?!
Если его увеличить в два раза .... :)

С уважением,
Вадим.


автор
precision

Specifies the precision with which the variable should be bound to the database. This parameter can also be used for retrieving XML output values from stored procedures. A non-negative value specifies the maximum size of the XML data that will be retrieved from the database. If this parameter is not used, a default of 1MB will be assumed for retrieving the XML output value from the stored procedure.


по-умолчанию, размер привязываемого параметра не более 1МБ...

если только перекомпилировать под линуксом... :)
28 авг 10, 13:48    [9342593]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,

Есть несколько путей решения - простой, сложный и очень сложный.
Труднее всего - найти простой ... и опыт сын ошибок трудных ... :)

Думаю, что проблему можно обойти. Как - решать Вам ... ;)

С уважением,
Вадим.
28 авг 10, 21:04    [9343690]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
jack_nsk
Member

Откуда: Novosibirsk
Сообщений: 132
GVF112GVF
jack_nsk,

Есть несколько путей решения - простой, сложный и очень сложный.
Труднее всего - найти простой ... и опыт сын ошибок трудных ... :)

Думаю, что проблему можно обойти. Как - решать Вам ... ;)

С уважением,
Вадим.


простой путь -
  	  $sql = "INSERT INTO DB2ADMIN.XML_FROM_FILES(FROM_FILE,XML_DATA) 
  	          VALUES('$fname',
  	                  XMLVALIDATE(CAST (? as XML) ACCORDING TO XMLSCHEMA ID DB2ADMIN.myShema)
  	                )";  		    
	  $stmt = db2_prepare($conn, $sql);
	  $XMLDataString = $xml_source;	  
	  if(db2_bind_param($stmt, 1, "XMLDataString") === false) {
:)
29 авг 10, 15:48    [9345303]     Ответить | Цитировать Сообщить модератору
 Re: db2+php+xml-size  [new]
GVF112GVF
Guest
jack_nsk,

Поздравляю с решением задачи!

С уважением,
Вадим.
30 авг 10, 11:58    [9348275]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить