Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > количество строк


Автор: Petro123 20.8.2007, 13:19
Как в Pl/Sql узнать количество строк возвращаемых некоторым запросом

Автор: DimW 20.8.2007, 13:28
Цитата(Petro123 @  20.8.2007,  13:19 Найти цитируемый пост)
Как в Pl/Sql узнать количество строк возвращаемых некоторым запросом 

в pl/sql нельзя вернуть строки селектом в не куда, обычно это массив(в pl/sql существует 3 вида массивов), у массива есть свойство rowcount.

также вы можите обратиться к неявно открытому курсору после выполнения DML - sql%rowcount

можете выполнить запрос с теми же условиями:
Код

select count(*) from table_name where ваши_ условия
 

а лучше объясните для чего это вам нужно, возможно есть более изящьные способы это сделать.

Автор: Petro123 20.8.2007, 15:17
В общем при удалении строки из главной таблицы, нужно проверить есть ли записи в подчиненной, если нет то удалить,
там OnDeleteCascade стоит

Автор: DimW 20.8.2007, 15:40
Цитата(Petro123 @  20.8.2007,  15:17 Найти цитируемый пост)
В общем при удалении строки из главной таблицы, нужно проверить есть ли записи в подчиненной, если нет то удалить

при таком подходе придется блокировать всю дочернюю таблицу, что бы ограничить других пользователей от изменений данных, т.к. между проверкой дочерней таблицы и удалением строк в родительской может пройти транзакция от другова пользователя...

саветую убрать OnDeleteCascade, имхо от нее только вред smile

Автор: Petro123 21.8.2007, 18:26
почемуто
OPEN PROV;
I:= PROV%RowCount;
CLOSE PROV
всегда дает i = 0

Добавлено через 13 минут и 17 секунд
сори, курсоры то неявные

Автор: Petro123 21.8.2007, 18:49
если не трудно приведите пример

Автор: Petro123 21.8.2007, 19:13
Цитата

саветую убрать OnDeleteCascade, имхо от нее только вред 

Тогда записи в подч табл удалять вручную?! 

Автор: DimW 22.8.2007, 09:47
Цитата(Petro123 @  21.8.2007,  18:49 Найти цитируемый пост)
если не трудно приведите пример 


создаем таблицу:
Код

create table TEST
(
  ID   NUMBER,
  NAME VARCHAR2(50)
)

наполняем данными:
Код

begin
for i in 1..5
loop
  insert into test
  values (i, 'name'||i);
end loop;
end;


пример sql%rowcount:
Код

declare
cursor c is select id, name from test; -- для четвертого примера
v_id number; v_name varchar2(50);
begin
-- пример 1
update test
   set name = name
 where id in (1, 2);
dbms_output.put_line(sql%rowcount||' rows updating');  

-- пример 2
delete from test
where id in (3,4,5);
dbms_output.put_line(sql%rowcount||' rows deleting');

-- пример 3
insert into test
values(555, 'name555');     
dbms_output.put_line(sql%rowcount||' rows inserting');

-- пример 4
open c;
dbms_output.put_line(sql%rowcount||' rows (здесь по прежнему показывается "rows inserting")');
fetch c into v_id, v_name;
dbms_output.put_line(sql%rowcount||' rows fetched');
fetch c into v_id, v_name;
dbms_output.put_line(sql%rowcount||' rows fetched');
end;

получаем:
Код

2 rows updating
3 rows deleting
1 rows inserting
1 rows (здесь по прежнему показывается "rows inserting")
1 rows fetched
1 rows fetched


Цитата(Petro123 @  21.8.2007,  19:13 Найти цитируемый пост)
Тогда записи в подч табл удалять вручную?!

да! и это правельно! бесконтрольное удаление данных до добра не доводит.

Автор: DimW 23.8.2007, 10:01
тут что то не стыкуется, только что дошло....

Petro123, OnDeleteCascade ставится в одном случае, когда нужно что бы данные из дочерней таблицы удалялись автоматически при удалении данных из материнской. В то же время ты пытаешься этому помешать:
Цитата(Petro123 @  20.8.2007,  15:17 Найти цитируемый пост)
В общем при удалении строки из главной таблицы, нужно проверить есть ли записи в подчиненной, если нет то удалить

либо пусть удаляется автоматом, либо убери OnDeleteCascade - тогда оракл будет проверять наличие доч. записей.

объясни что тебе на самом деле нужно?

Автор: Petro123 23.8.2007, 14:31
да действительно с OnDeleteCascade я перемудрил чето,
выходит что ставил его, чтобы затем проверять на существование записей,
В общем допустим есть 2 таблы
 Клиенты   
     Id
     Name
     IdCar  - скажем код машины

  Машины
     Id
    Name

Поле IdCar является обязательным для заполнения.
Между Машины(Id) и  Клиенты (IdCar) связь 1 ко многим,
Вот.
При удаленнии машины естно нужно проверять чтобы она не была привязана ни к какому клиенту, только потом удалять. OnDeleteCascade конечно здесь лишнее, тк им пользоваться все равно не придется.
Но от проверки не обойтись.
можно было конечно завести 3-ю таблу где связывать IdClient и IdCar, но показалось так проще  
 
 

Автор: Sqlninja 23.8.2007, 15:05
Цитата(Petro123 @  21.8.2007,  18:26 Найти цитируемый пост)
почемуто
OPEN PROV;
I:= PROV%RowCount;
CLOSE PROV
всегда дает i = 0

Добавлено через 13 минут и 17 секунд
сори, курсоры то неявные 


Не курсоры неявные, а атрибуты читать после FETCH'a надо, блин. Откуда он там возьмется если ты его никуда не зафетчил?

Автор: DimW 23.8.2007, 16:11
Цитата(Petro123 @  23.8.2007,  14:31 Найти цитируемый пост)
При удаленнии машины естно нужно проверять чтобы она не была привязана ни к какому клиенту, только потом удалять. 

ну так оракл за тебя сам проверит клиентов, если они есть то он недаст удалить машину, только OnDeleteCascade убери. а если есть клиенты то что нужно делать?
не понимаю твоей проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)