Jak odwołać się do tabel przez nazwę schematu z kursora?

0

Cześć,
Pisze cursor w Oracle (w MS SQL Server nie miałbym problemu) i nie potrafię przejść problemu - może nie do końca optymalny ale pracuję nad tym. Kod cursora:

DECLARE
    sqlq VARCHAR2(2000);
CURSOR pierwszy_kursor is
    select username as schema_name from sys.all_users WHERE username LIKE 'aaa%' order by username;
    nazwa VARCHAR2(20);
BEGIN
    OPEN pierwszy_kursor;
    loop
      FETCH pierwszy_kursor INTO nazwa;
          --Dbms_Output.put_line(nazwa);
            sqlq:='SELECT Count(*) FROM  '||nazwa||'.tabelax1;';
          --Dbms_Output.put_line(sqlq);
          EXECUTE IMMEDIATE sqlq;
      exit when pierwszy_kursor%notfound;
    END LOOP;
CLOSE pierwszy_kursor;
END;

Krótki opis co chcę uzyskać:
Mam około 120 schematów w bazie danych zaczynających się na aaa i w każdym z tych schematów jest tabelax1. Wyciągam nazwy schematów ale nie mogę się odwołać do tych tabel. Oba Dbms_Output.put_line zwarcają to co potrzebuję tylko EXECUTE IMMEDIATE zwraca błąd:

ORA-00911: invalid character
ORA-06512: at line 13

Czy mogę prosić o pomoc w rozwiązaniu problemu?

Z góry dziękuje i pozdrawiam,
Wooki24

1

Usuń końcowy średnik z konstruowanego zapytania i powinno być ok.

Zamiast:
sqlq:='SELECT Count(*) FROM '||nazwa||'.tabelax1;';

użyj:
sqlq:='SELECT Count(*) FROM '||nazwa||'.tabelax1';

Tak poza tym:
a) LIKE jest czułe na wielkość znaków, a w systemowym słowniku, Oracle trzyma nazwy schematów wielką literą, więc Twój LIKE 'aaa%' nie zwróci żadnego rekordu
b) Kursor możesz parametryzować nazwą schematu i używać OPEN pierwszy_kursor('MY_USER');
c) Nie masz obsługi warunków brzegowych przed wejściem do LOOPa.
d) Wykonujesz EXECUTE IMMEDIATE, ale nie zwracasz nigdzie wartości. EXECUTE IMMEDIATE sqlq into vCNT; (vCNT powinieneś zadeklarować i pewnie wyświetlić
dmbs_output.put_line(nazwa||' -> ' ||vCNT);)

1 użytkowników online, w tym zalogowanych: 0, gości: 1