国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

探索Oracle自動類型轉換(下)

IT那活兒 / 3185人閱讀
探索Oracle自動類型轉換(下)
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!!!

自動類型轉換常見錯誤

下面選擇一個在PL/SQL程序中的常犯錯誤說明自動類型轉換容易導致的問題,特別是DATE類型自動轉換導致問題,希望給予讀者一些警示,不要使用自動類型轉換,上篇文章已經說了這么多缺點,這里就不重復敘述了。
請看例子,為了簡單說明只建了表未插入數據,有興趣的可以自己插入數據測試一下:
DINGJUN123>DROP TABLE t;

表已刪除。

DINGJUN123>
CREATE TABLE t
2 (id NUMBER,
3 done_date DATE
4 );

表已創建。
--建立過程的時候并沒有報錯,我加了打印語句,方便下面看錯誤原因:
DINGJUN123>CREATE OR REPLACE PROCEDURE
2 sp_t (i_tabname VARCHAR2,i_date DATE,o_count OUT NUMBER)
3 /***********************************************************************
4 ||desc:根據傳入的表名和日期查詢大于此日期的記錄數
5 ||此函數應用的表都有相同的統計日期列done_date
6 ************************************************************************/
7 AS
8 v_sql VARCHAR2(1000);
9 BEGIN
10 v_sql := SELECT COUNT(*) FROM
11 || i_tabname || WHERE done_date>
12 || i_date;
13 DBMS_OUTPUT.PUT_LINE(v_sql);
14 EXECUTE IMMEDIATE v_sql INTO o_count;
15 END;
16 /

過程已創建。

DINGJUN123>VAR o_count NUMBER
DINGJUN123>SET SERVEROUTPUT ON
DINGJUN123>EXEC sp_t (t,SYSDATE,:o_count);
SELECT COUNT(*) FROM t WHERE done_date> 12-6月 -21
BEGIN sp_t (t, SYSDATE,:o_count); END;

*

第 1 行出現錯誤:

ORA-00933: SQL 命令未正確結束
ORA-06512: 在 "DINGJUN123.SP_T", line 14
ORA-06512: 在 line 1
看到錯誤了吧,日期類型發生了類型轉換,根據NLS_DATE_FORMAT和NLS_DATE_LANGUAGE參數設置自動變為字符串了,而且這個字符串還不是Oracle中的表示的字符串,看到了沒有,是12-6月 -21而不是12-6月 -21,很多人經常拼湊字符串的時候少了引號,當然這里拼湊加上引號是可以的,那么就有多次自動類型轉換,將v_sql改為:
v_sql := SELECT COUNT(*) FROM 
||i_tabname ||  WHERE done_date>
||chr(39)
||i_date
||chr(39);
上面的chr(39)就是單引號,因為在字符串中表示一個單引號比較麻煩,所以用chr(39)代替。然后重新編譯過程并測試:
DINGJUN123>ALTER SESSION SET NLS_DATE_FORMAT=YYYY-MM-DD;
會話已更改。

DINGJUN123>
EXEC sp_t (t, SYSDATE,:o_count);
SELECT COUNT(*) FROM t WHERE done_date> 2021-06-12

PL/SQL 過程已成功完成。

DINGJUN123>
PRINT o_count

O_COUNT
----------
0
首先SYSDATE轉為字符串,將SQL拼湊好,結果就是上面打印出的語句,然后執行SQL,右邊的2021-06-12遇到了左值是DATE類型,又進過一次類型轉換,將字符串轉為DATE類型,轉換的過程很復雜。這種拼湊SQL的方式也是不可取的
自動類型轉換特別是在日期類型的處理過程中,經常發生類似的錯誤,如果有很好的編碼習慣,這種錯誤是完全可以避免的,類似這樣的查詢,不應該使用常量直接拼湊,一般應使用綁定變量的方式:
DINGJUN123>CREATE OR REPLACE PROCEDURE
2 sp_t (i_tabname VARCHAR2,i_date DATE,o_count OUT NUMBER)
3 /***********************************************************************
4 ||desc:根據傳入的表名和日期查詢大于此日期的記錄數
5 ||此函數所有的表都有共同的統計日期列done_date
6 ************************************************************************/
7 AS
8 v_sql VARCHAR2(1000);
9 BEGIN
10 v_sql := SELECT COUNT(*) FROM
11 || i_tabname || WHERE done_date> : i_date ;
12 DBMS_OUTPUT.PUT_LINE(v_sql);
13 EXECUTE IMMEDIATE v_sql INTO o_count
14 USING i_date;
15 END;
16 /

過程已創建。

DINGJUN123>EXEC sp_t (t,sysdate,:o_count);
SELECT COUNT(*) FROM t WHERE done_date> : i_date

PL/SQL 過程已成功完成。

DINGJUN123>PRINT o_count
O_COUNT
----------

0


本文作者:丁 俊(上海新炬王翦團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129290.html

相關文章

  • 一次慢查詢暴露的隱蔽的問題

    摘要:最近解決了一個生產慢查詢的問題,排查問題之后發現一些比較隱匿且容易忽略的問題。所以實際在數據庫查詢如下可能這里發生一次隱式轉換。這次查詢走的是索引。 showImg(https://segmentfault.com/img/bVbmJNK?w=6000&h=4000); Photo by Iga Palacz on Unsplash 最近解決了一個生產 SQL 慢查詢的問題,排查問題之...

    missonce 評論0 收藏0
  • 深度學習即將攻陷的一個領域:NLP ACL2016優秀論文解

    摘要:而自然語言處理被視為深度學習即將攻陷的下一個技術領域,在今年全球較高級的學術會議上,我們也看到大量的在深度學習引入方面的探索研究。 深度學習的出現讓很多人工智能相關技術取得了大幅度的進展,比如語音識別已經逼近臨界點,即將達到Game Changer水平;機器視覺也已經在安防、機器人、自動駕駛等多個領域得到應用。 而自然語言處理(NLP)被視為深度學習即將攻陷的下一個技術領域,在今年全球較高級...

    alphahans 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<