第15讲:嵌入式SQL语句(动态SQL)
一、动态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)的更多相关文章
- 动态SQL是什么??什么是静态SQL,动态SQL的动态体现在哪里???
首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程.在某种高级语言中 ...
- 如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;)。
1.如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;). 2.select查询的多个字段之间要用逗号“,”分割,如果查询涉及多个表,那多个表之 ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
- 基于简单sql语句的sql解析原理及在大数据中的应用
基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...
- mybatis日志,打印sql语句,输出sql
mybatis日志,打印sql语句,输出sql<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE ...
- JAVA sql语句动态参数问题
对sql语句设置动态参数 import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverMan ...
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- 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 ...
- SqlServer和Oracle中一些常用的sql语句9 SQL优化
--SQL查询优化 尽量避免使用or,not,distinct运算符,简化连接条件 /*Or运算符*/ use db_business go select * from 仓库 where 城市='北京 ...
随机推荐
- 从零开始的SpringBoot项目搭建
前言 今天是我加入博客园的第一天今天刚好学习到SpringBoot,就顺便记录一下吧 一.创建项目 1.创建工程 ① 通过File > New > Project,新建工程,选择Sprin ...
- RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- linux 的swap、swappiness及kswapd原理【转】
本文讨论的 swap基于Linux4.4内核代码 .Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑. 希望本文能让读者了解Linux对swap的使用大概是什么样子.阅读完 ...
- go语言设计模式之Strategy
package main import ( "flag" "fmt" "image" "image/color" &qu ...
- acwing 76. 和为S的连续正数序列
地址 https://www.acwing.com/problem/content/description/72/ 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数). 例如输入15,由 ...
- React: React的组件状态机制
一.简介 在React中,有两个核心的默认属性,分别是state和props.state会记录组件的状态,React根据状态的变化,会对界面做相应的调整或渲染.props则是数据流向属性,React通 ...
- IT兄弟连 Java语法教程 数组 使用foreach循环遍历数组元素
从JDK5之后,Java提供了一种更简单的循环:foreach循环,也叫作增强for循环,这种循环遍历数组和集合更加简洁.使用foreach循环遍历数组和集合元素时,无需获得数组或集合的长度,无需根据 ...
- Docker容器 MySQL中文乱码解决方案
docker exec进入容器 sudo docker exec -it 588340b778f6 bash 执行以下命令,将 character-set-server=utf8 写入mysql配置文 ...
- EF中获取当前上下文的表名
EF在处理并发上并不是很好,很多时候我们需要手动写sql操作数据库.但是在基类中我们如何获取当前服务仓储操作的表呢? 使用正则是其中一种解决办法 Repository.Table是一条查询语句,通过t ...
- PHP入门了解
1.五个基本概念 1.1静态页面和动态页面 静态页面:服务器不执行的页面 动态页面:服务器执行的页面 1.2客户端和服务器端 客户端:浏览器就是客户端 服务器端:给浏览者提供服务 1.3端 ...