`

集合参数绑定变量的实现

阅读更多
问题的引出

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();
    }
}

 

分享到:
评论

相关推荐

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 登陆服务器时输入 公帐号 openlab-open123 telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss 老师测评网址 http://172.16.0.198:8080/poll/ 各个 ...

    C#开发经验技巧宝典

    0409 如何绑定变量 228 0410 如何绑定集合 228 0411 如何绑定表达式 229 0412 如何绑定方法结果 230 0413 巧用DataBinder.Eval()方法进行数据绑定 230 0414 如何将DropDownList控件绑定到GridView控件中...

    详解JavaScript函数绑定

    在JavaScript与DOM交互中经常需要使用函数绑定,定义一个函数然后将其绑定到特定DOM元素或集合的某个事件触发程序上,绑定函数经常和回调函数及事件处理程序一起使用,以便把函数作为变量传递的同时保留代码执行环境

    Mybatis-04 动态SQL

    1. if判断&OGNL;: 实现根据传入参数所携带的字段动态调整查询方式 2. where标签查询时如果某些...9. bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 10. 抽取可重用的SQL片段,以方便多处引用

    angular-dexie-bind:将Dexis.js查询绑定到角度变量的角度模块

    该模块提供了Angular JS服务,可让您将Dexie.js查询绑定到角度变量。 只需一行即可完成(并维护) $dexieBind . bind ( db , db . TableName . where ( 'key' ) . equals ( 'some_val' ) , $scope ) ; bind命令...

    《Java和Android开发实战详解》第6到10章源代码-by 南邮-陈杨

    9.3.1 静态绑定与动态绑定 180 9.3.2 Java语言支持的多态 181 9.4 多态的实现 181 9.4.1 使用类继承来实现多态 181 9.4.2 使用接口来实现多态 184 9.5 包 186 9.5.1 Java包基础 186 9.5.2 package和...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    3.4.3 消除可选参数和命名参数的歧义 59 第3章快速参考 63 第4章 使用决策语句 65 4.1 声明布尔变量 65 4.2 使用布尔操作符 66 4.2.1 理解相等和关系操作符 66 4.2.2 理解条件逻辑操作符 66 4.2.3 短路求值 ...

    编译原理全套

    3.4.3 用栈实现移进归约分析 3.4.4 移进归约分析的冲突 3.5 LR分析器 3.5.1 LR分析算法 3.5.2 LR文法和LR分析方法的特点 3.5.3 构造SLR分析表 3.5.4 构造规范的LR分析表 3.5.5 构造LALR分析表 3.5.6 非...

    spring杂谈 作者zhang KaiTao

    1.23 扩展SpringMVC以支持绑定JSON格式的请求参数 1.24 扩展SpringMVC以支持绑定JSON格式的请求参数 1.25 在应用层通过spring特性解决数据库读写分离 1.26 context:component-scan扫描使用上的容易忽略的use-default...

    Objective-C2.0程序设计

    13.2.1 参数和局部变量 13.2.2 函数的返回结果 13.2.3 函数、方法和数组 13.3 结构 13.3.1 结构的初始化 13.3.2 结构数组 13.3.3 结构中的结构 13.3.4 关于结构的补充细节 13.3.5 不要忘记面向对象编程思想 13.4 ...

    vue语法.rar

    实现双向数据绑定 5、v-build 绑定页面中元素的属性 6、v-if和v-show v-if 作用:判断是否加载固定的内容,如果是真,就加载,如果是假,就不加载; 语法:v-if='判断表达式' v-show 作用:判断是否显示...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    10.1.3 对象和集合初始化器 10.1.4 匿名类型 10.1.5 System.Tuple类型 10.2 有参属性 10.3 调用属性访问器方法时的性能 10.4 属性访问器的可访问性 10.5 泛型属性访问器方法 第11章 事件 11.1 设计要公开...

    AIC的Java课程1-6章

     清楚如何通过向上转型(引用的隐式转型),方法重写,运行期绑定来实现多态性。  体会多态性如何使系统可扩展和可维护。  理解运行时判定引用对象的类型(instanceof),进行强制转型(即引用的显示转型...

    精通sql结构化查询语句

    10.1.5 使用子查询创建视图 10.2 使用IN语句的子查询 10.2.1 简单的IN语句子查询 10.2.2 使用IN子查询实现集合交运算 lO.2.3 使用IN子查询实现集合差运算 10.3 使用EXISTS语句的子查询 10.3.1 简单的EXISTS语句子...

    java基础案例与开发详解案例源码全

    6.2.4 动态绑定166 6.4 访问修饰符167 6.5 static修饰符168 6.5.1 静态变量168 6.5.2 静态方法169 6.5.3 静态代码块169 6.5.4 单态模式170 6.6 final修饰符171 6.7 abstract修饰符172 6.8 接口173 6.8.1 接口的定义...

    C#语言规范(4.0版本)

    7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    17.3.3 为什么需要动态绑定 501 17.3.4 静态编译与动态编程的比较 502 17.3.5 实现自定义动态对象 503 17.4 小结 505 第18章 多线程处理 507 18.1 多线程基础 509 18.2 使用System....

Global site tag (gtag.js) - Google Analytics