在学习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的解析过程相关推荐

  1. oracle 测试sql执行时间_通过错误的SQL来测试推理SQL的解析过程

    这是学习笔记的第 1977 篇文章 如果抛出一个问题,你是如何理解MySQL解析器的,它和Oracle解析器有什么差别?相信大多数同学都会比较迷茫,因为这个问题很难验证,要不是看源码,要不就是查看书上 ...

  2. SQL语句的解析过程

    SQL语句的解析过程 由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程.在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同.本文是我在看了各种资料后手机 ...

  3. 如何防范SQL注入 SQL注入测试

    从测试来进行测试SQL注入. 首先,看看SQL注入攻击能分为以下三种类型: Inband: 数据经由SQL代码注入的通道取出,这是最直接的一种攻击,通过SQL注入获取的信息直接反映到应用程序的Web页 ...

  4. oracle错误(一) ORA-各种常见java.sql.SQLException小结

    ORA-00904: --invalid column name 无效列名ORA-00942: --table or view does not exist 表或者视图不存在ORA-01400: -- ...

  5. 怎么进行mysql注入测试_MySQL for Java的SQL注入测试

    只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 基本上参加工作了一段时间之后还是这么认为的, 没错, 这句是 ...

  6. SQL数据库挂起 SQL数据库附加报错 SQL数据库824错误修复

    SQL数据库挂起 SQL数据库附加报错 SQL数据库824错误修复 数据类型 MSSQL 2012 数据大小 4.5 GB 故障检测 附加数据库提示824错误 一般是由于断电非法关机导致页面损坏. 客 ...

  7. java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误

    文章目录 1.报错信息 2.原因分析 3.解决方案 1.报错信息 java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游 ...

  8. SqlMap自动化SQL注入测试工具简绍

    Sqlmap是一个开源的渗透测试工具,可以自动检测和利用SQL注入漏洞并接管数据库服务器.它配备了强大的检测引擎,为终极渗透测试仪提供了许多小众功能,以及从数据库指纹识别,从数据库获取数据到访问底层文 ...

  9. MySQL for Java的SQL注入测试

    2019独角兽企业重金招聘Python工程师标准>>> 只要你学JDBC,基本上所有的人都会和你说,Statement不能防止SQL注入, PreparedStatement能够防止 ...

最新文章

  1. Java基础-OOP特性之封装、继承、多态、抽象
  2. asp.net 学习笔记 代码块标记
  3. 打造完美的JS树形菜单
  4. fastadmin弹框提示不起作用 confirm
  5. SQL Server Profiler (SQL跟踪器)的简单使用
  6. 为什么自己设计的嵌入式系统不如工业级产品稳定?
  7. 数据可视化【四】Bar Chart
  8. 碳钢腐蚀速率计算公式_镁合金轮毂螺栓连接的电偶腐蚀行为
  9. VS2015 优化选项的开启
  10. 示波器采样速率单位Ms/s、Gs/s
  11. YUI Compressor Maven
  12. jflash烧录教程_Jflash烧录(windows)原理分析
  13. 无论产品经理是否逃离北上广,过硬的产品实力才能让自己始终拥有竞争力
  14. 服务器托管单线、双线以及多线如何区别
  15. 小程序中集成赞赏功能
  16. 双十二|Solidigm官方店铺 惊喜大放送 福利享不停
  17. Pycharm社区版下载与安装教程
  18. Office VBA开发经典-中级进阶卷(75元包邮)
  19. WIN10怎么安装SQL server2000数据库
  20. 小白IT:从0~明白带你体验python中做上帝感觉--一切皆对象,处处是多态——面向对象

热门文章

  1. 铁幕(Iron Curtain)
  2. COALESCE()、isnull()、nullif()函数的用法
  3. Python由于目标计算机积极拒绝,无法连接。错误解决
  4. controller 和 Action 之间的区别
  5. 深入浅出RxJava(三:响应式的好处)
  6. Vue axios发送Http请求
  7. slider使用TickPlacement获得游标效果
  8. notepad++的NppFTP插件远程连接linux操作系统
  9. 无监督学习典例:聚类
  10. 【大数据论文笔记】大数据技术研究综述