HTP.P不再在Application中工作

时间:2014-02-27 08:21:54

标签: oracle tomcat oracle11g oracle-apex

我希望你能帮助我

我有一个为我开发应用程序的客户端,我的开发需要从Oracle 10g升级到Oracle 11g。当我进行如此重大的升级时,我决定升级所有内容(即顶点,tomcat和监听器,以及11g),不幸的是,这会导致一些错误,我将在下面详细介绍

我的旧环境是 Oracle Database 10.2g XE,Apex 4.0.1,Tomcat 7.0.5,Apex Listener 1.1.3。 我的新环境是Oracle DB 11.2g XE,Apex 4.2.4,Tomcat 7.0.50和Apex Listener 2.0.5。

一切顺利,直到我尝试通过尝试执行HTP.P来尝试使用HTP包。在执行HTP.P时,应该通过代码中嵌入的JavaScript打开一个窗口,但是除了重新加载页面之外没有任何事情发生。我试图通过按钮点击执行的代码如下所示

DECLARE
numf NUMBER;
x VARCHAR2(250) := 'window.open("f?p=102:0:&SESSION:PRINT_REPORT=Revised%20Stock%20Req%20Print")';
y VARCHAR2(250) := 'alert("No unprinted stock items found - cannot execute stock print request")';
z VARCHAR2(250) := ' window.location.href= "f?p=102:40:&SESSION"';

BEGIN
select count(*) into numf from transaction_detail where transaction_header_no in (select transaction_code from transaction_header where authority_batch_no = :P40_AUTH_BATCH_NUMBER) and transaction_source_table = 'STOCK_ITEMS' and transaction_total > 0 and Date_Printed is NULL;

if numf > 0 then

update transaction_detail set Req_Printed='Y', Date_Printed=:P40_TIMESTAMP where transaction_header_no in (select transaction_code from transaction_header where authority_batch_no = :P40_AUTH_BATCH_NUMBER and auth_check_back='Y') and transaction_source_table = 'STOCK_ITEMS' and Date_Printed is NULL;

COMMIT WORK;

htp.script (x, 'Javascript');
htp.script  (z, 'Javascript');

ELSE 

htp.script (y,'Javascript');
htp.script (z, 'JavaScript'); 
END IF;
END;

正如您所希望的那样,如果交易次数(numf)> 0,然后它打算用报告打开一个新窗口,如果没有,则表示显示该消息。但是它只是重新加载页面而不显示消息或任何内容。我已经查看了Apex调试,它显示了试图执行的代码(并且调试没有错误),这让我觉得我需要设置一些东西来运行包。

我已经加载了HTP和UTL_HTTP包(通过@ utlhttp.sql和@ pubht.sql命令)我已经为HTP和UTL_HTTP包上的模式和APEX_040200用户授予了所有权限,但似乎没有任何东西能够打开窗户。没有其他配置到监听器(除了端口的基本配置,数据库sid等)。

非常感谢任何帮助或建议。

亲切的问候, DazzaRPD

编辑:代码使用htp.p而不是htp.script在10.2g中工作,在11g中我使用htp.p测试它无济于事。按下按钮后执行代码,该代码位于Apex的Processing分支中。代码本身在“计算和验证后”提交时执行。 Page重新加载不是由window.location.href

完成的

3 个答案:

答案 0 :(得分:2)

我想知道为什么你会用这种方式编码。你的目标是在顶点没有代码吗? (为什么?)为什么没有动态动作或按需通话?为什么没有正确的JavaScript?您了解htp.script每次添加新script代码的方式如何? 一旦你需要翻阅plsql代码来查找HTML或javascript片段,它总是很棒。 Imo,有更多可管理的方式来分离问题。

无论如何,你的问题不在数据库或授权中:如果你得到输出,那么应该足够证明所需的包可以执行。
我发现了一个错误,那就是SESSION的替换,&SESSION.x都应该是z(尾随点) 您的问题可能与javascript有关。页面重新加载,因此可能window.location.href这样做 你检查过浏览器的控制台了吗?有什么错误吗?
尝试一些简单的事情,例如使用一些alertconsole.log来电,这样您就可以了解或了解发生的事情。例如

x VARCHAR2(250) := 'console.log("doing x");';
y VARCHAR2(250) := 'console.log("doing y");';
z VARCHAR2(250) := 'console.log("doing z");';

此外,此代码在哪个进程点运行?提交后?在标题之前加载?一个PLSQL区域?

答案 1 :(得分:0)

您是否根据需要配置了ACL权限? 请查看此内容以获取完整参考和示例DBMS_NETWORK_ACL_ADMIN

答案 2 :(得分:0)

Oracle的OWA html非常古老(xhtml),我正在使用“HTP”和ORDS 3.0.1(以前的顶级侦听器)以及11g和12c数据库。在APEX工作正常。

我做的是停止使用任何HTML特定功能并坚持使用htp.p或htp.prn。

尝试修改您的代码:

declare
    numf   number;
    x      varchar2 (250) := 'window.open("f?p=102:0:&SESSION:PRINT_REPORT=Revised%20Stock%20Req%20Print")';
    y      varchar2 (250) := 'alert("No unprinted stock items found - cannot execute stock print request")';
    z      varchar2 (250) := ' window.location.href= "f?p=102:40:&SESSION"';
begin
    select count (*)
      into numf
      from transaction_detail
     where     transaction_header_no in (select transaction_code
                                           from transaction_header
                                          where authority_batch_no = :p40_auth_batch_number)
           and transaction_source_table = 'STOCK_ITEMS'
           and transaction_total > 0
           and date_printed is null;

    if numf > 0 then
        update transaction_detail
           set req_printed = 'Y', date_printed = :p40_timestamp
         where     transaction_header_no in (select transaction_code
                                               from transaction_header
                                              where authority_batch_no = :p40_auth_batch_number and auth_check_back = 'Y')
               and transaction_source_table = 'STOCK_ITEMS'
               and date_printed is null;

        commit work;

        htp.prn ('<script>' || x || '</script>');
        htp.prn ('<script>' || z || '</script>');
    else
        htp.prn ('<script>' || y || '</script>');
        htp.prn ('<script>' || z || '</script>');
    end if;
end;

您可以通过创建PL / SQL区域并使用简单的

来测试它
begin
    htp.prn ('<span style="font-size:200%">Hello world!!</span>');
end;

作为内容