Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Всем привет! Хотел по-быстрому собрать статистику по количеству строк в таблицах некоей схемы. Однако внезапно задачка оказалось сложной и трудозатратной... Мозг сломал уже, пытаясь победить её! Чувствую, что истина где-то рядом, а найти не могу :(. Вот исходный код:

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;


Если закомментировать
EXECUTE IMMEDIATE stmt INTO myTableRows;
, то
DBMS_OUTPUT.PUT_LINE(stmt);
генерирует абсолютно идеальные запросы вида
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;
. Каждый запрос по отдельности возвращает одну строку с числовым результатом (количество строк в таблице). Но когда выполняю этот анонимный PL/SQL блок, то все время выходит ошибка PLS-00382. Подозреваю что это связано с тем, что запрос возвращает не число, а рекордсет из одной строки с одним столбцом, содержащим число. Но как число из этого рекордсета поместить в myTableRows так, чтобы не возникала эта чертова PLS-00382!
5 апр 19, 15:26    [21854137]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
абсолютно идеальные запросы вида
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;
Изучи SQL Reference на предмет "идеальных" знаков препинания.
5 апр 19, 15:34    [21854144]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18091
Ты внатуре думаешь, что все навскидку помнят как звучит текст ошибки PLS-00382?

Беглым взглядом -- ';' добавлять не надо
5 апр 19, 15:35    [21854146]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
А что не так? Запрос работает:

К сообщению приложен файл. Размер - 22Kb
5 апр 19, 15:37    [21854151]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вячеслав Любомудров
Ты внатуре думаешь, что все навскидку помнят как звучит текст ошибки PLS-00382?


PLS-00382: выражение неправильного типа
5 апр 19, 15:38    [21854153]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вячеслав Любомудров
...';' добавлять не надо


Пробовал и без неё - не работает. По идее да, не надо.
5 апр 19, 15:40    [21854156]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
не работает
Полный стек ошибок.
5 апр 19, 15:44    [21854162]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Elic
знаков препинания.


А что не так со знаками препинания?
5 апр 19, 15:44    [21854163]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

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


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:
5 апр 19, 15:45    [21854165]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Убрал добавление двоеточия в stmt=..., но не помогает.


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:
5 апр 19, 15:48    [21854173]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Запрос вместо числа возвращает рекордсет из одной строки и одного столбца, который я пытаюсь запихнуть в переменную целочисленного типа?
5 апр 19, 15:49    [21854175]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
Usually a PL/SQL compilation error.
У тебя мозг есть?
5 апр 19, 15:50    [21854176]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Только спинной. Поэтому к гуру и обращаюсь.
5 апр 19, 15:51    [21854178]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18091
Под каким юзером пускаешь?
Попробуй заменить описание myTable varchar2(30);
5 апр 19, 15:51    [21854179]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вячеслав Любомудров,

под sys. я на эту тему не парюсь.
5 апр 19, 15:52    [21854182]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
Строка 16, столбец 23:
Планиметрию в школе не проходил?
5 апр 19, 15:53    [21854185]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вячеслав Любомудров
Попробуй заменить описание myTable varchar2(30);


Попробовал - не помогает, ошибка та же, в том же месте.
5 апр 19, 15:53    [21854186]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Elic
GrayMagellan
Строка 16, столбец 23:
Планиметрию в школе не проходил?


Проходил. Указывает вот сюда:

К сообщению приложен файл. Размер - 105Kb
5 апр 19, 15:56    [21854189]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

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

можете сказать где мой косяк?
5 апр 19, 15:56    [21854191]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
Указывает вот сюда:
Elic
У тебя мозг есть?
5 апр 19, 15:57    [21854192]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

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

и?
5 апр 19, 15:57    [21854194]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18091
Хм.., я не вижу
Но режет глаз использование NVARCHAR2
5 апр 19, 15:58    [21854197]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
можете сказать где мой косяк?
Тебе компилятор даже русским языком всё сказал и показал. Совсем тупой?
5 апр 19, 15:58    [21854198]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

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

да. спасите-помогите пожалуйста.
5 апр 19, 15:58    [21854199]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
GrayMagellan
да. спасите-помогите пожалуйста.
GrayMagellan
PLS-00382: выражение неправильного типа
5 апр 19, 16:00    [21854201]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить