powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE и PLS-00382
40 сообщений из 40, показаны все 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
EXECUTE IMMEDIATE и PLS-00382
    #39797397
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

да, гуглил... результаты неоднозначны. поэтому и решил спросить у уважаемого сообщества.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797400
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellanда, гуглил...Не нужно было. В отсутствие мозгов не поможет.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797401
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не думал https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
Код: plaintext
1.
2.
 dynamic_sql_stmt 

String literal, string variable, or string expression that represents a SQL statement. Its type must be either CHAR, VARCHAR2, or CLOB.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797402
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за национализм? 8-D
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797403
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровЧто за национализм? 8-D
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797404
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровДа, не думал https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317
Код: plaintext
1.
2.
 dynamic_sql_stmt 

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


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

Код: plsql
1.
stmt NVARCHAR2(200);



на

Код: plsql
1.
stmt VARCHAR2(200);



, и все заработало!
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797406
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrayMagellan stmt N VARCHAR2(200);
...
myOwner N VARCHAR2(200) := 'SOME_SCHEMA_NAME';
...


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

Во многих знаниях, много печали. Преумножая знания, преумножаем скорьб ( C )
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797408
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВячеслав ЛюбомудровЧто за национализм? 8-D
Ты слишком серьезен, будь проще, хотя бы в конце недели
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797409
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока писал, уже разобрались
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797411
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то это уже тонкости, нет?

"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."
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797417
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В любом случае огромное спасибо всем, кто откликнулся! И тем, кто помогал, и тем, кто чморил :)... Ибо "тяжело в учении - легко в бою" (С) А. Суворов.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797418
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоспаде, да хтож тебя "чморил"?
Призывали подумать -- это было
Далее, в случае сомнений, проконсультироваться с первоисточником...
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797422
GrayMagellan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я ни на кого не сержусь :). Все отлично! Ещё раз спасибо всем :). И Элику - тоже.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797466
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТы слишком серьезен, будь проще, хотя бы в конце недели
Нужно уметь читать и понимать ошибки компилятора. И тебе тоже :)
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE и PLS-00382
    #39797468
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, я DBA
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE и PLS-00382
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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