有如下需求,在存储过程中,传递的参数是字符串,字符串格式是‘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
相关推荐
动态SQL与绑定变量是数据库编程中的重要概念,尤其在Oracle数据库中被广泛应用。动态SQL允许在运行时构建和执行SQL语句,而绑定变量则是在动态SQL中用于替代具体值的占位符,使得SQL语句更为灵活和高效。 ### 1. ...
Oracle 数据库的绑定变量特性及应用 绑定变量是 Oracle 数据库的一种特性,它旨在提高数据库系统的性能和可扩展性。在本文中,我们将详细地探讨绑定变量的目的、命名方法、使用限制条件和应用实例。 为什么使用...
为了解决这些问题,我们可以使用预编译的PreparedStatement对象来绑定变量,例如: ```java String sql = "select name from oms_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); ...
- **动态SQL**:在编程语言如Java、Python等与Oracle数据库交互时,经常使用预编译的PreparedStatement,其中就包含了绑定变量的概念。 - **PL/SQL块**:在Oracle的存储过程、函数和触发器中,也可以使用绑定变量...
标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...
绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法带来了显著的优势,尤其是在处理大量相似但不完全相同的查询时。 1. 为什么使用绑定变量? - **提高性能**...
为了克服这个问题,并充分利用绑定变量带来的性能优势,我们可以设计一个通用模块`SQLWhere_ClauseByBind_VariableGeneraterUtils`来帮助动态构建带有绑定变量的SQL语句及其对应的值设置。该模块的核心逻辑如下: `...
查找未使用绑定变量sql.sql
- 动态SQL可能导致SQL注入问题,因此在构建SQL语句时应避免使用不安全的用户输入,或者使用绑定变量来防止这类攻击。 6. **性能影响**: - 动态SQL相比静态SQL可能会带来一定的性能损失,因为它需要在解析和执行...
使用`DBMS_SQL.OPEN_CURSOR`打开一个游标,然后通过`DBMS_SQL.PARSE`解析SQL语句,并用`DBMS_SQL.BIND_VARIABLE`绑定变量,最后调用`DBMS_SQL.EXECUTE`执行删除操作。 #### 示例2:执行DDL语句 ```sql CREATE OR ...
EXECUTE IMMEDIATE '动态SQL语句' USING [绑定变量] RETURNING INTO [输出变量]; ``` - **DDL语句**:可以用来执行DDL语句,如创建表等。 - **DML语句**:支持动态执行各种DML语句,如插入、更新、删除等。 - **...
3. 如果动态 SQL 中需要绑定变量,则使用 USING,通常绑定的变量为输入入参,此时变量前的 in 可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用 out 显示指明。 下面是 EXECUTE ...
不使用绑定变量,例如在Java程序中直接将变量值拼接到SQL语句中,会导致每次SQL语句的值改变时,Oracle都需要重新解析SQL,这称为硬分析(Hard Parse)。硬分析不仅消耗CPU资源,还会增加数据库的负载,因为每次都...
开发人员需要编写代码以支持动态SQL,并在可能的地方使用绑定变量。例如,通过预编译的游标(如PL/SQL中的REF CURSOR)或者在Java、C#等编程语言中使用PreparedStatement。 总的来说,Oracle数据库的绑定变量特性是...
Oracle数据库作为当前企业级应用中广泛使用的数据库系统之一,其提供的动态SQL功能允许开发者在程序运行时构造和执行SQL语句,这种灵活性为程序开发提供了极大的便利。本文将探讨Oracle中的动态SQL实现机制,重点...
通过理解并掌握 EXECUTE IMMEDIATE语句的使用,以及如何处理参数绑定和异常处理,开发者可以更有效地利用Oracle的动态SQL功能。这不仅限于简单的表操作,还包括复杂的查询和数据处理任务,从而使得数据库程序能够更...
2. **绑定变量**:使用绑定变量可以防止硬解析,提高SQL执行效率,减少解析开销。 3. **执行计划**:通过EXPLAIN PLAN分析SQL执行路径,了解数据库如何处理查询,找出可能导致性能问题的步骤。 4. **索引策略**:...
3. **绑定变量**:使用绑定变量可以避免硬解析,提高SQL语句的重用性,减少解析开销。当SQL语句中的参数用绑定变量替代时,数据库只需解析一次,后续相同结构的查询将共享同一个执行计划。 4. **分区技术**:在大型...
绑定变量的作用在于,即使SQL的谓词部分(如WHERE子句)的值不同,Oracle也能通过使用相同的哈希值将它们视为同一SQL。例如,使用绑定变量":X"的SQL `SELECT salary FROM user WHERE name=:X`可以替代多个特定名字的...