Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Администрирование Oracle Database:
- Установка и настройка базы данных
- Обновление, применение патчей
- Оптимизация, настройка производительности
- Обучение, подготовка персонала, оптимизация
  • Страница:
  • 1
  • 2

ТЕМА:

Определить наличие данных в таблицах 12 года 10 мес. назад #641

Доброго всем дня.
Мне понадобилась ежедневно просматривать наличие базы а таблицах. Но, не во всех подряд,а в тех которые мне понадобятся. И этот список будет хранится в определённой таблице данных.
Сделать список таблиц которые мне стоит проверять для меня не составит труда написать, но я долго ломал себе голову и не пойму как в этот список подставлять запрос проверки данных.
Только начал учить PL/SQL. Это цикл какой-то дожен быть? Подскажите если не сложно!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Определить наличие данных в таблицах 12 года 10 мес. назад #642

Если ваша задача узнать какое количество строк, то можно попробовать воспользоваться вьюхой all_tables (поле num_rows). Но если хотите чтоб она работала, статистика по таблице должна быть актуальной!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Определить наличие данных в таблицах 12 года 10 мес. назад #644

я так поняла что динамический sql это именно, то что мне надо. Хотелось бы услышать советы человека который очень серьёзно занимается sql-ом. Нашла парочку примеров, но они какие-то невзрачные и не понятные, а хочется по быстрее разобраться. Например есть у нас 2 таблички а и Б и во всех есть поле time_info которое кроет в себе дату. Своим запросом хочу узнавать была ли какае-то запись за сегодняшний день. Если нет, то я вписую в табличку result , дату и число таблицы в которой отсутствует таблица.
Как сделать такую схему с помощью динамического запроса?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Определить наличие данных в таблицах 12 года 10 мес. назад #646

вот такой пример можно сделать как-то вот так. ( если что-то работать не будет, вы не судите строго потому что очень спешила и делала на быструю руку)
create table a (time_info date);
 create table b (time_info date);
--Таблица с именами исследуемых таблиц
 create table c (table_name varchar(100));
--Заполняем таблицы хламом
 insert into a select created from all_objects;
 insert into b select created-1 from all_objects;
--Заполняем имена
 insert into c (table_name) values ('a');
 insert into c (table_name) values ('b');
set serveroutput on;
declare
    stmt                varchar(1000);
    stmt_first_part     varchar(1000)   := 'select count(*) from ';
    stmt_last_part      varchar(1000)   := ' where time_info>=trunc(sysdate)';
    cur                 integer;            
    ret                 integer;
    cnt                 integer;                
begin 
    for r in (select table_name from c)
    loop
        --Компонуем наш селект в строковую переменную
        stmt:=stmt_first_part||r.table_name||stmt_last_part;
        --Создаём под него курсор
        cur := dbms_sql.open_cursor;
        --Парсим наш селект для курсора. Третий параметр это так сказать спецификация диалекта sql с которого надо парсить.
        dbms_sql.parse(cur, stmt, DBMS_SQL.NATIVE);
        --Связываем номер вовращаемого столбца с необходимой нам переменной
        dbms_sql.define_column(cur,1,cnt);
        --Выполняем запрос (читай курсор)
        ret := dbms_sql.execute(cur);
        if  dbms_sql.fetch_rows(cur) > 0   then
    --Если в результате что-то получили, то вытаскиваем этот результат в переменную cnt
         dbms_sql.column_value(cur,1,cnt);
             if cnt>0 then 
           --Если количество больше 0 (а путем не сложных соображений понятно что это правда для таблицы 'a')
           --то радостно сообщаем об этом миру!!!
                       dbms_output.put_line('Table '||r.table_name||' has data for today');
             else 
           --Если нет, то грустно говорим правду. :)
                       dbms_output.put_line('Table '||r.table_name||' has no data for today');
             end if;
        end if;
        --Закрываем курсор;
        dbms_sql.close_cursor(cur);
    end loop;
end;
/
В результате:

Table a has data for today
Table b has no data for today

Ну я думаю как сделать вставку в таблицу result вы сами поймёте как сделать.B)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Определить наличие данных в таблицах 12 года 10 мес. назад #647

так, а вот это по хоже именно, то что мне нужно. попробую конечно сама разобраться, но если не получится, то спрошу совету у вас снова. но, заранее спасибо

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Определить наличие данных в таблицах 12 года 10 мес. назад #648

Теперь нам стоит чтоб дать упругости, нужно сделать так чтоб передавать как параметр делать проверку на ещё одно значение по другим табличкам ( примерно будет так в таблице С валяется список таблиц который предоставили вы мне, а в таблице D, список множества полей из этих табличек , таблицы связаны по id (c.id = d.id)).
Как сделать так чтоб процедура принимала внешние параметры? Или всё это можно осуществить как-то изнутри?
CREATE OR REPLACE PROCEDURE checkData(ne in varchar2)
is
declare
    stmt                varchar(1000);
    stmt_first_part     varchar(1000)   := 'select count(*) from ';
    stmt_last_part      varchar(1000)   := ' where time_info>=trunc(sysdate)';
    stmt_param_2     varchar(1000)  : = ' and' ||ne|| 'is NOT NULL '
    cur                 integer;            
    ret                 integer;
    cnt                 integer;                
begin 
    for r in (select table_name from c)
        stmt:=stmt_first_part||r.table_name||stmt_last_part;
           IF stmt_param_2 IS NOT NULL 
              stmt := stmt||stmt_param_2
           END IF
....

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
Время создания страницы: 0.211 секунд