0

我正在从 window.opener.location.href 调用一个 plsql 过程,我想将一个数组作为参数传递给这个过程。

window.opener.location.href="dt_bulk_test_pkg.pc_bulk_test?ps="+frmresult.ps.value+
                            "&p_step="+frmresult.p_step.value+
                            "&p_year="+frmresult.p_year.value+
                            "&p_quarter="+frmresult.p_quarter.value+
                            "&p_diagnostic_type="+frmresult.p_diagnostic_type.value+
                            "&p_overwrite="+frmresult.p_overwrite.value+
                            "&p_company_id="+v_comp_id;

v_comp_id是一个数组。

4

2 回答 2

1

PL/SQL 是一种数据库技术,Javascript 是一种浏览器内技术(除非你正在使用 node 或 Rhino 做服务器端 JS,但你不是)。浏览器只能与 Web 服务器通信。因此,从 javascript 的角度来看,您不是在调用存储过程,而是在调用一个 Web 服务器,您必须在某个地方运行该服务器来调用该存储过程。

如何精确地表示数组取决于服务器端语言/网络框架,但一个相当标准的方法是 jQuery 的$.param方法。例如,在这个站点上打开控制台我可以这样做:

> $.param({example: [1,2,3]})
"example%5B%5D=1&example%5B%5D=2&example%5B%5D=3"

警告的话。

  • 直接通过 HTTP 公开数据库存储过程不仅是糟糕的设计,而且可能是一个非常糟糕的安全风险。
  • 在 url 中嵌入参数意味着您正在使用 HTTP GET 请求。GET 请求适用于不影响服务器状态的资源,因此请注意您的存储过程只获取数据,而不是更改它。危险在于有人可以将该 URL 放在电子邮件中,甚至是网页上的 img src 标签,而人们只需单击链接或访问网页即可点击该 URL。
  • 所有参数都应该通过 url 编码。就像我提到的,jQuery.param 会做到这一点。
  • 您也可能将自己暴露在XSS 攻击中。
于 2012-07-19T10:53:16.367 回答
1

我知道这是一个旧线程,但我来到这里,所以我猜其他人会。

很可能通过 URL 将数组传递给 PL/SQL,并且它是明确支持的,而不是狡猾的 hack。链接到 Oracle 文档

您将 PL/SQL 输入参数声明为 varchar2 的表。然后在 URL 中重复传递相同的参数名称。

1/ PL/SQL 源示例:

CREATE OR REPLACE PROCEDURE test_array(
    p IN dbms_sql.varchar2_table )
AS
BEGIN
  FOR i IN p.FIRST .. p.LAST
  LOOP
    htp.p(p(i)||'<br>');
  END LOOP;
END test_array;

* 2/ 调用它的示例 URL: - 用您自己的设置替换 XXXXXXXXXXXXXXX *

http://XXXXXXXXXXXXXX/test_array?p=first ele&p=second ele

3/ 输出

first ele
second ele

你可以传入任意数量的元素,我在这个例子中只使用了 2 个。

如果您的数据类型不是 varchar2,无论如何从 URL 中将它们捕获为 varchar2,并将它们转换为 pl/sql 中的数字等。

于 2014-04-13T14:20:19.757 回答