Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Уже сломал голову, пытаясь понять, что не нравится системе :(. Имею вот такой скрипт:

CLEAR SCREEN;
SET SERVEROUTPUT ON;
DECLARE
  vDB_N_SEGMENTS dba_segments.owner%TYPE := 'AAS';
  vDB_N_EXTENTS dba_extents.owner%TYPE := 'BBS';
BEGIN
  EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 Total_Gb FROM dba_segments WHERE owner = ' || vDB_N_SEGMENTS || ' GROUP BY owner';
  EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = ' || vDB_N_EXTENTS || ' GROUP BY owner';
END;


При попытке запустить его в SQL Developer получаю сообщение об ошибке:
Error starting at line : 3 in command -
DECLARE
  vDB_N_SEGMENTS dba_segments.owner%TYPE := 'AAS';
  vDB_N_EXTENTS dba_extents.owner%TYPE := 'BBS';
BEGIN
  EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 Total_Gb FROM dba_segments WHERE owner = ' || vDB_N_SEGMENTS || ' GROUP BY owner';
  EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = ' || vDB_N_EXTENTS || ' GROUP BY owner';
END;
Error report -
ORA-00904: "AAS": invalid identifier
ORA-06512: at line 5
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:


Что ему не нравится?! Помогите пожалуйста.
20 янв 16, 14:40    [18706186]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
литерал
Guest
попробуй вместо аас и ббс в декларе написать owner.
20 янв 16, 14:44    [18706210]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
123йй
Member

Откуда:
Сообщений: 1638
GrayMagellan,
'
20 янв 16, 14:52    [18706252]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 7134
DECLARE
  vDB_N_SEGMENTS dba_segments.owner%TYPE := 'AAS';
  vDB_N_EXTENTS dba_extents.owner%TYPE := 'BBS';
BEGIN
 -- EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 Total_Gb FROM dba_segments WHERE owner = ' || vDB_N_SEGMENTS || ' GROUP BY owner';
 -- EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 Total_Gb FROM dba_segments WHERE owner = ' || vDB_N_SEGMENTS || ' GROUP BY owner';
  dbms_output.put_line('SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = ' || vDB_N_EXTENTS || ' GROUP BY owner');
  dbms_output.put_line('SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = ' || vDB_N_EXTENTS || ' GROUP BY owner');
END;
/

SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = BBS GROUP BY owner
SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = BBS GROUP BY owner

PL/SQL procedure successfully completed.


Комментарии нужны?
20 янв 16, 14:53    [18706258]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
sql basics для чайников.
Guest
GrayMagellan,

какой смысл в динамичности этих селектов, куда девать результат?
20 янв 16, 14:53    [18706259]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
GrayMagellan,

синтаксис блюсти надо
помогает динамический код перед исполнением вывести и почитать
будет видно, что на месте (очевидно) литералов у вас непонятные ораклу слова
20 янв 16, 14:56    [18706278]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
Les
Member

Откуда: Москва
Сообщений: 438
GrayMagellan,
а тебе обязательно нужно это делать через execute immediate?
Может поступить проще?

CLEAR SCREEN;
SET SERVEROUTPUT ON;
DECLARE
vDB_N_SEGMENTS dba_segments.owner%TYPE := 'AAS';
vDB_N_EXTENTS dba_extents.owner%TYPE := 'BBS';
v_res_segments number;
BEGIN
--EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 Total_Gb FROM dba_segments WHERE owner = ' || vDB_N_SEGMENTS || ' GROUP BY owner';
--EXECUTE IMMEDIATE 'SELECT owner, SUM(bytes)/1024/1024/1024 "Total (Gb)" FROM dba_extents WHERE owner = ' || vDB_N_EXTENTS || ' GROUP BY owner';
select nvl(SUM(bytes)/1024/1024/1024,0) Total_Gb
into v_res_segments
from dba_segments
where owner = vDB_N_SEGMENTS;
dbms_output.put_line('vDB_N_SEGMENTS Total_Gb='||v_res_segments);
END;
/
20 янв 16, 15:11    [18706386]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
Les
Member

Откуда: Москва
Сообщений: 438
а если все таки захочешь обязательно строить через execute immeidate, то посмотри использование bind variable, там у тебя будет ключевое слово using. И для получения результата посмотри into
20 янв 16, 15:13    [18706399]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Что-то я, действительно, тупанул - надо было просто сделать в теле процедуры SELECT INTO, без всяких там EXECUTE IMMEDIATE. Ща попробую напрямую.
20 янв 16, 16:08    [18706833]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
В общем, финальный вариант имеет такой вид:
CLEAR SCREEN;
SET SERVEROUTPUT ON;
DECLARE
  vDB_NAME_IN_SEGMENTS dba_segments.owner%TYPE := 'AAS';
  vDB_NAME_IN_EXTENTS dba_extents.owner%TYPE := vDB_NAME_IN_SEGMENTS;
  vDB_SIZE_IN_SEGMENTS dba_segments.bytes%TYPE;
  vDB_SIZE_IN_EXTENTS dba_extents.bytes%TYPE;
BEGIN
  SELECT
    ROUND(SUM(bytes)/1024/1024/1024, 2)
  INTO
    vDB_SIZE_IN_SEGMENTS
  FROM
    dba_segments
  WHERE
    owner = vDB_NAME_IN_SEGMENTS
  GROUP BY
    owner;
  
  SELECT
    ROUND(SUM(bytes)/1024/1024/1024, 2)
  INTO
    vDB_SIZE_IN_EXTENTS
  FROM
    dba_extents
  WHERE
    owner = vDB_NAME_IN_EXTENTS
  GROUP BY
    owner;
    
  IF vDB_SIZE_IN_SEGMENTS = vDB_SIZE_IN_SEGMENTS THEN
    DBMS_OUTPUT.PUT_LINE('The database ' || vDB_NAME_IN_SEGMENTS || ' has has size ' || vDB_SIZE_IN_SEGMENTS || ' Gb and it same in dba_segments and dba_extents');
  ELSE
    DBMS_OUTPUT.PUT_LINE('The database ' || vDB_NAME_IN_SEGMENTS || ' has has size ' || vDB_SIZE_IN_SEGMENTS || ' Gb in dba_segments and ' || vDB_SIZE_IN_EXTENTS || ' Gb in dba_extents. They don''t equal!!!');
  END IF;
END;


И после запуска выдает следующий результат :):

PL/SQL procedure successfully completed.

The database AAS has has size ,02 Gb and it same in dba_segments and dba_extents
20 янв 16, 16:45    [18707051]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Всем большое спасибо за ответы, наставившие меня на путь истинный.
20 янв 16, 16:46    [18707056]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
А так задача этого скрипта такая - я указываю имя базы, а система мне возвращает ее объем. И также контролирует, нет ли глюков в Оракле на предмет расхождения статистики объема данных, которые я хотел проконтролировать через системные вьюхи.
20 янв 16, 16:47    [18707068]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Les, спасибо!
20 янв 16, 16:48    [18707072]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
матрос Кин
Guest
GrayMagellan
финальный вариант
Это ещё мало, теперь ты ещё за ним полдня бегать будешь...

GrayMagellan
нет ли глюков в Оракле

Cтолько букв, аж plsql и dbms_output, чтобы получить одну бесполезную строчку.
20 янв 16, 17:53    [18707542]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
K790
Member

Откуда:
Сообщений: 634
GrayMagellan,

IF vDB_SIZE_IN_SEGMENTS = vDB_SIZE_IN_SEGMENTS
а в чем профит такого условия?
20 янв 16, 17:57    [18707566]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
stax..
Guest
K790
GrayMagellan,

IF vDB_SIZE_IN_SEGMENTS = vDB_SIZE_IN_SEGMENTS
а в чем профит такого условия?

на NULL проверяет

.....
stax
20 янв 16, 18:01    [18707599]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
GrayMagellan
А так задача этого скрипта такая - я указываю имя базы, а система мне возвращает ее объем. И также контролирует, нет ли глюков в Оракле на предмет расхождения статистики объема данных, которые я хотел проконтролировать через системные вьюхи.
А почему ты решил, что это глюки? (нет, оно конечно бывает)
Но есть еще и корзина, например
tst> with t1 as (select owner, sum(bytes) bytes from dba_segments group by owner),
  2       t2 as (select owner, sum(bytes) bytes from dba_extents group by owner)
  3  select t1.owner, round(t1.bytes/1024/1024, 2) segs, round(t2.bytes/1024/1024, 2) exts,
  4         decode(sign(t1.bytes-t2.bytes), 0, '=', -1, '<', '>') s
  5  from t1, t2 where t1.owner=t2.owner;

OWNER                                SEGS       EXTS S
------------------------------ ---------- ---------- -
SYSTEM                              110.5     109.94 >
U1                                 932.94         12 >
APPQOSSYS                             .25        .25 =
XDB                                 87.94      87.94 =
SYS                               2621.19    2621.19 =
HR_NEW                               1.56       1.56 =
TRCA_USER                            2.25       2.25 =
SCOTT                                 .44        .44 =
U11                                    .5         .5 =
WMSYS                                7.38       7.38 =
OUTLN                                 .56        .56 =
DBSNMP                               2.75       2.75 =
TRCA                                21.81      21.81 =

13 rows selected.

tst> purge dba_recyclebin;

DBA Recyclebin purged.

tst> with t1 as (select owner, sum(bytes) bytes from dba_segments group by owner),
  2       t2 as (select owner, sum(bytes) bytes from dba_extents group by owner)
  3  select t1.owner, round(t1.bytes/1024/1024, 2) segs, round(t2.bytes/1024/1024, 2) exts,
  4         decode(sign(t1.bytes-t2.bytes), 0, '=', -1, '<', '>') s
  5  from t1, t2 where t1.owner=t2.owner;

OWNER                                SEGS       EXTS S
------------------------------ ---------- ---------- -
SYSTEM                             109.94     109.94 =
U1                                     12         12 =
APPQOSSYS                             .25        .25 =
XDB                                 87.94      87.94 =
SYS                               2621.19    2621.19 =
HR_NEW                               1.56       1.56 =
TRCA_USER                            2.25       2.25 =
SCOTT                                 .44        .44 =
U11                                    .5         .5 =
WMSYS                                7.38       7.38 =
OUTLN                                 .56        .56 =
DBSNMP                               2.75       2.75 =
TRCA                                21.81      21.81 =

13 rows selected.
21 янв 16, 03:40    [18708733]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
DBA_EXTENTS, как ты уже показал, по определению показывает экстенты не всех сегментов. Если посмотреть определение DBA_EXTENTS, то там:

  and bitand(NVL(ds.segment_flags, 0), 1) = 1
  and bitand(NVL(ds.segment_flags,0), 65536) = 0


где ds это SYS_DBA_SEGS в котором segment_flags это NVL(s.spare1,0) где s это sys.seg$. Для корзины

bitand(NVL(ds.segment_flags,0), 65536) = 1


посему, как ты уже показал, корзина в DBA_EXTENTS не входит. А вот у каких сегментов

bitand(NVL(ds.segment_flags, 0), 1) = 0


не знаю, но они так-же не войдут.

SY.
21 янв 16, 04:37    [18708742]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54390
GrayMagellan
В общем, финальный вариант имеет такой вид:
  SELECT
    ROUND(SUM(bytes)/1024/1024/1024, 2)
  INTO
    vDB_SIZE_IN_EXTENTS
  FROM
    dba_extents
  WHERE
    owner = vDB_NAME_IN_EXTENTS
  GROUP BY;
    
нахрена GROUP BY?
21 янв 16, 07:17    [18708808]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
create/move/rebuild
Guest
SY
А вот у каких сегментов

bitand(NVL(ds.segment_flags, 0), 1) = 0


не знаю, но они так-же не войдут.
темп?
21 янв 16, 10:00    [18709123]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Нет
У темпа там свои флажки (см rdbms/admin/dcore.bsq / sql.bsq)
Флаг "0x1 - bitmapped tablespace: KTSSEGM_FLAG_BITMAPPED_TS" (в 8.1.7 такое же) на мой взгляд -- это "переходное состояние" при создании/удалении записей о сегменте. Либо кривые записи от предыдущих миграций (устаревшее).
И это вряд ли относится к DMT

И еще, как-то проскакивала информация, что в словаре "удаленные" записи не сразу удаляются, а просто проставляется определенный признак, а фактическое удаление/перезапись происходит потом. Я не про то, как происходит с записями в file$ или ts$.
21 янв 16, 10:14    [18709160]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы в простейшей процедуре  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Ну кроме KTSSEGM_FLAG_BITMAPPED_TS тут и сегменты с NULL segment_flags - неясно какие это сегменты.

SY.
21 янв 16, 16:00    [18711603]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить