首页 > 解决方案 > 用于解析列的 Oracle 查询

问题描述

我在 Oracle 12c DB 中有一个调试日志表,我试图在 jQuery 数据表中解析和显示。

我正在使用以下查询,当我在 SQL Developer 窗口中运行它时,它运行良好,但在 Web 应用程序中永远不会结束执行。

数据如下所示,存储在 DTEXT 列中,只有 8500 行。

SID[1769]:  USPPICKEVENTS[90] LVSPICKSQL[INSERT INTO DBMIRROR (...).
SID[130]:  USPPICKITEMS[131]. LVCMIRRORCOLLECTION.Count[0].

SID 后面的数字是 ,好吧,SID;然后是存储过程名称,第二个数字是 SP 内的行号和其他类型的描述,这些是我要解析的(即 SID、USP 名称、行号、描述)。

这是我正在使用的查询:

SELECT DTEXT, CHANGE_DATE, 
REGEXP_SUBSTR(REPLACE(DTEXT, ' ', ''), '\[([^]]+)\]', 1, 1, NULL, 1) AS SID, 
SUBSTR(REPLACE(DTEXT, ' ', ''), INSTR(REPLACE(DTEXT, ' ', ''), ':', 1, 1) + 1, 
INSTR(REPLACE(DTEXT, ' ', ''), '[', 1, 2) - INSTR(REPLACE(DTEXT, ' ', ''), ':', 1, 1) - 1) AS USP, 
SUBSTR(REPLACE(DTEXT, ' ', ''), INSTR(REPLACE(DTEXT, ' ', ''), ']', 1, 2) + 1) AS DESCR, 
regexp_substr(REPLACE(DTEXT, ' ', ''), '\[([^]]+)\]', 1, 2, NULL, 1) USP_LINENUM
FROM DEBUG_LOG) ;
  1. 不确定这是否是正确或有效的方法,我绝不是 Oracle 开发人员。
  2. 不知道为什么当返回数据时它会继续前进,而 jQuery 数据表永远不会填充。

这是填充数据表的函数,Web 服务 URL 被传递给它,服务使用上述查询并转换为 JSON 字符串。

function populateTable(ws_url, parameters, table) {
    $.ajax({
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        url: ws_url,
        cache: false,
        data: parameters,
    }).done(function (result) {
        table.clear().draw();
        jResult = JSON.parse(result.d);

        if (jResult.length != 0) {
            table.rows.add(jResult).draw();
            table.columns([5]).visible(false);
        }
    }).fail(function (jqXHR, textStatus, errorThrown) {debugger
        $('#divGrid').hide();
        alert(textStatus + ' - ' + errorThrown + '\n' + jqXHR.responseText);
    });
}

标签: c#ajaxparsingdatatablesoracle12c

解决方案


稍微简单一点的查询怎么样?

SQL> with test (col) as
  2    (select 'SID[1769]:  USPPICKEVENTS[90] LVSPICKSQL[INSERT INTO DBMIRROR (...).' from dual union all
  3     select 'SID[130]:  USPPICKITEMS[131]. LVCMIRRORCOLLECTION.Count[0].' from dual
  4    )
  5  select
  6    regexp_substr(col, '\d+', 1, 1) sid,
  7    regexp_substr(col, '\w+', 1, 3) usp,
  8    regexp_substr(col, '\d+', 1, 2) line,
  9    trim(substr(col, instr(col, ']', 1, 2) + 1)) description
 10  from test;

SID   USP             LINE  DESCRIPTION
----- --------------- ----- ----------------------------------------
1769  USPPICKEVENTS   90    LVSPICKSQL[INSERT INTO DBMIRROR (...).
130   USPPICKITEMS    131   . LVCMIRRORCOLLECTION.Count[0].

SQL>
  • 第 1 - 4 行代表样本数据
  • SID:给我第一个号码
  • USP:给我第三个字
  • LINE:给我第二个号码
  • 描述:第二个右方括号后面的字符串

至于其余的(ajax、c# 和其他东西) - 我无能为力,抱歉。


推荐阅读