Piotr
Głudkowski
Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...
Temat: Oracle: update z limitem wiesza aplikację????
Witam.Mam dziwny problem.
Jest w bazie na Oracle 10i tabela, w której jedno z pól nazywa się 'STA_I' i jest typu varchar2(1), ponadto jest pole 'ID' które jest kluczem głównym.
Potrzebuję zrobić update nie więcej niż 5-ciu wierszy, w których STA_I = 'N'. Update ma zmienić STA_I na 'P'. Załóżmy, że nie interesuje mnie kolejność wierszy - po prostu nie więcej niż 5 na raz i już.
W MSSQL robię to tak:
update TABELA
set STA_I = 'P'
where ID in ( select top (5) ID
from TABELA
where STA_I = 'N' )
W Oracle nie ma top(), więc wymyśliłem to tak:
update TABELA
set STA_I = 'P'
where ID in ( select ID
from ( select ID
from TABELA
where STA_I = 'N' )
where rownum < 5 )
I teraz obydwa zapytania śmigają pięknie z poziomu odpowiednich developerów (MSSQL i PL/SQL).
Zapytanie MSSQL działa też dobrze z poziomu aplikacji C#/.NET.
Natomiast zapytanie Oraclowe wiesza mi aplikację C#/.NET !!!!
Jako data providera używam wbudowanej w .NET framework klasy System.Data.OracleClient. Zwykłe selecty chodzą OK. Powyższy update wiesza aplikację :( bez rzucania jakiegokolwiek wyjątku!
I zarys aplikacji (pomijam sprawdzanie i obsługę błędów):
OracleConnection conn = new OracleConnection(connString);
conn.Open();
string sql = <zapytanie_oraclowe_jak_powyżej>
OracleCommand cmd = new OracleCommand(sql);
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
int i = (int)cmd.ExecuteNonQuery();
Write("Returns: " + i.ToString());
cmd.Dispose();
conn.Close();
conn.Dispose();
Czyli nic specjalnego.
WTF?????????Piotr G. edytował(a) ten post dnia 17.03.10 o godzinie 21:13