Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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;
Verwandte Konvertierungsnachrichten
- O2SS0334: BULK COLLECT INTO-Klausel nicht konvertiert (Fehler)
- O2SS0351: Konvertierung der Sammlungsmethode nicht unterstützt (Fehler)
- O2SS0407: Nicht unterstützter Sammlungsschlüsseltyp