使用Java JSF的参数数量未定义的Oracle存储过程

使用Java JSF的参数数量未定义的Oracle存储过程,java,oracle,jsf,stored-procedures,Java,Oracle,Jsf,Stored Procedures,我的JSF表单中有大约15个复选框和一个提交按钮。我可以单击全部或仅选择几个复选框,然后提交表单 使用javascript函数,我获取我单击的复选框值,并将它们连接到一个字符串;例如checkbox1=IC&checkbox2=S 这个值被发送到我的java类。我想在Oracle中的存储过程中传递复选框值 请注意,字符串可以包含所有15个复选框的1个复选框的值。存储过程应该能够处理我得到的值的数量 示例: checkbox1=IC&checkbox2=S或checkbox1=IC&checkbo

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

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

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

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

示例:

checkbox1=IC&checkbox2=S
checkbox1=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

你知道如何编写存储过程吗


感谢您的耐心和回答。

您可以声明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;
创建或替换类型str_表
是varchar2表(100);
创建或替换过程过程复选框(str_表中的p_复选框)
作为
开始
因为我在1。。p_checkbox.count
环
端环;
结束;
然后,您可以使用如下内容从Java调用(改编自)

import java.io.*;
导入java.sql.*;
导入oracle.sql.*;
导入oracle.jdbc.driver.*;
公共类ArrayDemo
{
公共静态void passArray()引发SQLException
{
连接连接=
字符串checkboxStr=“checkbox1=IC&checkbox2=S”;
字符串字符串字符串[]=checkboxStr.split(“&”);
ArrayDescriptor描述符=
createDescriptor(“STR_表”,康涅狄格州);
数组\u到\u传递=
新数组(描述符、conn、strArray);
OraclePreparedStatementPS=
(OraclePreparedStatement)连接准备声明
(“开始处理”复选框(:x);结束;);
ps.setARRAY(1,阵列到通道);
ps.execute();
}
}

有什么原因不能为未选中的框传递空值,并让过程根据需要解释这些值?在Java方面,这似乎比使用默认值命名参数更容易,因为您必须更改对每个组合的调用。不确定我是否遗漏了什么。@AlexPoole这些复选框是动态的,因此要生成的复选框的数量事先不知道,但您知道所有的可能性,对吧,否则proc如何知道如何处理这些值?如果您的proc有15个参数,您可以只发送所显示框的值并从中获取值?您还可以发送一个值数组,或者如果您事先不知道这些参数-如果这些框是从表驱动配置动态生成的-一个参数/值对数组。我认为,您需要了解流程的更多细节,以了解最适合的方法。或者只是将字符串作为参数传递,并在PLSQL中的
&
字符上标记字符串的结果?不过,在Java中进行字符串操作会更容易?创建或替换类型str_表是varchar2(100)的表;我是否在过程本身中创建它?@是的-您需要在SQL引擎中创建类型。这是您在创建过程之前在数据库中创建的对象。是否可以在过程本身中拆分数组?@是-如果您询问是否可以向存储过程发送单个字符串,然后在过程中解析字符串,而不是发送数组,这当然是可能的。但是PL/SQL本机没有Java的
SPLIT
这样的函数,因此您必须编写更多的代码,并拥有一个不那么优雅的体系结构。因此,我最好在Java中拆分字符串,然后将其作为不同的数组发送,然后为我拥有的数组数量创建相同数量的类型?
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();   
   }
}