日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通过错误的sql来测试推理sql的解析过程

發(fā)布時間:2024/4/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过错误的sql来测试推理sql的解析过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在學(xué)習(xí)Oracle的時候,必然會接觸到sql解析的過程。這個過程大體是這樣的步驟。
1.對sql的文法檢查,查看是否有文法錯誤,比如from,select拼寫錯誤等。
2.在數(shù)據(jù)字典里校驗sql涉及的對象是否存在。
3.將對象進行名稱轉(zhuǎn)換,比如同義詞轉(zhuǎn)義成對應(yīng)的對象。比如select * from t t是一個同義詞指向hr.test
4.檢查語句的用戶是否具有訪問對象的權(quán)限
5.生成執(zhí)行計劃
6.將游標產(chǎn)生執(zhí)行計劃,sql文本裝載入library cache所在的heap中。
這個過程看起來比較容易理解,但是實際中我們也不能死記硬背,如果想推理一下其中的有些步驟,其實不用很精細的trace也可以辦到。我們就用最簡單的sql語句來測試。
當(dāng)然思路需要轉(zhuǎn)換,要測試的是存在問題的sql語句,看oracle的編譯器會給我們什么樣的解釋。
首先準備一個測試表
create table test (id number,name varchar2(30));
準備好之后,就開始測試一下。不過思路是用有問題的語句來測試,來推理。
下面的語句存在很多的問題,來看看oracle的反應(yīng)。
select1 id1 from2 test1 where3 id1='aaa' group by4 id1 order? by5 id1
*
ERROR at line 1:
ORA-24333: zero iteration count
首先解析發(fā)現(xiàn)select的語句錯誤其實后面from,where,group by,order by都有錯誤。但是首先發(fā)現(xiàn)是select的部分。可見解析還是從左至右的方向來做文法解析。
接著修復(fù)select的文法錯誤,來繼續(xù)看看。
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,可見編譯器在處理的時候可能不知道該怎么處理了。這一點上出乎我的意料。修復(fù)where的文法錯誤繼續(xù)測試。
select id1 from test1 where id1='aaa' group by4 id1 order? by5 id1
?????????????????????????????????????????? *
ERROR at line 1:
ORA-00924: missing BY keyword
這個時候直接指向了group by的部分。通過這三個例子可以基本推理出文法解析是從左至右。對于是否存在表,是否字段存在問題都先不會解析。
然后我們修復(fù)了group by,order by的文法錯誤,繼續(xù)測試。
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
發(fā)現(xiàn)錯誤指向了test1,發(fā)現(xiàn)沒有這個表。可見在文法解析之后開始校驗是否存在這個表。這個時候還沒有開始校驗字段的情況。
修復(fù)了表名的錯誤,繼續(xù)測試。
select id1 from test where id1='aaa' group by id1 order? by id1
??????????????????????????????????????????????? *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
發(fā)現(xiàn)這個時候是在解析group by 的字段名,對于select,where,order by中的先不解析。
然后修復(fù)group by中的錯誤,繼續(xù)測試。
select id1 from test where id1='aaa' group by id order? by id1
?????????????????????????? *
ERROR at line 1:
ORA-00904: "ID1": invalid identifier
發(fā)現(xiàn)解析到了where 子句中的字段值。這個時候select,order by中還沒有開始解析。
修復(fù)where子句中的問題,繼續(xù)測試。
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的部分。
修復(fù)select的部分。繼續(xù)測試。
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的部分是語句執(zhí)行的最后的部分。
通過上面的錯誤測試,可以發(fā)現(xiàn)能夠基本得到語句解析中的處理順序。
我們更深一步。看看如果字段id為number,賦予varchar2的數(shù)據(jù),是否會在解析的時候校驗出來。
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
這個時候發(fā)現(xiàn)錯誤已經(jīng)在校驗數(shù)據(jù)的類型了。
怎么看出在解析的時候是否校驗了數(shù)據(jù)類型呢,別急,來做一個操作即可。
SQL> delete from test ;
1 row deleted.
然后再次執(zhí)行上面的語句。
SQL> select id from test where id='aaa' group by id order? by id;
no rows selected
就會發(fā)現(xiàn)這個時候oracle好像處理不了這種場景了。
好了,oracle編譯器已經(jīng)很強大了。我們就最后以一個基本正常的語句結(jié)束。
SQL> select id from test where id='100' group by id order? by id;
no rows selected

總結(jié)

以上是生活随笔為你收集整理的通过错误的sql来测试推理sql的解析过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。