一、动态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. jmeter控制器(四)

    交替控制器: 交替控制器主要是让控制器里面的请求顺序执行,如下图设置了审批管理循环3次,那么第一次运行就执行了请假模块,第二次运行执行了请假模块1,第二次执行了请加模块2,依顺序每一个请加模块只执行一 ...

  2. 实时同步sersync实战

    目录 实时同步sersync实战 什么是实时同步 sersync和rsync+inotify对比 sersync项目实战 安装rsync的服务端(backup) NFS服务端部署sersync 实时同 ...

  3. bay——巡检RAC操作.txt

    Oracle Cluster Software 包括下列组件:Event Management (EVM)Cluster Synchronization Services (CSS)Cluster R ...

  4. python读写Excel方法(xlwt和xlrd)

    在我们做平常工作中都会遇到操作excel,那么今天写一篇,如何通过python操作excel,当然python操作excel的库有很多,比如pandas,xlwt/xlrd,openpyxl等,每个库 ...

  5. Python机器学习笔记——One Class SVM

    前言 最近老板有一个需求,做单样本检测,也就是说只有一个类别的数据集与标签,因为在工厂设备中,控制系统的任务是判断是是否有意外情况出现,例如产品质量过低,机器产生奇怪的震动或者机器零件脱落等.相对来说 ...

  6. awk命令使用整理

    1. awk默认以空格分隔, 可摘出指定位置的内容, 通常用法如下( 文件名称为file.txt ): 文件中行内容为:  12:3   a  4:56   b awk  '{print $1}'  ...

  7. "中国东信杯"广西大学第二届程序设计竞赛E Antinomy与红玉海(二分)

    题目大意: n个人,每个人想参加a[i]轮游戏,但每场游戏必须有个一个人当工具人 问最少有几场游戏 题解: 二分 答案范围:[0,sigma a[i]] check:首先a[i]>=ans,其次 ...

  8. bzoj3293 分金币

    题目链接 problem 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使 得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. so ...

  9. 基于SincNet的原始波形说话人识别

    speaker recognition from raw waveform with SincNet Mirco Ravanelli, Yoshua Bengio 作为一种可行的替代i-vector的 ...

  10. PHP面试常考之设计模式——建造者模式

    建造者模式 介绍 建造者模式又名生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 建造者模式是一步一步创建 ...