Получите значение xml элемента в Oracle МН SQL

Этот запрос:

SELECT * FROM matches LEFT JOIN questions ON matches.id = questions.id_match

выберет 5 столбцов и 2 из них имеют одинаковые имена: id.
Я считаю, что лучше изменить запрос следующим образом:

SELECT m.id mid, m.description, q.id qid, q.id_match, q.question 
FROM matches m LEFT JOIN questions q ON m.id = q.id_match 

Так что имена столбцов разные.
Теперь после того, как вы выполните:

Cursor cursor = db.rawQuery(query, null);

у вас есть объект Cursor, содержащий все строки, извлеченные вышеупомянутым запросом.
Вам нужен цикл для доступа к значениям каждого столбца каждой строки:

while (cursor.moveToNext()) {
    String mid = cursor.getString(cursor.getColumnIndex("mid"));
    String description = cursor.getString(cursor.getColumnIndex("description"));
    String qid = cursor.getString(cursor.getColumnIndex("qid"));
    String id_match = cursor.getString(cursor.getColumnIndex("id_match"));
    String question = cursor.getString(cursor.getColumnIndex("question"));
    // here write your code
}

Если mid, qid и id_match не строки, а целые числа, замените их на getInt() вместо [ 1110].

6
задан OMG Ponies 30 September 2009 в 18:29
поделиться

1 ответ

Вам нужно изменить строку

testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(n);

на

testr := DBMS_XMLDOM.getNodeName(n) || ' ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(n));

В XML DOM элементы не имеют никаких ' значение, чтобы говорить о. Узлы элементов содержат текстовые узлы как дочерние, и именно эти узлы содержат нужные значения.

РЕДАКТИРОВАТЬ (в ответ на комментарий Томалака): я не знаю ни одной функции в DBMS_XMLDOM для получения объединенного значения всех дочерние текстовые узлы элемента. Если это то, что вам нужно, то вам вполне может понадобиться что-то вроде следующей функции:

CREATE OR REPLACE FUNCTION f_get_text_content (
    p_node          DBMS_XMLDOM.DOMNode
) RETURN VARCHAR2
AS
  l_children        DBMS_XMLDOM.DOMNodeList;
  l_child           DBMS_XMLDOM.DOMNode;
  l_text_content    VARCHAR2(32767);
  l_length          INTEGER;
BEGIN
  l_children := DBMS_XMLDOM.GetChildNodes(p_node);
  l_length := DBMS_XMLDOM.GetLength(l_children);
  FOR i IN 0 .. l_length - 1 LOOP
    l_child := DBMS_XMLDOM.Item(l_children, i);
    IF DBMS_XMLDOM.GetNodeType(l_child) IN (DBMS_XMLDOM.TEXT_NODE, DBMS_XMLDOM.CDATA_SECTION_NODE) THEN
      l_text_content := l_text_content || DBMS_XMLDOM.GetNodeValue(l_child);
    END IF;
  END LOOP;
  RETURN l_text_content;
END f_get_text_content;
/
12
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: