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

如何通过javascript将数组作为参数传递给plsql过程,javascript,plsql,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_y

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

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

如何准确地表示数组取决于服务器端语言/web框架,但jQuery方法采用的是一种相当标准的方法。例如,打开此站点上的控制台,我可以执行以下操作:

> $.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将执行此操作
  • 你很可能也会暴露自己

    • 我知道这是一条旧线,但我在这里着陆了,所以我想其他人会的

      通过URL将数组传递给PL/SQL是很有可能的,而且它是显式支持的,而不是狡猾的攻击

      将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;
      
      3/输出

      first ele
      second ele
      
      您可以传入任意数量的元素,我在本例中使用了2


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

      我假设如何将我给出的URL示例与JavaScript中的document.href相关联是显而易见的。如果没有,请告诉我,我将发布一个JavaScript代码片段。
      first ele
      second ele