动态 SQL 语句上的 UNION

UNION on dynamic SQL statements

我想要完成的基本上是这样的:

SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual';

我实际上是一名尝试绕过 Web 应用程序防火墙的渗透测试人员,所以我确信这看起来 silly/strange 从另一面看。基本上,我需要能够使用动态查询执行 UNION 以绕过过滤器。因此,在此示例中,您使用 this function.

将字符串从 Java 传递到 Oracle 数据库

我没有从数据库中得到任何关于我的查询有什么问题的反馈,也找不到任何关于做类似事情的人的文档。我需要一个简单的例子,其中我 UNION 一个带有简单动态 SQL 字符串的普通查询。

The execute immediate statement 仅在 PL/SQL 块内有效。您不能将它与纯 SQL 混合使用。您也可以动态 运行(仅)PL/SQL,但同样不要像您尝试的那样将两者混合在一个语句中。

如果您 运行 在普通客户端中显示的内容,您会看到它抱怨:

Error starting at line : 1 in command -
SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual'
Error at Command Line : 3 Column : 1
Error report -
SQL Error: ORA-00928: missing SELECT keyword
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:

即使您传递的语句本身是动态执行的,您也会看到相同的错误:

BEGIN
  EXECUTE IMMEDIATE q'[SELECT 1 FROM DUAL
UNION 
EXECUTE IMMEDIATE 'SELECT 2 FROM dual']';
END;
/

Error report -
ORA-00928: missing SELECT keyword
ORA-06512: at line 2
00928. 00000 -  "missing SELECT keyword"

进一步的考虑是,如果您不通过选择 进入 变量来使用结果,则实际上不会执行动态查询,尽管这里有点没有实际意义( see the note here.