1. 程式人生 > 資料庫 >Oracle基礎:通過sqlplus執行sql語句後的結果進行判斷

Oracle基礎:通過sqlplus執行sql語句後的結果進行判斷

這篇文章介紹一下如何對sqlplus執行的sql語句結果進行判斷。

環境準備

使用Oracle的精簡版建立docker方式的demo環境,詳細可參看:

https://www.jb51.net/article/153533.htm

常見問題

在sqlplus中執行sql語句,如果直接使用命令列的方式呼叫時會碰到兩個問題:

  • 問題1: 需要進行互動性的輸入
  • 問題2:結果的判斷不能通過返回值來確認

解決方式

在指令碼呼叫裡,解決方式如下

  • 問題1可以通過前文提到的Here Document來解決。
  • 問題2,則可以通過對輸出的判斷來進行,因為Oracle的錯誤程式碼基本以ORA-打頭,所以根據輸出中是否包含ORA-,基本可確認是否存在錯誤。

執行結果判斷示例

這裡使用命令列的方式進行驗證,直接拷貝到指令碼中即可以使用指令碼的方式與sqlplus進行整合。

oracle@e871d42341c0:~$ sqlplus system/liumiao123@XE <<EOF
> desc student
> delete from student;
> select * from student;
> insert into student values (1001,'liumiaocn');
> insert into student values (1001,'liumiao');
> insert into student values (1003,'michael');
> commit;
> select * from student;
> EOF
SQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 05:18:51 2018
Copyright (c) 1982,2011,Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> Name  Null? Type
 ----------------------------------------- -------- ----------------------------
 STUID  NOT NULL NUMBER(4)
 STUNAME   VARCHAR2(50)
SQL> 
3 rows deleted.
SQL> 
no rows selected
SQL> 
1 row created.
SQL> insert into student values (1001,'liumiao')
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL> 
1 row created.
SQL> 
Commit complete.
SQL> 
  STUID STUNAME
---------- --------------------------------------------------
  1001 liumiaocn
  1003 michael

SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
oracle@e871d42341c0:~$ echo $?
0
oracle@e871d42341c0:~$

從上文可以看到,三行insert的sql語句由於第二行的主鍵重複,出現錯誤,但是最終的結果使用命令列的方式無法對結果進行判斷,這是控制檯方式的常見場景,比如sftp或者ftp等也有此特點,一般常用的對應方式無法通過返回值進行判斷,只能通過輸出來進行判斷。

輸出資訊

輸出分為標準輸出和標準錯誤兩種,輸入輸出的FD分別為:

  • 標準輸入:0
  • 標準輸出:1
  • 標準錯誤:2

接下來我們看一下上文中的資訊那些是標準輸出,哪些是標準錯誤:

oracle@e871d42341c0:~$ sqlplus system/abcd1234@XE <<EOF 2>output.error 1>output.info
> desc student
> delete from student;
> select * from student;
> insert into student values (1001,'michael');
> commit;
> select * from student;
> EOF
oracle@e871d42341c0:~$ 
oracle@e871d42341c0:~$ cat output.error
oracle@e871d42341c0:~$ 
oracle@e871d42341c0:~$ cat output.info
SQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 05:24:44 2018
Copyright (c) 1982,Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> Name  Null? Type
 ----------------------------------------- -------- ----------------------------
 STUID  NOT NULL NUMBER(4)
 STUNAME   VARCHAR2(50)
SQL> 
2 rows deleted.
SQL> 
no rows selected
SQL> 
1 row created.
SQL> insert into student values (1001,'liumiao')
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL> 
1 row created.
SQL> 
Commit complete.
SQL> 
  STUID STUNAME
---------- --------------------------------------------------
  1001 liumiaocn
  1003 michael
SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
oracle@e871d42341c0:~$ 

可以看到錯誤資訊全在標準輸出中,標準錯誤中沒有資訊。

重定向標準輸出與錯誤判斷

雖然上述資訊中可以看到,標準錯誤中沒有資訊,這裡給出的方案是對應常見的控制檯方式的錯誤控制,為了保證標準錯誤的資訊不被遺漏,需要將標準錯誤和重定向到標準輸出中,在bshell中寫法如下:

>輸出檔名稱 2>&1

結合本文的例子,使用方式如下:

oracle@e871d42341c0:~$ sqlplus system/abcd1234@XE <<EOF >output.info 2>&1
> desc student
> delete from student;
> select * from student;
> insert into student values (1001,'michael');
> commit;
> select * from student;
> EOF
oracle@e871d42341c0:~$ 
oracle@e871d42341c0:~$ cat output.info
SQL*Plus: Release 11.2.0.2.0 Production on Mon Oct 22 05:29:31 2018
Copyright (c) 1982,'liumiao')
*
ERROR at line 1:
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
SQL> 
1 row created.
SQL> 
Commit complete.
SQL> 
  STUID STUNAME
---------- --------------------------------------------------
  1001 liumiaocn
  1003 michael
SQL> Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
oracle@e871d42341c0:~$

結果判斷

使用grep確認是否存在ORA-相關的資訊即可

oracle@e871d42341c0:~$ grep ORA- output.info
ORA-00001: unique constraint (SYSTEM.SYS_C007024) violated
oracle@e871d42341c0:~$ echo $?
0
oracle@e871d42341c0:~$

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結