【问题标题】:HTP.P no longer working in ApplicationHTP.P 不再在应用程序中工作
【发布时间】:2015-08-26 17:02:58
【问题描述】:

希望你能帮到我

我有一个客户,我为其开发应用程序,我的开发需要从 Oracle 10g 升级到 Oracle 11g。当我进行如此重大的升级时,我决定升级所有东西(即 apex、tomcat 和 listener,以及 11g),不幸的是,这导致了一些错误,我将在下面详细说明

我的旧环境是 Oracle 数据库 10.2g XE、Apex 4.0.1、Tomcat 7.0.5、Apex 侦听器 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

编辑:代码在 10.2g 中使用 htp.p 而不是 htp.script,在 11g 中我使用 htp.p 对其进行了测试,但无济于事。一旦按下按钮,代码就会执行,并且位于 Apex 的处理分支中。代码本身在“提交时,计算和验证之后”执行。页面重新加载不是由 window.location.href 完成的

【问题讨论】:

    标签: oracle tomcat oracle11g oracle-apex


    【解决方案1】:

    我想知道你为什么要这样编码。您的目标是在 apex 中完全没有代码吗? (为什么?)为什么没有动态操作或按需调用?为什么没有合适的javascript?您了解htp.script 每次都会添加新的script 标签吗?
    一旦您需要翻阅 plsql 代码以查找 HTML 或 javascript sn-ps,它总是很棒。 Imo,有更易于管理的方法来分离关注点。

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

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

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

    【讨论】:

    • 代码在提交时运行 - 在计算和验证之后,是一个 PL/SQL 匿名块。它不适用于 HTP.SCRIPT 或 HTP.P 调用(它们使用与上述代码类似的报告样式。我检查了 Firebug 并且没有显示错误:(。相同的代码在 Oracle 10.2G 和 Apex 4.1 中工作.页面重新加载不是由这个脚本完成的,我只是将window.location.href的页码更改为测试
    • 好的,尝试使用 console.log 行运行?他们出来了吗?除此之外,我真的怀疑在提交后的过程中将内容放入 http 缓冲区是否可行。它可能有,但我不这么认为。确实,您最好设置页面项目的值并使用它来有条件地触发页面加载时的动态操作。
    【解决方案2】:

    Oracle 的 OWA html 相当陈旧(xhtml),我正在使用“HTP”和 ORDS 3.0.1(以前的 apex 侦听器)以及 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;
    

    作为内容

    【讨论】:

      【解决方案3】:

      您是否根据需要配置了 ACL 权限? 检查此以获得完整的参考和示例DBMS_NETWORK_ACL_ADMIN

      【讨论】:

      • 我已经有一个名为 systemusers.xml 的网络 ACL。我需要另一个包裹吗?我知道 ACL 不能分配给一个包,但我不知道它是否有帮助。我已将 CONNECT 和 RESOLVE 权限分配给 ACL 中的 APEX_040200 用户和 SCHEMANAME 用户
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多