`

集合参数绑定变量的实现

阅读更多
问题的引出

select ename 
from emp 
where 
empno in (7369,7499,7521)

这个语句显然用的是直接变量,这是我们应该尽量避免的。


新建系统数据类型
create type t_number is table of number(4);

测试这个集合型数据类类型
select column_value from  table(t_number(7369, 7499, 7521,7698))


declare
  --type t_number is table of emp.empno%type;
  --create or replace type t_number is table of number(4);--新建系统数据类型
  c_deptno t_number;
  
  v_deptno1 emp.empno%type :=7369;
  v_deptno2 emp.empno%type :=7499;
  v_deptno3 emp.empno%type :=7521; 
begin
  --直接变量
  dbms_output.put_line('直接变量');
  for x in (select ename from emp where empno in (7369, 7499, 7521)) loop
    dbms_output.put_line(x.ename);
  end loop;
  --半绑定变量
  dbms_output.put_line('半绑定变量');
  for x in (select ename from emp where empno in (v_deptno1, v_deptno2, v_deptno3)) loop
    dbms_output.put_line(x.ename);
  end loop;
  
  --全绑定变量
  dbms_output.put_line('全绑定变量');
  c_deptno := t_number(7369, 7499, 7521);
  for x in (select ename from emp where empno member of c_deptno) loop
    dbms_output.put_line(x.ename);
  end loop;  

  --全绑定变量1
  dbms_output.put_line('全绑定变量1');
  c_deptno := t_number(7369, 7499, 7521,7698);
  for x in (select ename from emp where empno member of c_deptno) loop
    dbms_output.put_line(x.ename);
  end loop;   

  --全绑定变量2
  dbms_output.put_line('全绑定变量2');
  c_deptno := t_number(7369, 7499, 7521,7698);
  for x in (select ename from emp 
  --select column_value from  table(t_number(7369, 7499, 7521,7698))
  where emp.empno in (select column_value from  table(c_deptno))
  ) loop
    dbms_output.put_line(x.ename);
  end loop; 
  
 
  --全绑定变量3
  dbms_output.put_line('全绑定变量3');
  c_deptno := t_number(7844,7876,7900,7902,7934 );
  for x in (select ename from emp 
  --select column_value from  table(t_number(7369, 7499, 7521,7698))
  where emp.empno in (select column_value from  table(c_deptno))
  ) loop
    dbms_output.put_line(x.ename);
  end loop;     
end;

我们看到这个c_deptno := t_number(XXXXXXXXX)很好地解决了集合类型变量的绑定。

但是我们在应用中并没有这样的数据类型,如在jdbc中有varchar,date等类型,但是没有一个类型映射到t_number类型。

Oracle的JDBC扩展解决了这个问题
package methods;

import java.sql.*;

import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class collectParams {

    public collectParams() {
    }

    public static void main(String[] args) throws SQLException,
            ClassNotFoundException {
        String query = "select  ename from emp where emp.empno member of ?";
        System.out.println(" query = " + query);
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection conn =
                DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:gq", "scott", "tiger");
        int[] empno = {7876, 7900, 7902, 7934};
       // ARRAY ary1 = new ARRAY(ArrayDescriptor.createDescriptor("T_NUMBER", conn), conn, empno);

        PreparedStatement pstmt = conn.prepareStatement(query);
        ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("T_NUMBER", conn);
        Array ary1 =new ARRAY(descriptor,conn,empno);
       // System.out.println(ary1);
        pstmt.setArray(1,ary1);
      //pstmt.setObject(1, ary1, OracleTypes.ARRAY);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
            System.out.println(rs.getString(1));
        }
        rs.close();
        conn.close();
    }
}

 

分享到:
评论

相关推荐

    sql绑定变量

    2. **批量数据处理**:通过`bulk collect into rec`语句,一次获取多行数据到`rec`变量中,然后再遍历这个集合进行更新操作,这正是利用了绑定变量进行批量数据处理的典型应用。 3. **安全性与效率**:通过使用绑定...

    springmvc高级参数绑定

    在上面的代码中,`@RequestParam("productIds")`注解用于将前端提交的名为"productIds"的数组参数绑定到`List<Long> productIds`变量上。Spring MVC会自动解析请求参数,并将其转换为合适的类型。`productService....

    feign的参数绑定.rar

    Feign的参数绑定支持多种类型,包括基本类型、对象、集合等。对于复杂对象,Feign会将其转换为JSON格式并放入请求体中。例如: ```java public class User { private String name; private int age; // getters...

    SpringMVC入门很简单之数据绑定(上)

    模型绑定是将请求参数绑定到模型对象的过程。在SpringMVC中,可以通过`@ModelAttribute`注解实现。例如,定义一个处理注册请求的方法: ```java @RequestMapping(method = RequestMethod.POST) public String ...

    jquery绑定click事件传递参数

    本文将深入探讨如何使用jQuery来绑定click事件,并传递参数。 首先,`click`事件是jQuery中用于监听元素被点击时触发的事件。它允许我们在用户点击DOM元素时执行特定的函数或代码块。基本的用法是在目标元素上调用`...

    oracle特有的错误:ORA-01036:非法的变量名/编号

    2. **参数绑定问题**:在OracleCommand对象中,当使用参数化查询时,必须使用`:var_name`的格式来定义参数。如代码所示,`cmd.Parameters.Add(":id", OracleType.Char);`在这里,`:id`是参数的占位符,它对应于SQL...

    JavaScript给每一个li节点绑定点击事件的实现方法

    最后,通过闭包(IIFE)解决循环中变量共享问题,实现为每个节点绑定带有不同参数的事件处理函数。 这种技术不仅能够提升网页的交互性,还能够根据用户的操作来动态地改变网页元素的样式或内容。在实际应用中,这...

    spring MVC数据绑定大全

    Spring MVC会自动将请求参数绑定到该对象的属性上。 ```java public class UserForm { private String username; private String password; // getters and setters } @RequestMapping(value = "/saveUser...

    利用OpenMP线程绑定技术提升多核平台应用性能

    它通过环境变量`KMP_AFFINITY`来实现不同的绑定模式,如`compact`、`scatter`和`explicit`。 - **compact模式**: 将线程尽可能紧密地绑定在一起,例如,在双CPU系统中,先将线程绑定到第一个CPU的所有核心上,然后...

    Spring MVC数据绑定大全.rar

    2. **模型对象绑定**:通过`@ModelAttribute`注解,可以将请求参数绑定到一个Java对象的属性上,这样就将HTTP请求数据转化为业务对象,便于处理。 3. **自动类型转换**:Spring MVC提供了自动类型转换机制,能够将...

    spring 数据绑定心得,适合新手

    课程中还会涵盖一些高级主题,比如集合类型的绑定,例如List或Map,这允许你处理一个表单中有多个相同类型输入的情况。还有自定义转换器和格式化器的实现,这些可以让你控制数据的转换过程,满足特定的业务需求。 ...

    SAP HANA SELECT语法(带参数)

    在HANA中,还可以直接将参数作为绑定变量传递给查询,使用":parametername"的格式来表示。例如:“SELECT * FROM _SYS_BIC."crmbo/CA_S_41F_VISIT_EXECUTION_V1"(PLACEHOLDER."$$startdate$$"=>:startdate, ...

    有关c#的核心操作以及绑定

    - **动态绑定**(晚期绑定):运行时确定方法调用,主要应用于虚方法或接口实现。这种方式提供了更多的灵活性,但可能会牺牲部分性能。 - **多态性**:通过继承和接口实现,一个基类引用可以调用子类的方法,这...

    Springmvc请求处理方法参数

    模型驱动(ModelDriven)和命令对象(Command Object)是另一种处理请求参数的方式,它们允许将所有请求参数绑定到一个单独的对象上。 ```java @Controller public class MyController implements ModelDriven...

    cx-oracle英文原版.pdf

    - 讨论了绑定变量的使用,包括按名称或位置绑定参数,绑定方向,绑定NULL值,ROWID值,DML RETURNING绑定变量,LOB绑定变量,REF游标绑定变量,以及如何绑定PL/SQL集合和记录。 ### 结论 文档内容涉及了cx_Oracle...

    Ocacle加速查询的存储过程

    绑定变量是一种有效防止硬解析的技术,它允许多次执行同一SQL语句但使用不同的参数值。在案例中,使用绑定变量(摩托车速度)将查询时间从42秒降低到9秒。这是因为绑定变量减少了解析次数,提高了SQL语句的复用性,...

    js 索引下标之li集合绑定点击事件

    总结来说,本文通过实例代码演示了如何在JavaScript中为一组元素绑定事件,并处理闭包中变量共享的问题。通过三种不同的方法,我们可以了解到JavaScript中事件绑定的灵活性以及闭包、函数作用域链等概念的应用。这些...

    springMVC前后交互代码,多对象传递

    本示例着重关注如何通过多种方式传递参数,包括单个参数、集合参数以及多对象传递。下面我们将详细探讨这些知识点。 1. **请求参数绑定**: - 单个参数:Spring MVC通过`@RequestParam`注解将HTTP请求参数映射到...

    js语法大全以及变量声明

    注意,`const`声明的是变量绑定而不是变量本身,因此如果常量是对象,对象的属性是可以修改的。 2. 变量提升(Hoisting): JavaScript会将所有`var`声明提升到其所在作用域的顶部。这意味着无论`var`变量在哪里...

    JSTL.zip_JSTL绑定数据_jstl后台

    这行代码将请求参数`data`绑定到请求作用域的`data`变量上。 3. **控制逻辑**:JSTL Core库还提供了条件判断和流程控制标签,如`<c:if>`、`<c:choose>`、`<c:when>`和`<c:otherwise>`,可以实现复杂的后台逻辑在...

Global site tag (gtag.js) - Google Analytics