Freigeben über


O2SS0352: BULK COLLECT INTO-Klausel in SELECT-Anweisung nicht konvertiert (Error)

In diesem Artikel wird erläutert, warum der SQL Server-Migrations-Assistent (SSMA) für Oracle die PL/SQL-Blöcke nicht konvertiert, wenn SELECT die Anweisung mit BULK COLLECT INTO Klausel und DISTINCT Klausel verwendet wird.

Hintergrund

Eine Auflistung ist eine sortierte Gruppe von Elementen, die alle denselben Typ aufweisen. Es ist ein allgemeines Konzept, das Listen, Arrays und andere vertraute Datentypen umfasst. Jedes Element verfügt über einen eindeutigen Tiefgestellt, der seine Position in der Auflistung bestimmt. Die DISTINCT Klausel gibt an, dass nur ein eindeutiger Wert im Resultset angezeigt werden kann. Die BULK COLLECT INTO Klausel bindet die Ausgabe der Abfrage an die Auflistung, was zu einer geringeren Kommunikation zwischen den PL/SQL- und SQL-Engines führt.

SSMA stellt einen Migrationspfad für Oracle-Sammlungen bereit. Wenn die Anweisung zum Auffüllen der SELECT Auflistung jedoch eine DISTINCT Klausel verwendet, generiert SSMA die Fehlermeldung.

Beispiel

Im folgenden Beispiel wird eine SELECT Anweisung mit einer Klausel und BULK COLLECT INTO Klausel DISTINCT verwendet:

CREATE OR REPLACE PROCEDURE BULK_COLLECT_WITH_DISTINCT
AS
BEGIN
    DECLARE
        TYPE tbl_type_DNAME IS TABLE OF varchar2(14);
        var_dname tbl_type_DNAME;
    BEGIN
        SELECT DISTINCT DNAME
        BULK COLLECT INTO var_dname
        FROM dept;

        IF var_dname.COUNT = 0 THEN
            DBMS_OUTPUT.PUT_LINE('No results!');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Results:');

            FOR i IN var_dname.FIRST..var_dname.LAST LOOP
                DBMS_OUTPUT.PUT_LINE(' DEPT NAME #' || var_dname(i));
            END LOOP;
        END IF;
    END;
END;

Wenn Sie versuchen, den vorherigen Code in SSMA zu konvertieren, wird die folgende Fehlermeldung generiert:

O2SS0352: BULK COLLECT INTO-Klausel in SELECT-Anweisung nicht konvertiert

Mögliche Abhilfen

Um den vorherigen PL/SQL-Block zu konvertieren, ersetzen Sie DISTINCT eine Klausel durch UNIQUE Klausel (ein Synonym von DISTINCT) wie folgt:

CREATE OR REPLACE PROCEDURE BULK_COLLECT_WITH_DISTINCT
AS
BEGIN
    DECLARE
        TYPE tbl_type_DNAME IS TABLE OF varchar2(14);
        var_dname tbl_type_DNAME;
    BEGIN
        SELECT UNIQUE DNAME
        BULK COLLECT INTO var_dname
        FROM dept;

        IF var_dname.COUNT = 0 THEN
            DBMS_OUTPUT.PUT_LINE('No results!');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Results:');

            FOR i IN var_dname.FIRST..var_dname.LAST LOOP
                DBMS_OUTPUT.PUT_LINE(' DEPT NAME #' || var_dname(i));
            END LOOP;
        END IF;
    END;

END;