带有Java JSF的未定义参数数量的Oracle存储过程

时间:2012-02-15 10:57:14

标签: java oracle jsf stored-procedures

我的JSF表单包含 15个复选框和一个提交按钮。我可以单击全部或仅选择几个复选框,然后提交表单。

使用javascript函数,我得到我点击的复选框值并将它们连接成一个字符串;例如checkbox1=IC&checkbox2=S

此值发送到我的java类。我想在Oracle中的存储过程中传递复选框值。

请注意,对于所有15个复选框,该字符串可以包含1个复选框的值。存储过程应该能够处理我得到的值的数量。

示例:

checkbox1=IC&checkbox2=Scheckbox1=IC&checkbox2=S&checkbox3=I&checkbox4=Sa&checkbox5=f&checkbox6=g&checkbox7=h&checkbox8=i&checkbox9=q&checkbox10=e&checkbox11=t&checkbox12=p&checkbox13=89&checkbox14=100&checkbox15=2012

有关如何编写存储过程的任何想法吗?

感谢您的耐心和回答。

1 个答案:

答案 0 :(得分:0)

您可以声明Oracle存储过程以接受数组。我没有立即清楚地知道您希望如何将该信息传递给存储过程(即,您是否需要传递复选框名称和相关值,或者您只需要指示已选中复选框N)。概述最简单的选项(尽管它可能涉及存储过程中的更多解析工作)将传递一个字符串数组,其中数组中的每个元素都类似于checkbox1=IC到存储过程。

CREATE OR REPLACE TYPE str_table
    IS TABLE OF varchar2(100);

CREATE OR REPLACE PROCEDURE process_checkboxes( p_checkboxes IN str_table )
AS
BEGIN
  FOR i IN 1 .. p_checkboxes.count
  LOOP
    <<do something with p_checkboxes(i)>>
  END LOOP;
END;

然后你可以用Java调用它(改编自this askTom thread

import java.io.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;

public class ArrayDemo
{
   public static void passArray() throws SQLException
   {
       Connection conn = <<get your JDBC connection>>

       String checkboxStr = "checkbox1=IC&checkbox2=S";
       String strArray[] = checkboxStr.split("&");

       ArrayDescriptor descriptor =
         ArrayDescriptor.createDescriptor( "STR_TABLE", conn );

       ARRAY array_to_pass =
          new ARRAY( descriptor, conn, strArray);

       OraclePreparedStatement ps =
           (OraclePreparedStatement)conn.prepareStatement
           ( "begin process_checkboxes(:x); end;" );

       ps.setARRAY( 1, array_to_pass );

       ps.execute();   
   }
}