Czasami dostaję skrypt, który będzie działał poprawnie w SQL Developer lub Toad, ale wymaga modyfikacji, aby pomyślnie uruchomić z SQL * Plus. Oto najgorszy przykład zawierający wiele instrukcji z pustymi wierszami, średnikami i ukośnikami:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Z różnych powodów instrukcje te muszą być uruchamiane z SQL * Plus. Puste linie można łatwo rozwiązać za pomocą prostego ...
set sqlblanklines on
Wiem, że sqlterminator
można to zmienić i / lub wyłączyć, ale oba wymagają modyfikacji kodu, ten pierwszy przenosi problem bez jego rozwiązania i nie rozwiązuje problemu osadzonego ukośnika.
Najlepszą odpowiedzią byłby sposób na uruchomienie tych instrukcji bez modyfikacji poprzez zmianę środowiska w jakiś sposób (tak jak robi to sqlblanklines). Jeśli nie jest to możliwe, być może istnieje sposób na programową modyfikację skryptów. Staram się unikać ręcznych zmian.
źródło
Odpowiedzi:
Możesz to zrobić w większości za pomocą login.sql. login.sql jest wykonywany podczas - zaskakującego - logowania i jest ładowany z SQLPATH lub bieżącego katalogu. Dla podanych przykładów naprawdę wybrałeś najgorszy przypadek.
Problemem jest sqlterminator. Cokolwiek tam umieścisz, ukośnik jest zachowywany jako darmowy sqlterminator. Oprócz tego sqlplus najpierw skanuje w poszukiwaniu sqlterminatora i robi to przed skanowaniem do terminatora ciągów. Błąd, jeśli mnie zapytasz. Ukośnika do przodu można używać w ciągu, o ile nie jest on sam na osobnej linii. Gdy tylko sqlplus znajdzie znak określony jako sqlterminator, ignoruje wszystko inne i przestaje czytać.
Ukośnik do przodu może być obsługiwany, o ile nie jest sam na linii.
login.sql zawiera:
leigh.sql zawiera:
uruchom skrypt:
Nie musisz majstrować przy blokach początkowych / końcowych. Nie może obsłużyć polecenia sqlterminator wewnątrz polecenia, bez względu na to, gdzie się znajduje, w ciągu znaków, czy nie, nie może obsłużyć wierszy z samym ukośnikiem w linii w ciągu.
źródło
Wstawianie instrukcji z pustymi wierszami i średnikami zakończy się powodzeniem, jeśli zostaną umieszczone w blokach BEGIN ... END. Tej zmiany można dokonać za pomocą skryptu, ale skrypt nie powiedzie się, jeśli zawiera instrukcje DDL, których nie można uruchomić w bloku bez natychmiastowego wykonania.
To rozwiązanie również nie rozwiązuje problemu osadzonego / problemu.
źródło
Moje obejście:
Wygląda na to, że terminator poleceń jest ignorowany w instrukcji body.
źródło
źródło