我想要实现的目的基本上是这样的:
SELECT 1 FROM DUAL
UNION
EXECUTE IMMEDIATE 'SELECT 2 FROM dual';
我实际上是一个试图绕过Web应用程序防火墙的渗透测试人员,因此我确信这看起来很愚蠢/异常。基本上,我需要能够使用动态查询执行UNION
以绕过过滤器。因此,在此示例中,您使用this function将字符串从Java传递到Oracle数据库。
我没有从数据库中获得有关我的查询有什么问题的任何反馈,也找不到任何做类似事情的人的文档。我需要一个简单的例子,其中我UNION
使用简单的动态SQL字符串进行普通查询。
答案 0 :(得分:2)
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