如何从SYS_REFCURSOR中提取值并将Id存入变量?
从SYS_REFCURSOR的嵌套XML中提取Id并存入变量
实现步骤(Oracle PL/SQL)
- 读取游标数据:先从SYS_REFCURSOR中取出包含转义XML的
ITEM字段值。 - 还原转义XML:将
ITEM里的<、>转义字符替换为真实的XML标签<、>。 - 解析XML提取Id:通过
XMLTYPE类型解析处理后的XML,用XPath定位目标Id节点并提取数值。
示例代码
DECLARE v_cursor SYS_REFCURSOR; v_item_xml CLOB; v_parsed_xml XMLTYPE; v_target_id NUMBER; BEGIN -- 替换为你实际获取SYS_REFCURSOR的逻辑(比如调用返回游标的存储过程) -- OPEN v_cursor FOR SELECT ITEM FROM your_source_table; -- 读取游标中的单行数据 FETCH v_cursor INTO v_item_xml; CLOSE v_cursor; -- 还原转义的XML标签 v_item_xml := REPLACE(REPLACE(v_item_xml, '<', '<'), '>', '>'); -- 解析XML并提取<SolicitudModificacionContrato>下的Id v_parsed_xml := XMLTYPE(v_item_xml); v_target_id := v_parsed_xml.EXTRACT('/SolicitudModificacionContrato/Id/text()').GETNUMBERVAL(); -- 若需提取<Tipo>下的Id,替换XPath即可: -- v_target_id := v_parsed_xml.EXTRACT('/SolicitudModificacionContrato/Tipo/Id/text()').GETNUMBERVAL(); -- 验证提取结果(可选) DBMS_OUTPUT.PUT_LINE('提取的Id值:' || v_target_id); END; /
补充说明
- 若游标包含多行数据,将
FETCH逻辑放入循环即可:LOOP FETCH v_cursor INTO v_item_xml; EXIT WHEN v_cursor%NOTFOUND; -- 重复后续XML解析、提取逻辑 END LOOP; - 确保
ITEM中的XML片段是完整的(示例中<Nombre>标签未闭合,实际数据需保证XML结构合法,否则解析会报错)。
内容的提问来源于stack exchange,提问作者Felipe Levinir
相关产品推荐
相关产品推荐

