SQL Developer bind-Variablen-Eingabeaufforderung ein: Kraft string-Werte

Ich versuche, SQL-Developer bind-Variablen-Eingabeaufforderung, um die Geschwindigkeit der Ausführung der Abfrage, aber ich bin nicht immer die gewünschte Ausgabe: sieht aus wie die Werte, die ich in umgewandelt in Anzahl.

Tabelle Beschreibung:

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

Ausgangssituation:

SQL Developer bind-Variablen-Eingabeaufforderung ein: Kraft string-Werte

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

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

arbeiten updates:

1.

update numbers_table set IS_OK = 0 where NUM = 08331930078;

2.

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

Ausgabe:

'1 row updated'

nicht arbeiten update:

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

Ausgabe:

'0 rows updated'

Weiß nicht, was kann ich sonst noch tun, um die Kraft, der Wert wird analysiert, wie ein string.

SQL Developer version 4.1.3.20

  • Es gibt keine Notwendigkeit zu werfen, alles, Ihre Abfrage: update numbers_table set IS_OK = 0, wo NUM = :dn;
  • Stellt sich heraus, es funktioniert so nicht (was war das, was ich ursprünglich angenommen)
InformationsquelleAutor Dariopnc | 2017-02-20



One Reply
  1. 1

    Das ist sehr interessant, und sieht aus wie ein bug. Braucht man eigentlich nicht zu wirken, wird der Wert aus der ‚enter bindet“ – Fenster ist ein string, wie auch immer, so funktioniert dies:

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

    wenn die null-string 08331930078 ist im dialog eingetragen.

    Wird der cast nicht gebraucht aber sollte noch funktionieren. Wenn Sie ausführen, ein script statt, mit einer definierten bind-Variablen, dann werden beide Formen funktionieren:

    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;

    Erhalten Sie 1 row updated für beide Aussagen. Gehen wir zurück zu laufen, als eine Aussage noch fordert und hat immer noch die gleiche (ungerade) Verhalten, auch wenn der bind-variable definiert wurde, in einem Skript in der gleichen Sitzung.

    Übrigens, wenn Sie das tun:

    update numbers_table set IS_OK = 0 where NUM = 08331930078;

    was Sie eigentlich tun, wie Sie sehen können, bilden die execution plans Prädikat Abschnitt:

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

    wird stop-jeder index auf die num Spalte verwendet wird, und führt möglicherweise zu unerwarteten Ergebnissen – in diesem Fall, wenn diese z.B. Großbritannien Telefonnummern, die Sie wahrscheinlich nicht haben, den gleichen Wert und ohne führende null, aber es ist etwas vorsichtig sein, im Allgemeinen.

    • eigentlich das erste update, das Sie geschrieben (der mit binding variable, aber ohne expliziten cast) funktioniert nicht auf meiner Seite, entweder
    • Könnte es sein, dass SQL-Entwickler versucht zu sein, zu klug? Vielleicht ist es zu sehen, alle Ziffern und der Annahme das der bind-variable ist eine Zahl. Als solche, es fällt die führende 0. Wenn die Abfrage ausgeführt wird, erhalten wir eine implizite Datentyp-Konvertierung oder Sie tun das explizite CAST(); so oder so, der string hat nun verloren die führende 0. Nur eine Theorie…
    • Vergessen, dass die Theorie…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.