В хранимой процедуре я отфильтровываю список сотрудников с ролью SUPER.ADMIN.

В таком случае я использовал подобное выражение, как показано ниже

Emp.Role_nm Like ''''||p_rolenm||''''

  • p_rolenm я упомянул в хранимой процедуре как VARCHAR2

Когда я передаю значение p_rolenm как SUPER.ADMIN, это выдает ошибку, поскольку идентификатор SUPER.ADMIN не объявлен.

Как мне сбежать. (точка) в операторах PL/SQL?

0
Gowtham Murugesan 20 Ноя 2019 в 20:42
1
Было бы полезно, если бы вы показали нам больше, чем просто часть одного заявления. Кроме того, зачем использовать «НРАВИТСЯ», если у вас нет подстановочных знаков?
 – 
AndyDan
20 Ноя 2019 в 21:16

1 ответ

Почему вы используете так много одинарных кавычек? Вам не нужно никаких (по крайней мере, я так думаю):

Пример данных:

SQL> create table test (id number, role varchar2(20));

Table created.

SQL> insert into test
  2  select 1, 'CLERK' from dual union all
  3  select 2, 'SUPER.ADMIN' from dual;

2 rows created.

SQL> select * from test;

        ID ROLE
---------- --------------------
         1 CLERK
         2 SUPER.ADMIN

SQL> set serveroutput on;

Процедура (анонимно, но это не имеет значения):

SQL> declare
  2    p_rolenm varchar2(20) := 'SUPER.ADMIN';
  3    l_id     number;
  4  begin
  5    select id into l_id
  6    from test
  7    where role = p_rolenm;
  8
  9    dbms_output.put_line('l_id = ' || l_id);
 10  end;
 11  /
l_id = 2

PL/SQL procedure successfully completed.

SQL>

Если вам нужно like, то

SQL> declare
  2    p_rolenm varchar2(20) := 'PER.ADM';            --> I changed this ...
  3    l_id     number;
  4  begin
  5    select id into l_id
  6    from test
  7    where role like '%' || p_rolenm || '%';        --> ... and this
  8
  9    dbms_output.put_line('l_id = ' || l_id);
 10  end;
 11  /
l_id = 2

PL/SQL procedure successfully completed.

SQL>

Если вы использовали динамический SQL, то

SQL> declare
  2    p_rolenm varchar2(20) := 'PER.ADM';
  3    l_id     number;
  4    l_str    varchar2(200);                      --> new variable for execute immediate
  5  begin
  6    l_str := q'[select id from test where role like '%' || :a || '%']';
  7    execute immediate l_str into l_id using p_rolenm;
  8
  9    dbms_output.put_line('l_id = ' || l_id);
 10  end;
 11  /
l_id = 2

PL/SQL procedure successfully completed.

SQL>

Короче, я не понимаю, что ты делаешь. Попробуйте последовать моему примеру. Если это все еще не работает, опубликуйте сеанс SQL*Plus.

4
Littlefoot 21 Ноя 2019 в 00:31