Plsql 正在查找将SQL语句转换为动态SQL语句的实用程序

Plsql 正在查找将SQL语句转换为动态SQL语句的实用程序,plsql,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)

我正在寻找一个实用工具,将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寻找相同类型的转换

作为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(string)、换行符、制表符的标准常量等函数,以及执行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);

当表的形状可能不同时,这是很困难的-再次,您必须查看类型4动态SQL(DBMS_SQL)。

这里有一个我已经使用过几次的工具。您必须稍微更改输出以使其运行,但这肯定比必须找出如何避开所有单个滴答声要好得多


单击该链接后,它将带您直接访问该站点和包含示例SQL的页面。单击“静态SQL到动态SQL”按钮,您可以看到它是如何工作的。然后输入您自己想要转换的sql,然后再次单击该按钮。除第一行和最后一行外,删除每行末尾和开头的额外勾号('),管道(|)也不需要在那里。希望这有帮助

你需要一个工具来把所有的东西都用单引号括起来,并转义现有的单引号?表面上看,你似乎想要一些神奇的东西。如果您能提供一个您想要转换的SQL语句的示例,那么我们可以评估它的可行性。@APC:那么。。。你是Calvin&Hobbes的粉丝,我明白了=)re:“你需要一个工具把所有的东西都用单引号括起来,并转义现有的单引号?”a:是的。但是我也希望维护CR LFs,因此,如果我要打印SQL,它将是dbe格式的。