Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE и PLS-00382 / 25 сообщений из 40, страница 1 из 2
05.04.2019, 15:26
    #39797342
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Всем привет! Хотел по-быстрому собрать статистику по количеству строк в таблицах некоей схемы. Однако внезапно задачка оказалось сложной и трудозатратной... Мозг сломал уже, пытаясь победить её! Чувствую, что истина где-то рядом, а найти не могу :(. Вот исходный код:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CLEAR SCREEN;
SET SERVEROUTPUT ON;
DECLARE
  stmt NVARCHAR2(200);
  myTable DBA_TABLES.TABLE_NAME%TYPE;
  myTableRows INTEGER;
  myOwner NVARCHAR2(200) := 'SOME_SCHEMA_NAME';
  CURSOR C1 IS SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = myOwner ORDER BY TABLE_NAME;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 INTO myTable;
    EXIT WHEN C1%NOTFOUND;
    
    stmt := 'SELECT COUNT(*) FROM ' || myOwner || '.' || myTable || ';';
    DBMS_OUTPUT.PUT_LINE(stmt);

    EXECUTE IMMEDIATE stmt INTO myTableRows;
    DBMS_OUTPUT.PUT_LINE(myTable || '; count = ' || myTableRows);
  END LOOP;
  CLOSE C1;
END;



Если закомментировать
Код: plsql
1.
EXECUTE IMMEDIATE stmt INTO myTableRows;

, то
Код: plsql
1.
DBMS_OUTPUT.PUT_LINE(stmt);

генерирует абсолютно идеальные запросы вида
Код: plsql
1.
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;

. Каждый запрос по отдельности возвращает одну строку с числовым результатом (количество строк в таблице). Но когда выполняю этот анонимный PL/SQL блок, то все время выходит ошибка PLS-00382. Подозреваю что это связано с тем, что запрос возвращает не число, а рекордсет из одной строки с одним столбцом, содержащим число. Но как число из этого рекордсета поместить в myTableRows так, чтобы не возникала эта чертова PLS-00382!
...
Рейтинг: 0 / 0
05.04.2019, 15:34
    #39797347
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellanабсолютно идеальные запросы вида
Код: plsql
1.
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;

Изучи SQL Reference на предмет "идеальных" знаков препинания.
...
Рейтинг: 0 / 0
05.04.2019, 15:35
    #39797348
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Ты внатуре думаешь, что все навскидку помнят как звучит текст ошибки PLS-00382?

Беглым взглядом -- ';' добавлять не надо
...
Рейтинг: 0 / 0
05.04.2019, 15:37
    #39797352
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
А что не так? Запрос работает:
...
Рейтинг: 0 / 0
05.04.2019, 15:38
    #39797353
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Вячеслав ЛюбомудровТы внатуре думаешь, что все навскидку помнят как звучит текст ошибки PLS-00382?

PLS-00382: выражение неправильного типа
...
Рейтинг: 0 / 0
05.04.2019, 15:40
    #39797356
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Вячеслав Любомудров...';' добавлять не надо

Пробовал и без неё - не работает. По идее да, не надо.
...
Рейтинг: 0 / 0
05.04.2019, 15:44
    #39797361
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellanне работаетПолный стек ошибок.
...
Рейтинг: 0 / 0
05.04.2019, 15:44
    #39797362
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Elicзнаков препинания.

А что не так со знаками препинания?
...
Рейтинг: 0 / 0
05.04.2019, 15:45
    #39797363
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Elic,


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Error starting at line : 3 in command -
DECLARE
  stmt NVARCHAR2(200);
  myTable DBA_TABLES.TABLE_NAME%TYPE;
  myTableRows INTEGER;
  myOwner NVARCHAR2(200) := 'SOME_SCHEMA_NAME';
  CURSOR C1 IS SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = myOwner ORDER BY TABLE_NAME;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 INTO myTable;
    EXIT WHEN C1%NOTFOUND;

    stmt := 'SELECT COUNT(*) myCount FROM ' || myOwner || '.' || myTable || ';';
    --DBMS_OUTPUT.PUT_LINE(stmt);

    EXECUTE IMMEDIATE stmt INTO myTableRows;
    --DBMS_OUTPUT.PUT_LINE(myTable || '; count = ' || myTableRows);
    --DBMS_OUTPUT.PUT_LINE(myTable);
  END LOOP;
  CLOSE C1;
END;
Error report -
ORA-06550: Строка 16, столбец 23:
PLS-00382: выражение неправильного типа
ORA-06550: Строка 16, столбец 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
...
Рейтинг: 0 / 0
05.04.2019, 15:48
    #39797371
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Убрал добавление двоеточия в stmt=..., но не помогает.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Error starting at line : 3 in command -
DECLARE
  stmt NVARCHAR2(200);
  myTable DBA_TABLES.TABLE_NAME%TYPE;
  myTableRows INTEGER;
  myOwner NVARCHAR2(200) := 'SOME_SCHEMA_NAME';
  CURSOR C1 IS SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = myOwner ORDER BY TABLE_NAME;
BEGIN
  OPEN C1;
  LOOP
    FETCH C1 INTO myTable;
    EXIT WHEN C1%NOTFOUND;

    stmt := 'SELECT COUNT(*) myCount FROM ' || myOwner || '.' || myTable;
    --DBMS_OUTPUT.PUT_LINE(stmt);

    EXECUTE IMMEDIATE stmt INTO myTableRows;
    --DBMS_OUTPUT.PUT_LINE(myTable || '; count = ' || myTableRows);
    --DBMS_OUTPUT.PUT_LINE(myTable);
  END LOOP;
  CLOSE C1;
END;
Error report -
ORA-06550: Строка 16, столбец 23:
PLS-00382: выражение неправильного типа
ORA-06550: Строка 16, столбец 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
...
Рейтинг: 0 / 0
05.04.2019, 15:49
    #39797373
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Запрос вместо числа возвращает рекордсет из одной строки и одного столбца, который я пытаюсь запихнуть в переменную целочисленного типа?
...
Рейтинг: 0 / 0
05.04.2019, 15:50
    #39797374
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellan
Код: plsql
1.
Usually a PL/SQL compilation error.

У тебя мозг есть?
...
Рейтинг: 0 / 0
05.04.2019, 15:51
    #39797375
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Только спинной. Поэтому к гуру и обращаюсь.
...
Рейтинг: 0 / 0
05.04.2019, 15:51
    #39797376
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Под каким юзером пускаешь?
Попробуй заменить описание myTable varchar2(30);
...
Рейтинг: 0 / 0
05.04.2019, 15:52
    #39797378
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Вячеслав Любомудров,

под sys. я на эту тему не парюсь.
...
Рейтинг: 0 / 0
05.04.2019, 15:53
    #39797381
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellan
Код: plsql
1.
Строка 16, столбец 23:

Планиметрию в школе не проходил?
...
Рейтинг: 0 / 0
05.04.2019, 15:53
    #39797382
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Вячеслав ЛюбомудровПопробуй заменить описание myTable varchar2(30);

Попробовал - не помогает, ошибка та же, в том же месте.
...
Рейтинг: 0 / 0
05.04.2019, 15:56
    #39797384
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
ElicGrayMagellan
Код: plsql
1.
Строка 16, столбец 23:

Планиметрию в школе не проходил?

Проходил. Указывает вот сюда:
...
Рейтинг: 0 / 0
05.04.2019, 15:56
    #39797385
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Elic,

можете сказать где мой косяк?
...
Рейтинг: 0 / 0
05.04.2019, 15:57
    #39797386
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellanУказывает вот сюда:ElicУ тебя мозг есть?
...
Рейтинг: 0 / 0
05.04.2019, 15:57
    #39797387
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Elic,

и?
...
Рейтинг: 0 / 0
05.04.2019, 15:58
    #39797390
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Хм.., я не вижу
Но режет глаз использование N VARCHAR2
...
Рейтинг: 0 / 0
05.04.2019, 15:58
    #39797391
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellanможете сказать где мой косяк?Тебе компилятор даже русским языком всё сказал и показал. Совсем тупой?
...
Рейтинг: 0 / 0
05.04.2019, 15:58
    #39797392
GrayMagellan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
Elic,

да. спасите-помогите пожалуйста.
...
Рейтинг: 0 / 0
05.04.2019, 16:00
    #39797394
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXECUTE IMMEDIATE и PLS-00382
GrayMagellanда. спасите-помогите пожалуйста.GrayMagellan
Код: plsql
1.
PLS-00382: выражение неправильного типа
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE и PLS-00382 / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]