2016-05-20 23 views
0

Ich habe versucht, Code zu verwenden, der die Anzahl der Elemente in einer Tabelle findet und in einer lokalen Variablen speichert. Ich möchte im Grunde nur die Existenz eines Datensatzes überprüfen, also wenn es einen einfacheren Weg gibt, dies zu tun. HierInformix SELECT INTO-Syntaxfehler

ist ein Beispiel, das ich von Speichern das Ergebnis einer Abfrage in einer Variablen (link) gefunden:

CREATE FUNCTION checklist(d SMALLINT) 
    RETURNING VARCHAR(30), VARCHAR(12), INTEGER; 

    DEFINE name VARCHAR(30); 
    DEFINE dept VARCHAR(12); 
    DEFINE num INTEGER; 

    SELECT mgr_name, department, 
      CARDINALITY(direct_reports) 
     FROM manager INTO name, dept, num 
     WHERE dept_no = d; 
    IF num > 20 THEN 
     EXECUTE FUNCTION add_mgr(dept); 
    ELIF num = 0 THEN 
     EXECUTE FUNCTION del_mgr(dept); 
    ELSE 
     RETURN name, dept, num; 
    END IF; 

END FUNCTION; 

Aber wenn ich versuche, meine eigene Version davon zu erstellen, bekomme ich einen Syntaxfehler. Ich habe keine Ahnung, was das Problem ist.

CREATE FUNCTION test() 
    RETURNING INTEGER AS num1; 

    DEFINE l_count INTEGER; 

    CREATE TEMP TABLE t_queued_calls (
     session_id DEC(18,0) PRIMARY KEY, 
     calling_number NVARCHAR(50) 
    ) WITH NO LOG; 

    INSERT INTO t_queued_calls VALUES (123456, '5555555555'); 
    SELECT COUNT(*) FROM t_queued_calls INTO l_count WHERE session_id = 123456; 

    DROP TABLE t_queued_calls; 
END FUNCTION; 
+0

zeigen die Fehlermeldung bitte – scaisEdge

+0

Der Fehler ist unspezifisch. "SQL Error (-201): Ein Syntaxfehler ist aufgetreten." Aber ich habe Linien 1 auf einmal gestrichen und auf die SELECT-Anweisung beschränkt. – TeePaps

+0

Ich habe einige Vorschläge geschrieben hoffe nützlich – scaisEdge

Antwort

4

Die Position der INTO Klausel ist in beiden Funktionen falsch. Die INTO-Klausel geht nach der Auswahlliste (die Liste der Ausdrücke nach dem Schlüsselwort SELECT) und vor der FROM-Klausel (siehe Informix "Handbuch zu SQL: Syntax" Handbuch auf der SELECT-Anweisung), wie in diesem Code:

CREATE PROCEDURE test() 
    RETURNING INTEGER AS num1; 

    DEFINE l_count INTEGER; 

    CREATE TEMP TABLE t_queued_calls (
     session_id DEC(18,0) PRIMARY KEY, 
     calling_number NVARCHAR(50) 
    ) WITH NO LOG; 

    INSERT INTO t_queued_calls VALUES (123456, '5555555555'); 
    SELECT COUNT(*) INTO l_count FROM t_queued_calls WHERE session_id = 123456; 

    DROP TABLE t_queued_calls; 

    RETURN l_count; 

END PROCEDURE; 

Auch die erste Funktion, wie in der Frage gezeigt, hat das gleiche Problem mit der Reihenfolge der Klauseln. Außerdem gibt es nicht immer einen Wert zurück, und die ursprüngliche Version der zweiten Funktion gibt nie einen Wert zurück (obwohl es dies sagt).

1

Das könnte mit der Tatsache zusammenhängen, der Einsatz nicht haben die Spalten nennen

your_column1, your_column2 zu Ihrem Tabellenschema

INSERT INTO t_queued_calls (your_column1, your_column2) VALUES (123456, '5555555555'); 
SELECT COUNT(*) FROM t_queued_calls INTO l_count WHERE session_id = 123456; 

und/oder die Anzahl der Spalte aus der Auswahl anpassen stimmen Sie nicht mit der Zahl überein und tippen Sie insertt ... Sie wählen un Feld nur, aber fügen Sie zwei Feld

ein und wählen Sie in ist merkwürdiges Format wählen ... wird normalerweise in eingefügt aber wählen Sie nicht verwenden in Klausel

+1

Wenn Sie "Embedded SQL" (die gespeicherte Prozedur Sprache, SPL, ist eine Variante von) Codierung, dann die INTO-Klausel gibt die Host-Variablen zum Speichern/Empfangen der Ergebnisse für jede Zeile der Abfrage. In diesem Zusammenhang folgt die INTO-Klausel hinter der SELECT-Liste und vor der FROM-Klausel. –

+0

@ JonathanLeffler danken .. für INTO Erklärung – scaisEdge