Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> количество строк 
:(
    Опции темы
Petro123
Дата 20.8.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Как в Pl/Sql узнать количество строк возвращаемых некоторым запросом
PM MAIL   Вверх
DimW
Дата 20.8.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



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

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

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

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

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

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

Это сообщение отредактировал(а) DimW - 20.8.2007, 13:29
PM MAIL ICQ   Вверх
Petro123
Дата 20.8.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



В общем при удалении строки из главной таблицы, нужно проверить есть ли записи в подчиненной, если нет то удалить,
там OnDeleteCascade стоит
PM MAIL   Вверх
DimW
Дата 20.8.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



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

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

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

PM MAIL ICQ   Вверх
Petro123
Дата 21.8.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



почемуто
OPEN PROV;
I:= PROV%RowCount;
CLOSE PROV
всегда дает i = 0

Добавлено через 13 минут и 17 секунд
сори, курсоры то неявные
PM MAIL   Вверх
Petro123
Дата 21.8.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



если не трудно приведите пример
PM MAIL   Вверх
Petro123
Дата 21.8.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



Цитата

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

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

PM MAIL   Вверх
DimW
Дата 22.8.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(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 - 22.8.2007, 10:09
PM MAIL ICQ   Вверх
DimW
Дата 23.8.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



тут что то не стыкуется, только что дошло....

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

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

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


Это сообщение отредактировал(а) DimW - 23.8.2007, 10:04
PM MAIL ICQ   Вверх
Petro123
Дата 23.8.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 6.4.2007

Репутация: нет
Всего: нет



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

  Машины
     Id
    Name

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

Это сообщение отредактировал(а) Petro123 - 23.8.2007, 14:38
PM MAIL   Вверх
Sqlninja
Дата 23.8.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



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

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


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


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
DimW
Дата 23.8.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



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

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

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.