寻找将SQL语句转换为动态SQL语句的实用程序

时间:2010-07-13 21:55:17

标签: plsql

我正在寻找一个将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相同类型的转换。

2 个答案:

答案 0 :(得分:1)

这是我使用过几次的工具。您将不得不稍微改变输出以使其运行,但它肯定要弄清楚如何逃避所有单个滴答。

Sql Tuning

点击链接后,它将带您直接访问该站点和带有示例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)。