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

Код: 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
EXECUTE IMMEDIATE и PLS-00382
    #39797347
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanабсолютно идеальные запросы вида
Код: plsql
1.
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;

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

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

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

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

А что не так со знаками препинания?
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797363
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
EXECUTE IMMEDIATE и PLS-00382
    #39797371
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал добавление двоеточия в 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
EXECUTE IMMEDIATE и PLS-00382
    #39797373
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос вместо числа возвращает рекордсет из одной строки и одного столбца, который я пытаюсь запихнуть в переменную целочисленного типа?
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797374
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan
Код: plsql
1.
Usually a PL/SQL compilation error.

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

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

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

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

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

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

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

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

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


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