powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / UPDATE XML-поля
3 сообщений из 3, страница 1 из 1
UPDATE XML-поля
    #35164850
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно обновить, н-р, номер сотового телефона в данном примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT * FROM users.users WHERE xpath('/contacts/tel/mobile/text()', contacts)::text='{999-555-555}';
 id_users |   name   | type |                                                                                  contacts       
----------+----------+------+--------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-----
         1  | Пользователь1 |     1  | <contacts><tel><mobile> 999 - 555 - 5555 </mobile><rtel> 30 - 00 - 00 </rtel></tel><mail>user@mail.ru<;/mail>
<im><icq> 377052538 </icq><jabber> 25265678 </jabber></im></contacts>
( 1  row)
Вроде простой вопрос, но с xml только начинаю работать. Подобных запросов много, поэтому желательно найти како-то оптимальный способ.
Или возможно только обновление целиком, кто как в этом случае поступает и имеет ли вообще смысл переводить подобные данные в xml?
Заранее спасибо.
...
Рейтинг: 0 / 0
UPDATE XML-поля
    #35174232
Rike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В PostgreSQL, насколько мне известно, нет функций, которые позволяли бы менять значения тэга в XML. Такую функцию можно написать на Java, там возможностей работы с XML гораздо больше...

Класс с нужным методом на Java будет выглядеть примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package mypackage;

public abstract class myXML {
	
    public static String setvalue(String xml, String element, String Value) {
    	try {
    		XPath xpath = XPathFactory.newInstance().newXPath();
    		NodeList nl = (NodeList) xpath.evaluate(element, new InputSource(new StringReader(xml)), XPathConstants.NODESET);
    	
    		if (nl.getLength() ==  1 ) {
    			nl.item( 0 ).setNodeValue(Value);
    			
    			StringWriter writer = new StringWriter();
    	        TransformerFactory.newInstance().newTransformer().transform(
    	                new DOMSource(nl.item( 0 ).getOwnerDocument()),
    	                new StreamResult(writer));
    	        
    	        return writer.toString();
    		}
    	} catch (Exception e) {
    	}
    	return null;
    }
}

JAR-файл нужно будет зарегистрировать в базе данных, там же создать функцию связанную с методом myXML.setvalue, это делается примерно так:
Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE FUNCTION xml_set_value (p_xml varchar, p_element varchar, p_value varchar) RETURNS varchar AS
$body$
mypackage.myXML.setvalue
$body$
LANGUAGE 'java';

Использовать функцию можно будет так:
Код: plaintext
SELECT xml_set_value(contacts, '/contacts/tel/mobile/text()', '888-444-4444') FROM users.users;

Предложенная Java-функция в случае ошибки, в том числе и в случае, если заданного тэга в XML нет, будет возвращать NULL.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UPDATE XML-поля
    #39701406
Ameli2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
А расскажите, пожалуйста, как регистрировать jar файл в БД?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / UPDATE XML-поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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