Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Dynamic SQL / 13 сообщений из 13, страница 1 из 1
13.05.2019, 21:29
    #39812675
Georgg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
Подскажите пожалуйста, что не так делаю

Задача, используя динамический 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
13.05.2019, 21:47
    #39812679
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
Вы не можете использовать 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
13.05.2019, 22:21
    #39812687
Georgg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
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
13.05.2019, 22:45
    #39812694
Georgg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
по второму вопросу разобрался сам
Код: plsql
1.
l_query:='select count(*) from employees where ' || colum_name || '=' || q'(')' || val || q'(')';



а вот почему bind-variable не всегда можно использовать, вопрос остается открытым
...
Рейтинг: 0 / 0
13.05.2019, 22:56
    #39812697
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
Georggпа вот почему bind-variable не всегда можно использовать, вопрос остается открытымsql reference
...
Рейтинг: 0 / 0
14.05.2019, 08:24
    #39812757
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
-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
14.05.2019, 08:41
    #39812770
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic SQL
Georgg,

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

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

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

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


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