2017-02-20 89 views
2

我正在嘗試使用SQL Developer綁定變量提示來加快查詢執行速度,但我沒有得到所需的輸出:看起來像我放入的值得到轉換。SQL Developer綁定變量提示符:強制字符串值

表描述:

Nome    Null  Type   
------------------ -------- ------------ 
NUM    NOT NULL VARCHAR2(13) 
IS_OK      NUMBER(1) 

初始情況:

enter image description here

select NUM, IS_OK from numbers_table where NUM = cast(:dn as varchar2(13)); 

NUM   |IS_OK | 
------------|------| 
08331930078 |1  | 

工作更新:

1.

update numbers_table set IS_OK = 0 where NUM = 08331930078; 

2.

update numbers_table set IS_OK = 0 where NUM = '08331930078'; 

輸出繼電器:

'1 row updated' 

非工作更新:

update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13)); 

輸出繼電器:

'0 rows updated' 

不知道我還能做些什麼來強制將值解析爲字符串。

SQL Developer版本4.1.3.20

+2

沒有必要投入任何東西,您的查詢應該是:update numbers_table set IS_OK = 0其中NUM =:dn; –

+0

事實證明,它不會像那樣工作(這正是我最初設想的) – Dariopnc

回答

0

這很有趣,看起來像一個錯誤。你實際上並不需要轉換,從「輸入結合」窗口中的值是一個字符串,無論如何,所以此工程:

update numbers_table set IS_OK = 0 where NUM = :dn; 

時的零填充字符串08331930078的對話框中輸入。

演員不需要,但應該仍然工作。如果你作爲一個腳本來運行,而不是與一個定義綁定變量,那麼這兩種形式做的工作:

var dn varchar2(13); 
exec :dn := '08331930078'; 
update numbers_table set IS_OK = 0 where NUM = :dn; 
rollback; 
update numbers_table set IS_OK = 0 where NUM = cast(:dn as varchar2(13)); 
rollback; 

你得到1 row updated兩個語句。即使在同一個會話中的腳本中定義了綁定變量,仍然會提示並仍然具有相同(奇數)的行爲。

順便說一句,當你這樣做:

update numbers_table set IS_OK = 0 where NUM = 08331930078; 

你實際上在做,你可以看到形成執行計劃的謂語部分是:

update numbers_table set IS_OK = 0 where to_number(NUM) = 8331930078; 

這將阻止任何指數num列被使用,並可能導致意想不到的結果 - 在這種情況下,如果這些是例如英國的電話號碼可能不會具有與前導零相同的值,但通常需要謹慎。

+0

實際上,您發佈的第一個更新(帶有綁定變量但沒有顯式投射的更新)在我身邊不起作用,要麼是 – Dariopnc

+0

SQL Developer試圖變得聰明?也許它是看到所有的數字,並假設綁定變量是一個數字。因此,它將刪除前導0.當查詢運行時,我們得到一個隱式數據類型轉換,或者您執行顯式CAST();無論如何,弦已經失去了領先的0.只是一個理論... – BobC

+0

忘記那個理論... – BobC