powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический sql в функции
4 сообщений из 4, страница 1 из 1
Динамический sql в функции
    #40078974
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал простую функцию:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace function f_test(pn_doc_id in integer) return integer is
   ln_res   integer;
   lv_stmt varchar2(255);
begin
  lv_stmt := '
    select count(*) into :ln_res from docs where doc_id = '||pn_doc_id||';
  ';
  EXECUTE IMMEDIATE lv_stmt USING IN OUT ln_res;
  
  return(ln_res);
end;


Вызываю её:

Код: plsql
1.
select f_test(5) from dual;



Выдаётся ошибка, что при выполнении стэйтмента EXECUTE IMMEDIATE есть invalid character.

Не могу понять, что не так то?
...
Рейтинг: 0 / 0
Динамический sql в функции
    #40078975
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Не могу понять, что не так то?
В документации всё разъяснено.
Подсказка: into - это не SQL.
...
Рейтинг: 0 / 0
Динамический sql в функции
    #40078977
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Не могу понять, что не так то?
Документацию нужно читать!

Ну во-первых, вот это - where doc_id = '||pn_doc_id||'; - это прямо ай-ай-ай.
SELECT ... INTO - это конструкуция PL/SQL, а у вас в EXECUTE IMMEDIATE - SQL выражение. Потому и ругается.
Правильно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function f_test(pn_doc_id in integer) return integer is
   ln_res   integer;
   lv_stmt varchar2(255);
begin
  lv_stmt := 'select count(*) from docs where doc_id = :doc_id';
  EXECUTE IMMEDIATE lv_stmt into ln_res USING IN pn_doc_id;

  return ln_res;
end;
...
Рейтинг: 0 / 0
Динамический sql в функции
    #40078989
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор Кузьмич
verter
Не могу понять, что не так то?
Документацию нужно читать!

Ну во-первых, вот это - where doc_id = '||pn_doc_id||';
- это прямо ай-ай-ай.
SELECT ... INTO - это конструкуция PL/SQL, а у вас в EXECUTE IMMEDIATE - SQL выражение. Потому и ругается.
Правильно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function f_test(pn_doc_id in integer) return integer is
   ln_res   integer;
   lv_stmt varchar2(255);
begin
  lv_stmt := 'select count(*) from docs where doc_id = :doc_id';
  EXECUTE IMMEDIATE lv_stmt into ln_res USING IN pn_doc_id;

  return ln_res;
end;



Всё понятно, мне стыдно. Спасибо!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический sql в функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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