一、动态SQL概述

1. 静态SQL vs 动态SQL

①动态SQL是相对静态SQL而言的

②静态SQL特点:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量传递给SQL语句即可

  • specName = "张三";
  • exec sql select ... where Sname = :specName;

③动态SQL特点:SQL语句可以在程序中动态构造,形成一个字符串

  • sqltext = "delete from customers where cid = \'c006\'";
  • exec sql execute immediate :sqltext;

2. 动态SQL的作用

①如编写一个由用户确定检索条件的应用程序,我们就需要根据用户输入的条件来动态构造SQL语句(字符串)

二、动态SQL的两种执行方式

前提:SQL语句已经被构造在宿主语言的字符串变量中

1. 立即执行语句:运行时编译并执行

  • exec sql execute immediate :字符串变量;

2. 延迟执行语句:prepare-execute-using语句

①prepare语句先编译,编译后的SQL语句允许有动态参数

②execute语句执行,用using语句将动态参数值传递给编译好的SQL语句

  • exec sql prepare sql_temp from :字符串变量;
  • exec sql execute sql_temp using :动态参数;

3. 两种执行方式的比较

①立即执行方式:

strcpy(sqltext, "delete from customers where cid = 'C01'");        // 完整的SQL语句

...

exec sql execute immediate :sqltext;

exec sql commit work;

②延迟执行方式:

strcpy(sqltext, "delete from customers where cid = :dcid");        // 带参数的SQL语句

...

exec sql prepare delcust from :sqltext;

exec sql execute delcust using :cust_id;        // cust_id值传递给dcid变量

exec sql commit work;

③前一种方式中,字符串变量中没有“变量”参数,而后一种方式中,字符串变量中含有“变量”参数

三、数据字典及其作用

1. 数据字典的概念

①数据字典是系统维护的一些表或视图的集合,这些表或视图存储了数据库中各类对象的定义信息,这些信息又称作数据库的元数据(关于数据的数据)

②在不同的DBMS中,数据字典也被称为系统目录、目录表、系统视图等

③数据字典也是以关系的形式存储在磁盘上的,它具有特定的数据结构(以便高效访问内存)

2. 数据字典的内容:数据字典通常存储的是数据库和表的元数据,即模式本身的信息

①与关系相关的信息:关系名字、每个关系的属性名及其类型、视图的名字及其定义、完整性约束

②用户与账户信息

③统计与描述性信息:每个关系中元组的数目

④物理文件组织信息:关系是如何存储的(顺序/无序/散列等)、关系的物理位置

⑤索引相关的信息

补:应用程序员在构造动态SQL语句时可能需要①中的信息。

3. 可能的字典数据结构

  • Relation_metadata = (关系名, 属性个数, 存储方式, 物理位置)
  • Attribute_metadata = (属性名, 关系名, 域类型, 位置, 长度)
  • User_metadata = (用户名, 登录密码, 组)
  • Index_metadata = (索引名, 关系名, 索引类型, 索引属性)
  • View_metadata = (视图名, 视图定义)

4. Oracle的数据字典

①Oracle的数据字典由视图组成,它分为三种不同的形式,由不同的前缀标识

  • USER_:用户视图,用户所拥有的对象,在用户模式中
  • ALL_:扩展的用户视图,用户可访问的对象
  • DBA_:DBA视图,所有用户都可访问的DBA对象的子集

②如要使用Oracle数据字典中关于表的信息,Oracle定义了视图USER_Tables、ALL_Tables和DBA_Tables

③如要使用Oracle数据字典中关于表的列的信息,Oracle定义了视图USER_TAB_Columns、ALL_TAB_Columns...

④可以使用SQL语句来访问如上信息:select Column_Name from ALL_TAB_Columns where ...

⑤Oracle数据字典中还定义了其他视图,如TABLE_PRIVILEDGE、COLUMN_PRIVILEDGE、CONSTRAINT_DEFS等

5. SQLDA的概念

①SQLDA是一个内存数据结构,其内可装载关系模式的定义信息,如列的数目、每一列的名字和类型等

②通过读取SQLDA信息可以进行更为复杂的动态SQL的处理,不同DBMS提供的SQLDA格式并不是一致的

四、更为复杂的动态SQL:动态构造SQL语句,但欲访问的表名和字段名是未知的

①如针对一组表,编写由用户确定检索表和检索条件的查询程序

②要构造这样的一个SQL语句,需要了解数据字典和SQLDA

第15讲:嵌入式SQL语句(动态SQL)的更多相关文章

  1. 动态SQL是什么??什么是静态SQL,动态SQL的动态体现在哪里???

    首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程.在某种高级语言中 ...

  2. 如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;)。

    1.如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;). 2.select查询的多个字段之间要用逗号“,”分割,如果查询涉及多个表,那多个表之 ...

  3. (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

    本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...

  4. 基于简单sql语句的sql解析原理及在大数据中的应用

    基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...

  5. mybatis日志,打印sql语句,输出sql

    mybatis日志,打印sql语句,输出sql<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE ...

  6. JAVA sql语句动态参数问题

    对sql语句设置动态参数 import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverMan ...

  7. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

  8. LINQ to SQL语句对应SQL的实现

    LINQ to SQL语句(1)之Where LINQ to SQL语句(2)之Select/Distinct LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg LINQ ...

  9. SqlServer和Oracle中一些常用的sql语句9 SQL优化

    --SQL查询优化 尽量避免使用or,not,distinct运算符,简化连接条件 /*Or运算符*/ use db_business go select * from 仓库 where 城市='北京 ...

随机推荐

  1. 高性能go服务之高效内存分配

    高性能go服务之高效内存分配 手动内存管理真的很坑爹(如C C++),好在我们有强大的自动化系统能够管理内存分配和生命周期,从而解放我们的双手. 但是呢,如果你想通过调整JVM垃圾回收器参数或者是优化 ...

  2. 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变

      了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...

  3. 读数笔记_python网络编程3(4)

    4.套接字名与DNS 讨论网络地址,描述将主机名解析为原始IP地址的分布式服务 4.1. 主机名与socket 浏览器汇总一般键入域名.有些域名标识整个机构.如,python.org,而另一些指定了主 ...

  4. python模块下载备份

    https://pypi.org/ https://pypi.doubanio.com/simple/

  5. NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver ...

    显卡驱动找不到解决方案:亲测有效 step1:sudo apt-get install dkms step2:   sudo dkms install -m nvidia -v 390.129 nvi ...

  6. C++ int型负数除法取余问题

    1:关于除法,不管是正数还是负数都是向0取整的:10/4 = 2,10/(-4) = -2 2:负数取余,通过取模来判定 |小| % |大| = |小| 符号同前    |大| % |小| = |余| ...

  7. Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest dp

    E. The Contest A team of three programmers is going to play a contest. The contest consists of

  8. hashlib和hmac模块

    目录 一.hashlib模块 1.0.1 hash是什么 1.0.2 撞库破解hash算法加密 一.hashlib模块 1.0.1 hash是什么 hash是一种算法(Python3.版本里使用has ...

  9. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  10. body标签添加ontouchstart属性

    之前看别人的代码,发现他的body标签添加ontouchstart属性.即 <body ontouchstart> 上网查了一下原因,记录一下: 这个操作是进行手机端兼容处理的,防止伪类: ...