En tant que traduction brute de votre T-SQL PL/SQL
DECLARE
Exe_String VarChar(2000);
Qt CONSTANT Char(1) := CHR(39);
Cr CONSTANT Char(1) := CHR(10);
BEGIN
exe_string := 'SELECT * FROM TABLE '||Cr;
exe_string := exe_string ||
'WHERE COLUMN_NAME = ' || Qt || 'VALUE' ||Qt || '' ||Cr;
dbms_output.put_line(exe_string);
--
EXECUTE IMMEDIATE exe_string;
END;
La différence évidente est que dans Oracle l'opérateur de concaténation des chaînes est || plutôt que +.
Personnellement, j'ai un petit paquet de manipulation de chaîne (appelons-le pstring) que j'utiliserais dans un cas comme celui-ci - inclut des fonctions comme enquote (chaîne), constantes standard pour newline, tabulation, etc. faire un remplacement de texte en style C.
exe_string :=
pstring.substitute_text('SELECT * FROM %s \n WHERE %s = %s',
table_name,column_name,pstring.enquote(value));
Avez-vous pensé à utiliser des variables liées - à savoir: la valeur - plutôt que de traiter toutes les citations échapper internes? C'est une bonne défense contre l'injection SQL.
Évidemment, il y a quelques difficultés si vous avez un nombre variable de variables (vous devez utiliser DBMS_SQL pour les relier à l'instruction plutôt qu'un simple EXECUTE IMMEDIATE) mais pour votre cas simple, cela ressemblerait à ceci.
PROCEDURE (table_name IN VARCHAR2, column_name IN VARCHAR2)
IS
Exe_String VarChar(2000);
BEGIN
exe_string :=
pstring.substitute_text('SELECT * FROM %s \n WHERE %s = :value',
table_name,column_name);
dbms_output.put_line(exe_string);
--
EXECUTE IMMEDIATE exe_string USING pstring.enquote(value);
END;
Bien sûr, vous devez faire quelque chose avec les résultats de votre SQL.
EXECUTE IMMEDIATE exe_string INTO lresult USING pstring.enquote(value);
Ce qui est difficile lorsque la forme de la table peut varier - encore une fois, vous devez regarder Type 4 SQL dynamique (DBMS_SQL).
Vous avez besoin d'un outil pour placer tout ce qui est entre guillemets simples et échapper les guillemets simples existants? –
Sur le visage de celui-ci, il semble que vous voulez quelque chose qui est magique. Cela nous aiderait si vous pouviez donner un échantillon du type de déclaration SQL que vous souhaitez transformer, afin que nous puissions évaluer sa faisabilité. – APC
@APC: Alors ...vous êtes un fan de Calvin & Hobbes, je vois =) –