我正在寻找一个将Oracle SQL转换为可以动态执行的字符串的实用程序。
编辑:
是的,请考虑这个简单的SQL
SELECT * FROM TABLE
WHERE COLUMN_NAME = 'VALUE'
我有一个实用程序,用于T-SQL,它将上面的SQL转换为synamic SQL,如下所示:
BEGIN
DECLARE @Exe_String VarChar(2000)
DECLARE @Qt Char(1)
DECLARE @Cr Char(1)
SET @Qt = Char(39)
SET @Cr = Char(10)
SET @Exe_String = 'SELECT * FROM TABLE ' + @Cr
SET @Exe_String = @Exe_String + 'WHERE COLUMN_NAME = ' + @Qt + 'VALUE' + @Qt + '' + @Cr
PRINT @Exe_String
--Execute (@Exe_String)
END
当然,生成的代码可能会更好,你希望得到这个想法。
我正在寻找与Oracle SQL相同类型的转换。
答案 0 :(得分:1)
这是我使用过几次的工具。您将不得不稍微改变输出以使其运行,但它肯定要弄清楚如何逃避所有单个滴答。
点击链接后,它将带您直接访问该站点和带有示例SQL的页面。单击"静态SQL到动态SQL"按钮,你可以看到它是如何工作的。然后输入您想要转换的自己的sql并再次单击该按钮。删除每行末尾的额外刻度(')标记,除了第一行和最后一行,管道(|)也不需要在那里。希望这可以帮助。
答案 1 :(得分:0)
作为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;
明显不同的是,在Oracle中,字符串的连接运算符是||而不是+。
就个人而言,我有一个小字符串操作包(让我们称之为pstring),我会在这样的情况下使用它 - 包括enquote(字符串),新行,标签等的标准常量等功能以及执行此操作的能力C风格的文字替换。
exe_string :=
pstring.substitute_text('SELECT * FROM %s \n WHERE %s = %s',
table_name,column_name,pstring.enquote(value));
您是否考虑过使用绑定变量 - 即:value - 而不是处理转义所有内部引号?这是对SQL注入的良好防御。
显然,如果你有不同数量的变量会有一些困难(你需要使用DBMS_SQL将它们链接到语句而不是简单的EXECUTE IMMEDIATE),但对于你的简单情况,它看起来就像这样。
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;
当然,你必须对SQL的结果做些什么。
EXECUTE IMMEDIATE exe_string INTO lresult USING pstring.enquote(value);
当表的形状可能不同时,这很困难 - 再次,您必须查看Type 4动态SQL(DBMS_SQL)。