如何通过javascript将数组作为参数传递给plsql过程

时间:2012-07-19 10:42:00

标签: javascript plsql

我从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是一个数组。

2 个答案:

答案 0 :(得分:1)

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

如何精确地表示数组取决于服务器端语言/ 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请求适用于不影响服务器状态的资源,因此请注意您的存储过程只获取数据,而不是更改数据。危险在于有人可以将该网址放在电子邮件中,甚至是网页上的img src标记,人们只需点击链接或访问网页即可点击该网址。
  • 所有参数都应通过url编码。就像我提到的那样,jQuery.param会这样做。
  • 您可能也会将自己暴露给XSS attacks

答案 1 :(得分:1)

我知道这是一个老线程,但我降落在这里,所以我猜其他人会。

很有可能通过URL将数组传递给PL / SQL,并且明确支持它,而不是一个狡猾的黑客。 Link to Oracle doc

将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 /调用它的示例网址: - 将XXXXXXXXXXXXXX替换为您自己的设置*

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

3 /输出

first ele
second ele

您可以根据需要传入任意数量的元素,本例中我只使用了2个。

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