I am writing a procedure to delete some records of z_names
table by IDs from the input as string (and I need to seprate them by special character (comma ,
)).
Sample Input: '1,4'
z_names
table:
ID | NAME |
---|---|
1 | jim |
2 | john |
3 | jack |
4 | alex |
After running this procedure, the record with ID 1 and 4 (jim
and alex
) must be deleted.
I have lots of errors while was writing this procedure.
x
create or replace procedure prc_z_names_del (par_string in varchar2)
is
V_del_query varchar2(200);
begin
V_del_query := 'delete from ' || z_names|| 'WHERE ID = ' ||
select to_number(trim(regexp_substr(par_string, '[^,]+', 1, level)))
from dual
connect by level <= regexp_count(par_string, ',') + 1||';';
EXECUTE IMMEDIATE V_del_query;
end;
/
Advertisement
Answer
You’ don’t need dynamic SQL.
Sample data:
SQL> select * from z_names;
ID NAME
---------- ----
1 jim
2 john
3 jack
4 alex
Procedure:
SQL> create or replace procedure prc_z_names_del (par_string in varchar2)
2 is
3 begin
4 delete from z_names
5 where id in (select to_number(trim(regexp_substr(par_string, '[^,]+', 1, level)))
6 from dual
7 connect by level <= regexp_count(par_string, ',') + 1
8 );
9 dbms_output.put_line('Deleted ' || sql%rowcount ||' row(s)');
10 end;
11 /
Procedure created.
Testing:
SQL> set serveroutput on
SQL> exec prc_z_names_del('1, 4');
Deleted 2 row(s)
PL/SQL procedure successfully completed.
SQL> select * from z_names;
ID NAME
---------- ----
2 john
3 jack
SQL>