2016-04-08 2 views
1

ich ein Stück sehr einfacher SQL, die ich nicht Arbeit machen ...Oracle Geheimnis eine Abfrage auf Zahlen mit Filtern

DECLARE 
RESTORE_ID NUMBER; 
counts NUMBER; 
BEGIN 
RESTORE_ID := 100014; 
SELECT COUNT(UPDATE_ID) INTO counts FROM TB_ENT WHERE UPDATE_ID = RESTORE_ID; 
DBMS_OUTPUT.PUT_LINE(counts); 
END; 

Wenn ich die oben ausgeführt, ist der Ausgang 0.

Wenn ich laufe es ohne die RESTORE_ID Variable mit der SELECT-Linie ersetzt:

SELECT COUNT(UPDATE_ID) INTO counts FROM TB_ENT WHERE UPDATE_ID = 100014; 

Sie erraten, die Ausgabe ist 1. Warum ??

+0

ist tb_ent.update_id ein NUMBER-Typ? könnte es ein VARCHAR2 sein? – kevinsky

+0

UPDATE_ID ist eine NUMMER und Primärschlüssel der Tabelle, die durch eine SEQUENCE festgelegt wird. – L4zl0w

+4

das funktioniert für mich auf oracle 11. Sie müssen keinen vollständigen Testfall gezeigt haben. Haben Sie eine Spalte namens RESTORE_ID in TB_ENT? – kevinsky

Antwort

4

Sie sollten vermeiden, die Namen von Spalten für Ihre Variablen zu verwenden. Hier ist Ihr Code neu geschrieben, um das zu tun. Ich mag auch Aliase für Tabellen, da ich denke, dass sie Abfragen mit vielen Joins kürzer hält.

DECLARE 
vRESTORE_ID NUMBER; 
vcounts NUMBER; 
BEGIN 
vRESTORE_ID := 100014; 
SELECT COUNT(te.UPDATE_ID) 
INTO vcounts 
FROM TB_ENT te 
WHERE te.UPDATE_ID = vRESTORE_ID; 
DBMS_OUTPUT.PUT_LINE(vcounts); 
END; 
+3

Weitere Informationen: [Priorität der Spaltennamen] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/namereolution.htm#LNPLS2038) (und der Rest dieses Abschnitts der Dokumentation). –

+0

Starten von lokalen Variablen mit lv_ oder etwas ähnliches ist immer hilfreich. –