1.静态SQL是编译前语句完整的SQL语句,动态SQL就是编译前不完整的SQL。比如where后面跟的条件是变化的。
以前经常写的函数和存储过程中,总是要根据变化的条件来执行SQL操作。
简单例子,function是根据用户id,密码验证用户是否存在。
用于ID , 密码不能确定。
用三种方法写这个function
也就是实现动态SQL的三种方式。
1.
create or replace function f_login(
p_id t_user.u_id%type,
p_pwd t_user.u_pwd%type
) return number
is
sql_str varchar2(1000);
v_number number(1);
begin
sql_str:='select count(*) from t_user where u_id='||p_id||'and u_pwd='||p_pwd;
execute immediate sql_str into v_number;
return v_number;
end;
这种方法是用拼接字符串,使用execute immediate语句执行这个字符串包含的语句。
方式2
绑定变量
create or replace function f_login2(
p_id t_user.u_id%type,
p_pwd t_user.u_pwd%type
) return number
is
sql_str varchar2(1000);
v_number number(1);
begin
sql_str:='select count(*) from t_user where u_id=:x and u_pwd=:y';
execute immediate sql_str into v_number using p_id,p_pwd;
return v_number;
end;
x,y是变量占位符,使用using 将变量p_id,p_pwd赋给x,y.按照位置的顺序赋值。
类似jdbc中的PreparedStatement预编译,‘?’也是占位符,然后赋值。
这两种都是相同的原理,目的也是相同的,都是为了提高执行效率。通过软解析,重复使用编译结果。
第一种字符串拼接,由于sql语句的结构不固定,每次都要编译。效率很低,由于占用闩,影响并发。
而第二种方法虽然效率比第一种高。但也不需要这么做。
直接使用SQL
create or replace function f_login3(
p_id t_user.u_id%type,
p_pwd t_user.u_pwd%type
) return number
is
sql_str varchar2(1000);
v_number number(1);
begin
select count(*) into v_number from t_user where u_id=p_id and u_pwd=p_pwd;
return v_number;
end;
命名块的参数本来就是绑定变量。所以没必要向2那么做了。
如果要在PL/SQL块中执行DDL,只能用字符串拼接。
有个需求,根据表名删除表。
create or replace procedure sp_drop_table(
p_tname varchar
)
is
v_number number(6);
sql_str varchar2(1000);
begin
sql_str:='drop table '||p_tname;
execute immediate sql_str ;
insert into t_loggin values (seq1.nextval,sysdate,p_tname||'表被删除');
end;
如果:
create or replace procedure sp_drop_table(
p_tname varchar
)
is
v_number number(6);
sql_str varchar2(1000);
begin
drop table p_tname;
execute immediate sql_str ;
insert into t_loggin values (seq1.nextval,sysdate,p_tname||'表被删除');
end;
编译时不能通过的。
这和PL/SQL的编译机制有关。和权限的验证有关。
分享到:
相关推荐
### MyBatis动态SQL实现原理 #### 一、XML文档中的节点概念 在深入了解MyBatis如何支持SQL语句之前,我们首先需要了解XML文档的基本构成单元——节点。XML是一种非常灵活的数据格式,用于存储和传输数据。XML文档...
"在VC6中利用动态SQL实现对DB2访问" 在VC6中利用动态SQL实现对DB2访问.pdf中的知识点有: 1. DB2通用数据库管理系统的介绍:DB2是一个流行的关系数据库管理系统,允许用户通过结构化查询语言来创建、修改和控制...
【标题】:“利用Mybatis的动态SQL实现物理分页” 【描述】:本文主要探讨了在实际项目中如何利用Mybatis的动态SQL功能来解决大数据量下的物理分页问题,以避免内存溢出。 【标签】:“SQL 数据库 数据处理 参考...
这是一个基于MSSQLSERVER使用动态SQL实现修改表结构的案例,欢迎各位数据库爱好者借鉴或使用
总之,通过动态SQL技术在PowerBuilder中处理公式,可以简化算法实现,提高运算效率,减轻客户端负担,并且提供了更好的适应性和扩展性。这种方法尤其适合在C/S或三层结构的数据库应用中,处理用户自定义的数学公式和...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
虽然没有明确的文件类型信息,但我们可以假设这可能是一些源代码文件(如.PBL库文件,.PBD工程文件,或者.PY、.TXT等文本文件),或者是包含了关于第三种动态SQL实现方式的文档。这些文件可能详细阐述了一种特定的...
通过这些组件的组合,Kettle能够实现灵活的动态SQL处理,例如遍历数据库中的所有表,为每个表生成并执行插入、更新或删除操作。这种能力对于数据仓库的初始化、数据同步和维护都是非常有用的。 总结来说,"Kettle...
这是一种常用的动态SQL实现方式,可以避免在拼接SQL语句时产生不合法的SQL。 #### 2. trim标签 trim标签用于处理SQL语句中的多余字符,比如在where条件后自动添加"and"或"or"关键字,或者在set语句中自动去除末尾...
MyBatis 动态 SQL 实现配置过程解析 MyBatis 是一个基于 Java 的持久层框架,它提供了动态 SQL 的功能,允许用户根据不同的条件生成不同的 SQL 语句。本文将详细介绍 MyBatis 动态 SQL 实现配置过程解析,并通过...
MyBatis则提供了基于XML或注解的映射方式,通过动态SQL实现条件判断,使SQL构建更加便捷。 配置文件的调用与封装主要涉及到应用的配置管理。在大型项目中,配置通常存储在独立的配置文件中,如properties或yaml格式...
本文将探讨Oracle中的动态SQL实现机制,重点介绍DBMS_SQL系统包的结构与使用方法,通过实例展示动态SQL的基本用法和相关技巧。 动态SQL是指在程序执行时才能确定的SQL语句,它与静态SQL相对。静态SQL的语句在编写...
使用 SpringMVC+MyBatis+Vue 实现,点击“保存”提交添加新客户表单并将数据存储到数据库,在右侧下方表格显示所有客户信息以及多条件查询:在右侧上方表单输入客户名称,选择地区、客户经理、客户等级,点击“查询”...
动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL 语句和动态 SQL 语句的区别 普通 SQL 语句是固定的,不能根据情况变化,而动态 SQL 语句可以根据情况变化生成不同的 SQL 语句。例如,...
"Mybatis实现动态代理,动态SQL" Mybatis框架可以通过配置的形式为DAO接口生成动态代理实现类,从而简化程序开发,提高开发效率。在实现动态代理时,需要满足以下条件:接口全命名必须和SQL映射文件中的namespace...
本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...
### 动态SQL 并且把返回的值赋给变量 在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行...
iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的...
- 执行DDL(Data Definition Language)语句,如创建表、视图等,这些语句无法通过静态SQL实现。 ### 2. 为什么使用动态SQL 虽然静态SQL具有编译时检查、更好的性能优化等优点,但其灵活性有限,无法应对所有编程...
在VC6中利用动态SQL实现对DB2访问的方法是一个IT技术领域的专业论文主题,该主题涉及数据库操作、动态SQL语句的使用,以及特定编程语言(如C++)与数据库接口的结合。为了深入理解这一技术,我们可以从以下几个方面...