powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Dynamic SQL
13 сообщений из 13, страница 1 из 1
Dynamic SQL
    #39812675
Georgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, что не так делаю

Задача, используя динамический sql, написать функцию, которая бы возвращала кол-во строк по двум параметрам. первый параметр -- название столбца, второй -- его значение.
Например хочу подсчитать сколько всего строк с manager_id=100.

Пишу:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function empcount (colum_name varchar2, man_id number)
return integer is
l_query varchar2(200);
l_count integer;
begin
l_query:='select count(*) from employees where :manager_id=:id';
execute immediate l_query into l_count using colum_name, man_id;
return l_count;
end;

declare
l_count integer:=empcount('MANAGER_ID', 100);
begin
dbms_output.put_line(l_count);
end;



в итоге получаю:
Код: plsql
1.
2.
3.
ORA-01722: invalid number
ORA-06512: at "HR.EMPCOUNT", line 7
ORA-06512: at line 2
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812679
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не можете использовать bind-variable для указания идентификатора атрибута, тут придется использовать конкатенацию или replace, например:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function empcount (colum_name varchar2, man_id number)
return integer is
l_query varchar2(200);
l_count integer;
begin
l_query:=replace('select count(*) from employees where <COLNAME>=:id', '<COLNAME>', colum_name);
execute immediate l_query into l_count using man_id;
return l_count;
end;

declare
l_count integer:=empcount('MANAGER_ID', 100);
begin
dbms_output.put_line(l_count);
end;
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812687
Georgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
спасибо, с конкатенацией тоже получилось.
а почему с
Код: plsql
1.
man_id

можно использовать bind-variable, а с
Код: plsql
1.
colum_name

нет?

и еще такой вопрос, как быть с апострофами, если вместо
Код: plsql
1.
manager_id=100

например надо подсчитать
Код: plsql
1.
job_id='IT_PROG'
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812694
Georgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по второму вопросу разобрался сам
Код: plsql
1.
l_query:='select count(*) from employees where ' || colum_name || '=' || q'(')' || val || q'(')';



а вот почему bind-variable не всегда можно использовать, вопрос остается открытым
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812697
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Georggпа вот почему bind-variable не всегда можно использовать, вопрос остается открытымsql reference
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812757
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Georggпа вот почему bind-variable не всегда можно использовать, вопрос остается открытымsql referenceНет там ничего про это.
К сожалению, явное упоминание осталось только в древней документации:
RTFM https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/dynamic.htm#sthref1594] PL/SQL User's Guide and Reference: Passing Schema Object Names As Parameters (FAQ)
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812770
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Georgg,

імхо
бинд и "придумали/используют" что-б меньше было '=' || q'(')' || val || q'(')';

.....
stax
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812787
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicНет там ничего про это."Ничего" слишком категоричное заявление. Если синтаксисом что-то не заявлено, это уже "что-то".
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812788
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-ElicНет там ничего про это."Ничего" слишком категоричное заявление. Если синтаксисом что-то не заявлено, это уже "что-то".Ткни в конкретику.
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812802
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как ораклу строить план по такому запросу? если поле будет как bind, вы еще имя таблицы попробуйте через bind передать :)
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812807
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex-lsа как ораклу строить план по такому запросу? если поле будет как bind, вы еще имя таблицы попробуйте через bind передать :)
подсмотреть (пікнуть) значение

для id:=:1 научился ж подглядывать

.....
stax
...
Рейтинг: 0 / 0
Dynamic SQL
    #39812808
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicТкни в конкретику.Синтаксические фантазии должны быть однозначно поняты автоматом. Как отличить бинд-значение от бинда-подстановки? Например, для xmlelement, где изначально имя тега зачем-то определяется через sql-имя, позже догадались добавить конструкцию evalname.
SQL reference дает определение placeholder expression. Синтаксиса для интерпретации значения выражения (и бинда, в частности) в качестве имени объекта БД не предусмотрено.
...
Рейтинг: 0 / 0
Dynamic SQL
    #39813030
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Georggпо второму вопросу разобрался сам
Публикуя предыдущий пост я рассчитывал, что Вы обратите внимание на применение bind variables там, где это уместно - конкатенация фактических значений параметров не только неудобна, временами привносит ненужные nls-зависимости, но при частом вызове вымывает кэш курсоров.
По тем же причинам не следует проводить импорт заметных объемов данных посредством скрипта с insert values
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Dynamic SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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