
Envoyé par
alex_972
Je n'ai pas réussit à la faire fonctionner en remplaçant le premier EXECUTE IMMEDIATE par une requête sous la forme SELECT.. INTO.. FROM table2.
C'est normal le INTO se fait bien dans le EXECUTE IMMEDIATE.
Par contre je ne sais pas dans quel contexte cette procédure est utilisée mais la concaténation de chaines de caractères représente un risque d'injection SQL.
Comme pour les noms de tables, colonnes, il n'est bien évidemment pas possible de binder, il faut alors utiliser le package DBMS_ASSERT, par exemple :
query_max := 'SELECT max(num) FROM ' || dbms_assert.simple_sql_name(table2);
Sinon perso j'aurais mis le SELECT MAX directement dans la requête INSERT.
Et si num est bien un numérique, il ne faut pas le fetch dans un varchar2 afin d'éviter des conversions implicites.
Partager