0

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

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

我实际上是一名试图绕过 Web 应用程序防火墙的渗透测试人员,所以我确信这从另一边看起来很傻/很奇怪。基本上,我需要能够UNION使用动态查询来绕过过滤器。因此,在此示例中,您使用此函数将字符串从 Java 传递到 Oracle DB 。

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

4

1 回答 1

2

execute immediate语句仅在 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"

进一步的考虑,虽然在这里有点没有实际意义,但如果您没有通过选择变量来使用结果,则实际上不会执行动态查询(参阅此处的注释

于 2017-01-05T16:27:07.010 回答