2009-08-06 16 views
5

Próbuję uruchomić wiele instrukcji ddl w ramach jednej instrukcji Wykonaj natychmiastowe. Myślałem, że to będzie całkiem proste, ale wygląda na to, że się mylę.ORACLE Tworzenie partycji instrukcji DDL w ramach wykonywania natychmiastowego

Pomysł jest taki:

declare v_cnt number; 

begin 

select count(*) into v_cnt from all_tables where table_name='TABLE1' and owner = 'AMS'; 

if v_cnt = 0 then 

execute immediate 'CREATE TABLE TABLE1(VALUE VARCHAR2(50) NOT NULL) ALTER TABLE TABLE1 ADD (MYVAL2 NVARCHAR2(10))'; 

end if; 

end; 

jednak skutkuje błędem

ORA-00911: nieprawidłowy znak ORA-06512: w wierszu 10

Każdy z instrukcje wewnątrz partii działają poprawnie, jeśli wykonam je samodzielnie. i jeśli wezmę to oświadczenie i wykonam je, będzie działało dobrze (z; między dwoma instrukcjami). Jeśli usunę; między instrukcjami otrzymuję inny błąd dotyczący nieprawidłowej opcji: plan jest taki, że będę mógł zbudować tabelę, wyeksportować schemat tabeli dla tej tabeli, zawierający wszystkie jej instrukcje zmian, a następnie uruchomić partię przeciwko innemu systemowi jako część procesu instalacji/aktualizacji.

W jaki sposób mogę grupować te instrukcje DDL w ramach pojedynczego wykonania natychmiast? A może jest lepszy sposób na zrobienie tego, czego potrzebuję?

Jestem trochę nowicjuszem Oracle, muszę przyznać. Dziękuję wszystkim za cierpliwość.

Odpowiedz

2

Dlaczego potrzebujesz jedno NATYCHMIASTOWE WYKONANIE połączenia? Z pewnością po prostu wykonuj to jako 2 połączenia?

Należy pamiętać, że każde wyrażenie DDL zawiera domyślny COMMIT, więc nie ma żadnej korzyści z koniczności, aby wykonać to jako pojedyncze połączenie.

Ponadto, dlaczego nie ustawić poprawnie tabeli w pierwszym wywołaniu? Można to zrobić ...

CREATE TABLE Tabela 1 (wartość VARCHAR2 (50) NOT NULL, MYVAL2 NVARCHAR2 (10))

... zamiast konieczności 2 telefony.

Również, spojrzał na DBMS_METADATA ... może generować DDL dla obiektów takich jak tabele dla Ciebie.

+0

Tworzenie tabeli i zmiany są eksportowane jako pojedynczy plik, a teraz jest ich wystarczająco dużo, że warto spróbować zrobić to w 1 WYKONAJ NATYCHMIASTOWĄ vs wiele na obiekt db. – Beta033

+0

W takim przypadku sugerowałbym po prostu wygenerowanie poprawnego DDL w pierwszej kolejności. Spójrz na DBMS_METADATA. :-) – cagcowboy

+0

wygląda na to, że może rozwiązać mój problem. Niestety, oczywista odpowiedź była pod moim nosem. Wyuczona lekcja: nie używaj TOAD do tworzenia struktury wyjściowej, nawet jeśli jest w niej ciekawe menu GUI. – Beta033

4

Średnik nie jest częścią składni Oracle Oracle. SQL * Plus i inne narzędzia po stronie klienta używają średnika do sygnalizowania końca instrukcji SQL, ale serwer jej nie widzi.

Możemy zmusić SQL * Plus zdać średnik do DB:

SQL> set sqlterminator off 
SQL> select * from user_tables; 
    2/
select * from user_tables; 
         * 
ERROR at line 1: 
ORA-00911: invalid character 

jeśli wezmę to oświadczenie i wykonać go, to będzie działać dobrze (z; między sprawozdania 2) narzędzie klienta, którego używasz, dzieli je na dwa wywołania do bazy danych.

Nie sądzę, że możliwe jest przekazanie wielu instrukcji wewnątrz natychmiastowego wykonania.

Przypuszczam, że można wywołać natychmiastowo polecenie z ciągiem zawierającym anonimowy blok PL/SQL, z pojedynczymi wywołaniami do wykonania bezpośrednio w nim ... i nie wiem, jaki byłby cel.;)

+0

Moje doświadczenie jest takie samo: nie możemy przekazać wielu instrukcji wewnątrz instrukcji "WYKONAJ NATYCHMIAST". – Baodad

Powiązane problemy