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

动态SQL实现

阅读更多
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实现原理.pdf

    ### MyBatis动态SQL实现原理 #### 一、XML文档中的节点概念 在深入了解MyBatis如何支持SQL语句之前,我们首先需要了解XML文档的基本构成单元——节点。XML是一种非常灵活的数据格式,用于存储和传输数据。XML文档...

    在VC6中利用动态SQL实现对DB2访问.pdf

    "在VC6中利用动态SQL实现对DB2访问" 在VC6中利用动态SQL实现对DB2访问.pdf中的知识点有: 1. DB2通用数据库管理系统的介绍:DB2是一个流行的关系数据库管理系统,允许用户通过结构化查询语言来创建、修改和控制...

    利用Mybatis的动态SQL实现物理分页.pdf

    【标题】:“利用Mybatis的动态SQL实现物理分页” 【描述】:本文主要探讨了在实际项目中如何利用Mybatis的动态SQL功能来解决大数据量下的物理分页问题,以避免内存溢出。 【标签】:“SQL 数据库 数据处理 参考...

    SQLSERVER使用动态SQL实现修改表结构的案例

    这是一个基于MSSQLSERVER使用动态SQL实现修改表结构的案例,欢迎各位数据库爱好者借鉴或使用

    PowerBuilder中采用动态SQL实现公式处理.pdf

    总之,通过动态SQL技术在PowerBuilder中处理公式,可以简化算法实现,提高运算效率,减轻客户端负担,并且提供了更好的适应性和扩展性。这种方法尤其适合在C/S或三层结构的数据库应用中,处理用户自定义的数学公式和...

    hibernate实现动态SQL查询

    本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...

    用pb编写动态sql类型

    虽然没有明确的文件类型信息,但我们可以假设这可能是一些源代码文件(如.PBL库文件,.PBD工程文件,或者.PY、.TXT等文本文件),或者是包含了关于第三种动态SQL实现方式的文档。这些文件可能详细阐述了一种特定的...

    kettel循环执行动态sql

    通过这些组件的组合,Kettle能够实现灵活的动态SQL处理,例如遍历数据库中的所有表,为每个表生成并执行插入、更新或删除操作。这种能力对于数据仓库的初始化、数据同步和维护都是非常有用的。 总结来说,"Kettle...

    4-动态SQL语句编写.pdf

    这是一种常用的动态SQL实现方式,可以避免在拼接SQL语句时产生不合法的SQL。 #### 2. trim标签 trim标签用于处理SQL语句中的多余字符,比如在where条件后自动添加"and"或"or"关键字,或者在set语句中自动去除末尾...

    MyBatis动态SQL实现配置过程解析

    MyBatis 动态 SQL 实现配置过程解析 MyBatis 是一个基于 Java 的持久层框架,它提供了动态 SQL 的功能,允许用户根据不同的条件生成不同的 SQL 语句。本文将详细介绍 MyBatis 动态 SQL 实现配置过程解析,并通过...

    动态封装SQL语句,配置文件的调用与封装

    MyBatis则提供了基于XML或注解的映射方式,通过动态SQL实现条件判断,使SQL构建更加便捷。 配置文件的调用与封装主要涉及到应用的配置管理。在大型项目中,配置通常存储在独立的配置文件中,如properties或yaml格式...

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

    本文将探讨Oracle中的动态SQL实现机制,重点介绍DBMS_SQL系统包的结构与使用方法,通过实例展示动态SQL的基本用法和相关技巧。 动态SQL是指在程序执行时才能确定的SQL语句,它与静态SQL相对。静态SQL的语句在编写...

    基于MyBatis中的动态SQL实现客户关系管理平台.zip

    使用 SpringMVC+MyBatis+Vue 实现,点击“保存”提交添加新客户表单并将数据存储到数据库,在右侧下方表格显示所有客户信息以及多条件查询:在右侧上方表单输入客户名称,选择地区、客户经理、客户等级,点击“查询”...

    SQLServer动态SQL语句的用法

    动态 SQL 语句可以用来实现复杂的业务逻辑,提高查询效率和灵活性。 普通 SQL 语句和动态 SQL 语句的区别 普通 SQL 语句是固定的,不能根据情况变化,而动态 SQL 语句可以根据情况变化生成不同的 SQL 语句。例如,...

    Mybatis实现动态代理,动态SQL

    "Mybatis实现动态代理,动态SQL" Mybatis框架可以通过配置的形式为DAO接口生成动态代理实现类,从而简化程序开发,提高开发效率。在实现动态代理时,需要满足以下条件:接口全命名必须和SQL映射文件中的namespace...

    《kettle中实现动态SQL查询》博客文章示例代码

    本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...

    动态SQL 并且把返回的值赋给变量

    ### 动态SQL 并且把返回的值赋给变量 在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行...

    ibatis动态SQL标签用法

    iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的...

    动态SQL与绑定变量

    - 执行DDL(Data Definition Language)语句,如创建表、视图等,这些语句无法通过静态SQL实现。 ### 2. 为什么使用动态SQL 虽然静态SQL具有编译时检查、更好的性能优化等优点,但其灵活性有限,无法应对所有编程...

    在VC6中利用动态SQL实现对DB2访问* (2001年)

    在VC6中利用动态SQL实现对DB2访问的方法是一个IT技术领域的专业论文主题,该主题涉及数据库操作、动态SQL语句的使用,以及特定编程语言(如C++)与数据库接口的结合。为了深入理解这一技术,我们可以从以下几个方面...

Global site tag (gtag.js) - Google Analytics