【问题标题】:Oracle Stored Procedure with undefined number of parameters with Java JSF带有未定义参数数量的 Oracle 存储过程与 Java JSF
【发布时间】:2012-02-15 10:57:13
【问题描述】:

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

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

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

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

示例:

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

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

感谢您的耐心和回答。

【问题讨论】:

  • 您是否有理由不能只为未选中的框传递空值,并让程序根据需要解释这些值?在 Java 方面,这似乎比具有默认值的命名参数更容易,因为您必须更改每个组合的调用。不知道我是否遗漏了什么。
  • @AlexPoole 这些复选框是动态的,所以事先不知道要生成多少个复选框
  • 但是您知道所有可能性,对,否则 proc 怎么知道如何处理这些值?如果您的 proc 有 15 个参数,您可以只发送您显示的框的值并从中获取值吗?
  • 您也可以发送一组值,或者如果您事先不知道参数 - 如果这些框是从表驱动的配置动态生成的 - 一组参数/值对。我认为需要查看您的流程的更多细节以了解最合适的方法。
  • 或者只是将字符串作为参数传递,并在 PLSQL 中的 & 字符上标记字符串的结果?不过,在 Java 中进行字符串操作会更容易。

标签: java oracle jsf stored-procedures


【解决方案1】:

您可以声明 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();   
   }
}

【讨论】:

  • 什么是:x?创建或替换类型 str_table 是 varchar2(100) 的表;我应该在程序本身中创建它吗?
  • @yeah - 您需要在 SQL 引擎中创建类型。它是您在创建过程之前在数据库中创建的对象。
  • 是否可以在过程本身中拆分数组?
  • @yeah - 如果您询问是否可以将单个字符串发送到存储过程,然后在过程中解析字符串而不是发送数组,那当然是可能的。但是 PL/SQL 本身并没有像 Java 的 SPLIT 这样的函数,因此您必须编写更多代码并且架构不太优雅。
  • 所以我最好在java本身中拆分字符串,然后将其作为不同的数组发送,然后为我拥有的数组数量创建相同数量的类型?
猜你喜欢
  • 1970-01-01
  • 2013-11-17
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2010-11-02
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多