Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
GrayMagellan
абсолютно идеальные запросы вида
SELECT COUNT(*) FROM SOME_SCHEMA_NAME.SOME_TABLE;
Изучи SQL Reference на предмет "идеальных" знаков препинания.
5 апр 19, 15:34    [21854144]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Ты внатуре думаешь, что все навскидку помнят как звучит текст ошибки 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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
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

Откуда: Владивосток
Сообщений: 18015
Под каким юзером пускаешь?
Попробуй заменить описание 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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
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

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

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
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. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
GrayMagellan
да. спасите-помогите пожалуйста.
GrayMagellan
PLS-00382: выражение неправильного типа
5 апр 19, 16:00    [21854201]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

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

да, гуглил... результаты неоднозначны. поэтому и решил спросить у уважаемого сообщества.
5 апр 19, 16:01    [21854205]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
GrayMagellan
да, гуглил...
Не нужно было. В отсутствие мозгов не поможет.
5 апр 19, 16:03    [21854209]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Да, не думал
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
dynamic_sql_stmt

String literal, string variable, or string expression that represents a SQL statement. Its type must be either CHAR, VARCHAR2, or CLOB.
5 апр 19, 16:03    [21854210]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Что за национализм? 8-D
5 апр 19, 16:05    [21854212]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
Вячеслав Любомудров
Что за национализм? 8-D
Картинка с другого сайта.
5 апр 19, 16:09    [21854214]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вячеслав Любомудров
Да, не думал
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
dynamic_sql_stmt

String literal, string variable, or string expression that represents a SQL statement. Its type must be either CHAR, VARCHAR2, or CLOB.


Вячеслав, спасибо большое за помощь! Исправил

stmt NVARCHAR2(200);


на

stmt VARCHAR2(200);


, и все заработало!
5 апр 19, 16:09    [21854215]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
GrayMagellan
stmt NVARCHAR2(200);
...
myOwner NVARCHAR2(200) := 'SOME_SCHEMA_NAME';
...


Какие ты слова знаешь.... Но:

Во многих знаниях, много печали. Преумножая знания, преумножаем скорьб ( C )
5 апр 19, 16:11    [21854218]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Elic
Вячеслав Любомудров
Что за национализм? 8-D
Картинка с другого сайта.
Ты слишком серьезен, будь проще, хотя бы в конце недели
5 апр 19, 16:11    [21854220]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
пока писал, уже разобрались
5 апр 19, 16:11    [21854221]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Вообще-то это уже тонкости, нет?

"2.1.1.1.3 VARCHAR2 Data Type
The VARCHAR2 data type specifies a variable-length character string in the database
character set. You specify the database character set when you create your database."

"2.1.1.1.5 NVARCHAR2 Data Type
The NVARCHAR2 data type specifies a variable-length character string in the national
character set. You specify the national character set as either AL16UTF16 or UTF8
when you create your database. AL16UTF16 and UTF8 are two encoding forms of the
Unicode character set (UTF-16 and CESU-8, correspondingly) and hence NVARCHAR2 is
a Unicode-only data type."
5 апр 19, 16:15    [21854223]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
В любом случае огромное спасибо всем, кто откликнулся! И тем, кто помогал, и тем, кто чморил :)... Ибо "тяжело в учении - легко в бою" (С) А. Суворов.
5 апр 19, 16:17    [21854229]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Хоспаде, да хтож тебя "чморил"?
Призывали подумать -- это было
Далее, в случае сомнений, проконсультироваться с первоисточником...
5 апр 19, 16:20    [21854230]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
GrayMagellan
Member

Откуда:
Сообщений: 188
Да я ни на кого не сержусь :). Все отлично! Ещё раз спасибо всем :). И Элику - тоже.
5 апр 19, 16:22    [21854235]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
Вячеслав Любомудров
Ты слишком серьезен, будь проще, хотя бы в конце недели Картинка с другого сайта.
Нужно уметь читать и понимать ошибки компилятора. И тебе тоже :)
5 апр 19, 17:23    [21854295]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE и PLS-00382  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18015
Не, я DBA
5 апр 19, 17:27    [21854297]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Oracle Ответить