|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : septembre 2011 Messages : 51 ![]() |
Bonjour,
Etant débutant en PL/SQL, j'aimerais avoir votre avis sur mon code. Des optimisations sont-elles possibles ? Code :
table2 me pose problème dans ce cas. Merci d'avance |
||
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
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 : Code :
query_max := 'SELECT max(num) FROM ' || dbms_assert.simple_sql_name(table2); Et si num est bien un numérique, il ne faut pas le fetch dans un varchar2 afin d'éviter des conversions implicites. |
|
|
|
20
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : septembre 2011 Messages : 51 ![]() |
Merci skuatamad pour ta réponse.
Je ne connaissais pas DBMS_ASSERT. Y a-t-il d'autre chose à savoir sur l'injection SQL lors de la programmation en PL/SQL ? Pour le select dans l'Execute immediate, c'est ce que j'ai fait au début mais je me demandais si ce n'étais pas plus propre comme çà. Concernant la colonne num, c'est un timestamp. (la requete originale fait une bonne centaine de ligne |
|
|
00
|
|
|
#4 | ||
|
Futur Membre du Club
![]() Inscription : septembre 2011 Messages : 51 ![]() |
Est-il possible d'appliquer dbms_assert.simple_sql_name() une seule fois sur la variable de ma procédure ? Ca me permettrait d'éviter d'utiliser cette fonction X fois.
Quelque chose dans ce genre : Code :
|
||
|
|
00
|
|
|
#5 | |||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Citation:
Citation:
Code :
|
|||||
|
|
00
|
|
|
#6 | |
|
Futur Membre du Club
![]() Inscription : septembre 2011 Messages : 51 ![]() |
Citation:
SI le prefix p_ est utilisé pour les paramètres de procédure, je suppose que l'on utilise f_ pour les fonctions. Mais à quoi correspond le préfix l_? |
|
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
À une variable l_ocale.
Dans ces conventions courantes, tu as aussi les variables g_lobales |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
J'ai pas trop détaillé car tu l'as correctement utilisé dans ton premier post.
USING permet d'utiliser des binds variables qui sont généralement très bonnes pour les performances et qui garantissent que personne ne pourra modifier la requête en concaténent du code sql, communément appelé l'injection sql. Par défaut les variables PL/SQL utilisées dans des requêtes statiques sont des binds variables. |
|
|
10
|
|
|
#9 |
|
Futur Membre du Club
![]() Inscription : septembre 2011 Messages : 51 ![]() |
ok
![]() Merci pour vos réponses |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com