0

我有一个调用 perl cgi 来填充网格的 jqgrid。cgi 使用 DBD::Oracle 来获取数据。网格不显示数据。

调试脚本我发现在准备语句时存在冲突。当我跳过准备并发送数据时,它工作正常;当我从 Oracle 更改为 PostgreSQL 时,它工作得很好。

有人经历过吗?我知道 CGI 正在使用 Oracle 连接,因为当我以交互方式运行它时它会运行并打印到屏幕上。当从网格调用 CGI 时,它不会。当使用 Pg 连接和准备调用 CGI 时,数据加载到网格 - 完美

CGI:

 #!/usr/bin/perl
    use CGI;
    use DBI;
    use Connect::Oracle;
    use Connect::PG;

    $stat = new CGI("");
    print $stat->header;
    $count = $stat->url_param('count');

    #connecting to either db works fine
    my $ORdbh = DBI->connect(Oracle->User, {PrintError=>1,RaiseError=>1}); 
    # my $ORdbh = DBI->connect(PG->User, {PrintError=>1,RaiseError=>0});

    $select = qq/select * from db.table/;  

    # preparing with Oracle connection works fine, but nothing returned to grid. 
    # Not even the hardcoded $rows below! 
    # Preparing with PG connection works also but $rows returns to grid

    my $select_batch_status = $ORdbh->prepare($select);
    #$select_batch_status->execute();
    #$select_batch_status->bind_columns(\$COLLECTID, \$SYSTEM);

    ....removed fetch()....irrelevant

    #The JSON is fine

    $rows = qq/["COLLECTID","SYSTEM"]/;

    $data = qq/{"page":"1","total": 1, "records": "$row_count", "rows": [/;
    $data .= $rows;
    $data .= qq/]}/;

    print "$data";
    exit;

我的结论是 jqgrid 和 DBD::Oracle 之间存在冲突,但我不知道如何调试更低。网格与 Pg 配合得很好,但我想使用 Oracle。在 Chrome 开发人员工具上,我没有看到任何警告或错误,并且 cgi 没有发送任何数据

网格:

<script type="text/javascript">
    var counter=0;
    jQuery(function () {
        jQuery("#list3").jqGrid({
            url:'./collect.cgi?count=' + counter,
            datatype: "json",
            ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
            colNames: ['COLLECT ID', 'SYSTEM'],
            colModel: [
                {name: 'collectid', index: 'collectid', width: 100},
                {name: 'system', index: 'system', width: 50},
            ],
            rowNum: 20,
            rowList: [15, 30, 45],
            pager: '#pager3',
            sortname: 'system',
            sortable: true,
            loadonce: true,
            viewrecords: true,
            sortorder: "asc",
            rowTotal: 500,
            jsonReader: {
                cell: "",
                id: "0"
            },
            gridview: true,
            loadComplete: function() {
            $(document).ready(function() {
                    setTimeout (function() {
                            counter++;
                            $("#list3").jqGrid().setGridParam({
                                    url: './collect.cgi?count=' + counter,
                                    datatype: 'json',
                                    loadonce: true
                            }).trigger("reloadGrid",[{current:true}]);
                    }, 10000);
            });
            },
            loadError: function(xhr,st,err) {
                    $("#jsonmapMessage").html("Type: " + st + "; Response: " + xhr.status + " " + xhr.statusText);
            },
            loadtext: "updating...",
            caption: "COLLECTION MONITOR CONTROL",
            width: 'auto',
            height: '500'
        });

    $("#list3").jqGrid('navGrid','#pager3',{edit:true,add:true,del:true,refresh:true});

    });

</script>
4

1 回答 1

0

我最近能够重新访问它,经过一些挖掘和网络日志审查,结果证明 cgi 程序无法加载 DBD::Oracle 所需的所有库。为了使这些库可用,我必须更新 LD_LIBRARY_PATH 环境变量以指向正确的库。在 cgi 程序获取其环境的网络服务器级别需要此更改。将 LD_LIBRARY_PATH 添加到脚本没有任何影响。在我的网络服务器上:Oracle iPlanet,我需要更新 server.xml 配置文件的 cgi 部分,并重新启动网络服务器(从管理控制台进行的更改没有生效)

于 2013-07-01T15:22:15.410 回答