在学习Oracle的时候,必然会接触到sql解析的过程。这个过程大体是这样的步骤。
1.对sql的文法检查,查看是否有文法错误,比如from,select拼写错误等。
2.在数据字典里校验sql涉及的对象是否存在。
3.将对象进行名称转换,比如同义词转义成对应的对象。比如select * from t t是一个同义词指向hr.test
4.检查语句的用户是否具有访问对象的权限
5.生成执行计划
6.将游标产生执行计划,sql文本装载入library cache所在的heap中。
这个过程看起来比较容易理解,但是实际中我们也不能死记硬背,如果想推理一下其中的有些步骤,其实不用很精细的trace也可以办到。我们就用最简单的sql语句来测试。
当然思路需要转换,要测试的是存在问题的sql语句,看oracle的编译器会给我们什么样的解释。
首先准备一个测试表
create table test (id number,name varchar2(30));
准备好之后,就开始测试一下。不过思路是用有问题的语句来测试,来推理。
下面的语句存在很多的问题,来看看oracle的反应。
select1 id1 from2 test1 where3 id1='aaa' group by4 id1 order by5 id1
*
ERROR at line 1:
ORA-24333: zero iteration count
首先解析发现select的语句错误其实后面from,where,group by,order by都有错误。但是首先发现是select的部分。可见解析还是从左至右的方向来做文法解析。
接着修复select的文法错误,来继续看看。
select id1 from test1 where3 id1='aaa' group by4 id1 order by5 id1
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
这个时候错误指向了id1而没有指向where3,可见编译器在处理的时候可能不知道该怎么处理了。这一点上出乎我的意料。修复where的文法错误继续测试。
select id1 from test1 where id1='aaa' group by4 id1 order by5 id1
*
ERROR at line 1:
ORA-00924: missing BY keyword
这个时候直接指向了group by的部分。通过这三个例子可以基本推理出文法解析是从左至右。对于是否存在表,是否字段存在问题都先不会解析。
然后我们修复了group by,order by的文法错误,继续测试。
select id1 from test1 where id1='aaa' group by id1 order by id1
*
ERROR at line 1:
ORA-00942: table or view does not exist
发现错误指向了test1,发现没有这个表。可见在文法解析之后开始校验是否存在这个表。这个时候还没有开始校验字段的情况。
修复了表名的错误,继续测试。
select id1 from test where id1='aaa' group by id1 order by id1
*
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
发现这个时候是在解析group by 的字段名,对于select,where,order by中的先不解析。
然后修复group by中的错误,继续测试。
select id1 from test where id1='aaa' group by id order by id1
*
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
发现解析到了where 子句中的字段值。这个时候select,order by中还没有开始解析。
修复where子句中的问题,继续测试。
select id1 from test where id1='aaa' group by id order by id1
*
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
这个时候错误就指向了select子句,这个时候就剩下了order by的部分。
修复select的部分。继续测试。
SQL> select id from test where id='aaa' group by id order by id1;
select id from test where id='aaa' group by id order by id1
*
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
终于指向了order by,可见order by的部分是语句执行的最后的部分。
通过上面的错误测试,可以发现能够基本得到语句解析中的处理顺序。
我们更深一步。看看如果字段id为number,赋予varchar2的数据,是否会在解析的时候校验出来。
SQL> select id from test where id='aaa' group by id order by id;
select id from test where id='aaa' group by id order by id
*
ERROR at line 1:
ORA-01722: invalid number
这个时候发现错误已经在校验数据的类型了。
怎么看出在解析的时候是否校验了数据类型呢,别急,来做一个操作即可。
SQL> delete from test ;
1 row deleted.
然后再次执行上面的语句。
SQL> select id from test where id='aaa' group by id order by id;
no rows selected
就会发现这个时候oracle好像处理不了这种场景了。
好了,oracle编译器已经很强大了。我们就最后以一个基本正常的语句结束。
SQL> select id from test where id='100' group by id order by id;
no rows selected
通过错误的sql来测试推理sql的解析过程
时间: 2024-10-08 15:20:13
通过错误的sql来测试推理sql的解析过程的相关文章
通过错误的sql来测试推理sql的解析过程(二)
之前总结过一篇 通过错误的sql来测试推理sql的解析过程 http://blog.itpub.net/23718752/viewspace-1848816/ 也算是以毒攻毒,当然也分析出来一些有意思的内容来,让原本看起来枯燥的内容有了更多的实践意义. 在后来小组内部做了一个分享总结,本来以为已经总结差不多了,但是发现真是集思广益,大家临时想出不少好的点子来,这也就是brainstroming的好处吧. 比如下面的错误sql,在解析的时候,会首先报错在group by的部分.在10g和11g
SQL语句的各个关键字的解析过程详细总结_MsSql
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程.在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同.本文是我在看了各种资料后手机总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习. SQL语句的解析顺序 简单的说一个sql语句是按照如下的顺序解析的: 1. FROM FROM后面的表标识了这条语句要查询的数据源.和一些子句如,(1-J1)笛卡尔积,(1-J2)ON过滤,(1-J3)添加外部列,所要应用的对象.F
SQL语句的各个关键字的解析过程详细总结
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程.在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同.本文是我在看了各种资料后手机总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习. SQL语句的解析顺序 简单的说一个sql语句是按照如下的顺序解析的: 1. FROM FROM后面的表标识了这条语句要查询的数据源.和一些子句如,(1-J1)笛卡尔积,(1-J2)ON过滤,(1-J3)添加外部列,所要应用的对象.F
关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试
server|分布式 关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试 MS DTC Report 1. MS DTC 背景 2. MSDTC 测试目的 3. MSDTC 测试环境 3.1 本次验证测试环境: 3.2 环境配置 3.3 验证MSDTC 3.4 创建验证用表 4. Linked Server测试 5.
SQL点滴7—使用SQL Server的attach功能出现错误及解决方法
原文:SQL点滴7-使用SQL Server的attach功能出现错误及解决方法 今天用SQL Server 2008的attach功能附加一个数据库,出了点问题,提示的错误是: Unable to open physical file "D:\Documents\Dalt\XXXX.mdf" Operating system error 5: "5(error not found)" (Microsoft SQL Server: Error 5120)"
Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程
原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.2.0.1337 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之二
php中sql注入漏洞示例 sql注入漏洞修复_php实例
在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符.通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等.这往往给骇客留下了可乘之机.轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS
SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)
原文:SQL Server 2012:SQL Server体系结构--一个查询的生命周期(第3部分)(完结) 一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法(Access Methods)前,更新操作和刚才SELECT语句流程是一模一样的. 这次存取方法(Access Methods)需要修改数据,因此在I/O请求传递前,修改的细节要存放于硬盘
分享一下SQL Server执行动态SQL的正确方式
SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL Server执行动态SQL有更深的了解 动态SQL:code that is executed dynamically.它一般是根据用户输入或外部条件动态组合的SQL语句块.动态SQL能灵活的发挥SQL强大的功能.方便的解决一些其它方法难以解决的问题.相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,而