`
yuexiaodong
  • 浏览: 70367 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle动态SQL绑定集合变量

阅读更多

有如下需求,在存储过程中,传递的参数是字符串,字符串格式是‘1,2,3 ’, 由数字组成,中间用','号分割;然后在SQL语句如下使用:

 

create or replace procedure moveToRight  (v_ids varchar2, v_workid int )
as
i_sql varchar2(1000);
begin
	 /*
	  -- v_ids 的格式 '1,2,3'转换成1,2,3的集合
	  */ 
   -- oracle 动态SQL列名不能使用替代形式,只能拼凑
    i_sql:=' insert into profworktype (workid,worktypeid) select  '|| v_workid ||' ,id from  worktype where  id  in (:1)  and id not in ( select worktypeid  from  profworktype where workid = :2 ) ';
      execute immediate i_sql  using  v_ids, v_workid;
   end;

 注意上面红色标记的参数传递,是显然不对的,因为使用in后面必须是集合,集合要么来自于select语句,要么自己封装,具体参考:http://space.itpub.net/756652/viewspace-242174 ;做法主要是将字符串转换成数字集合,然后通过select语句即可;代码如下:

1、首先创建一个类型,用于存储数据

create or replace type numTableType as table of number ;

 2、创建一个函数负责完成字符串到集合的转换

-- 代码来源于 http://space.itpub.net/756652/viewspace-242174
create or replace function str2numlist (v_ids varchar2)
 return  numTableType 
 as 
  v_str long default v_ids || ','; 
  v_n number; 
  v_data  numTableType := numTableType (); 

begin
    loop 
  v_n := to_number(instr( v_str, ',' )); 
          exit when (nvl(v_n,0) = 0); 
 v_data.extend; 
v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1))); 
 v_str := substr( v_str, v_n+1 ); 
end loop; 
 return v_data; 
 end; 

 3、在存储过程中调用该函数即可;

create or replace procedure moveToRight  (v_ids varchar2, v_workid int )
as
i_sql varchar2(1000);
begin
	 /*
	  -- v_ids 的格式 '1,2,3'转换成1,2,3的集合
	  */ 
   -- oracle 动态SQL列名不能使用替代形式,只能拼凑
    i_sql:=' insert into profworktype (workid,worktypeid) select  '|| v_workid ||' ,id from  worktype where  id  in (select * from the(select cast (str2numlist( :1) as numtableType ) from dual) )  and id not in ( select worktypeid  from  profworktype where workid = :2 ) ';
      execute immediate i_sql  using  v_ids, v_workid;
   end;

 注意select * from the(表函数返回的结果集集合)的用法,查找了半天没有找到官方说明,欢迎指出。但是下面是等价的:

select * from the(select cast (str2numlist( :1) as numtableType ) from dual) 

-- 等价于

select * from table (  cast (str2numlist( '1,2') as numtableType )   )

 

 转载注明来源: http://yuexiaodong.iteye.com/blog/1892360

 

 

1
2
分享到:
评论

相关推荐

    动态SQL与绑定变量

    动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...

    oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性及应用 绑定变量是 Oracle 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用...

    在Java中实现Oracle变量的绑定方法 .doc

    为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...

    浅谈oracle 数据库的绑定变量特性及应用

    - **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...

    sql绑定变量

    标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...

    也谈oracle 数据库的绑定变量特性及应用

    绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法带来了显著的优势,尤其是在处理大量相似但不完全相同的查询时。 1. 为什么使用绑定变量? - **提高性能**...

    Java中Oracle操作绑定变量使用用户工具模块解决方案

    为了克服这个问题,并充分利用绑定变量带来的性能优势,我们可以设计一个通用模块`SQLWhere_ClauseByBind_VariableGeneraterUtils`来帮助动态构建带有绑定变量的SQL语句及其对应的值设置。该模块的核心逻辑如下: `...

    查找未使用绑定变量sql.sql

    查找未使用绑定变量sql.sql

    oracle 动态SQL

    - 动态SQL可能导致SQL注入问题,因此在构建SQL语句时应避免使用不安全的用户输入,或者使用绑定变量来防止这类攻击。 6. **性能影响**: - 动态SQL相比静态SQL可能会带来一定的性能损失,因为它需要在解析和执行...

    Oracle动态执行SQL四种方式的例子

    使用`DBMS_SQL.OPEN_CURSOR`打开一个游标,然后通过`DBMS_SQL.PARSE`解析SQL语句,并用`DBMS_SQL.BIND_VARIABLE`绑定变量,最后调用`DBMS_SQL.EXECUTE`执行删除操作。 #### 示例2:执行DDL语句 ```sql CREATE OR ...

    Oracle中动态SQL详解

    EXECUTE IMMEDIATE '动态SQL语句' USING [绑定变量] RETURNING INTO [输出变量]; ``` - **DDL语句**:可以用来执行DDL语句,如创建表等。 - **DML语句**:支持动态执行各种DML语句,如插入、更新、删除等。 - **...

    oracle动态sql之EXECUTE IMMEDIATE.docx

    3. 如果动态 SQL 中需要绑定变量,则使用 USING,通常绑定的变量为输入入参,此时变量前的 in 可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用 out 显示指明。 下面是 EXECUTE ...

    Oracle 中的变量绑定

    不使用绑定变量,例如在Java程序中直接将变量值拼接到SQL语句中,会导致每次SQL语句的值改变时,Oracle都需要重新解析SQL,这称为硬分析(Hard Parse)。硬分析不仅消耗CPU资源,还会增加数据库的负载,因为每次都...

    Oracle数据库的绑定变量特性及应用.pdf

    开发人员需要编写代码以支持动态SQL,并在可能的地方使用绑定变量。例如,通过预编译的游标(如PL/SQL中的REF CURSOR)或者在Java、C#等编程语言中使用PreparedStatement。 总的来说,Oracle数据库的绑定变量特性是...

    Oracle动态SQL之DBMS_SQL系统包的使用.pdf

    Oracle数据库作为当前企业级应用中广泛使用的数据库系统之一,其提供的动态SQL功能允许开发者在程序运行时构造和执行SQL语句,这种灵活性为程序开发提供了极大的便利。本文将探讨Oracle中的动态SQL实现机制,重点...

    Oracle动态SQL之本地动态SQL的使用.pdf

    通过理解并掌握 EXECUTE IMMEDIATE语句的使用,以及如何处理参数绑定和异常处理,开发者可以更有效地利用Oracle的动态SQL功能。这不仅限于简单的表操作,还包括复杂的查询和数据处理任务,从而使得数据库程序能够更...

    压测Oracle的SQL语句的性能情况

    2. **绑定变量**:使用绑定变量可以防止硬解析,提高SQL执行效率,减少解析开销。 3. **执行计划**:通过EXPLAIN PLAN分析SQL执行路径,了解数据库如何处理查询,找出可能导致性能问题的步骤。 4. **索引策略**:...

    ORACLE 19C SQL调优指南 中文版 Oracle DBA

    3. **绑定变量**:使用绑定变量可以避免硬解析,提高SQL语句的重用性,减少解析开销。当SQL语句中的参数用绑定变量替代时,数据库只需解析一次,后续相同结构的查询将共享同一个执行计划。 4. **分区技术**:在大型...

    oracle 的绑定变量

    绑定变量的作用在于,即使SQL的谓词部分(如WHERE子句)的值不同,Oracle也能通过使用相同的哈希值将它们视为同一SQL。例如,使用绑定变量":X"的SQL `SELECT salary FROM user WHERE name=:X`可以替代多个特定名字的...

Global site tag (gtag.js) - Google Analytics