oracle SQL查询可以执行从表中选择的字符串查询吗?

时间:2014-02-07 20:12:04

标签: sql oracle oracle11g

使用oracle SQL时,是否可以基于子查询中的text_string运行查询? 一个例子可能会澄清我正在尝试做什么

    select count(sql_text), sql_text
    from
        (select sql_text 
        from query_table) sql_table
    group by sql_text;

外部查询旨在计算从query_table检索的每个查询的结果数。

是否有某种方法可以执行我在同一查询中从query_table检索到的sql语句?

由于

编辑:    我能够使用dbms_xmlgen.get_xml()函数从表中查询sql。我想任何导致sql被解析和执行的命令都会起作用。 话虽这么说,这是我能用以下方式完成的通用代码:

    select  to_number (
        extractvalue(
        xmltype(
        dbms_xmlgen.getxml('select count(*) c from '|| table_name)), '/ROWSET/ROW/C'))counter,
        sql_text
    from
        (select '('||sql_text||')' table_name 
        from query_table) sql_table;

虽然也许不是最优雅的做事方式,但它有效并且是一个单一的SQL语句。

3 个答案:

答案 0 :(得分:2)

通常,这不是一个特别好的设计 - 在表中存储SQL并动态执行它会引入各种安全和维护问题。

有可能(虽然在星期五太晚了,但我试图弄明白的时候为时太早)要按照this query that runs a count(*) against every table in the schema的方式做一个非常酷的XML查询。所有在一个查询。

对于绝大多数程序员来说,更简单的方法是循环遍历查询,一次运行一个查询,并将结果存储在某处。例如,可能会将局部变量添加到计数集合中。

FOR q IN (SELECT sql_text FROM query_table)
LOOP
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM (' || q.sql_text || ')'
     INTO some_local_variable;
  <<do something with the local variable>>
END LOOP;

由于您正在尝试创建视图,因此您可以将此逻辑放入流水线表函数中。您需要PIPE ROW来循环返回数据。然后可以在流水线表函数的基础上创建您的视图。

答案 1 :(得分:1)

通过基础知识..

当数据库执行SQL时 1)首先通过验证SQL中的语法对象(使用的表和列)来进行SEMANTIC检查。
2)基于它,optimizer绘制PLAN(计算要使用的索引,使用可用的表统计和直方图)。
3)SQL Engine根据 PLAN 执行查询。

所以,所有这些意味着,SQL无法做动态对象引用。因为它需要在执行之前研究SQL中的所有元素。

因此,遗憾的是,使用简单的SQL解决方案,您的要求是 NOT

PL/SQL或其他一些特定于数据库的特殊工具..是您必须选择的。

答案 2 :(得分:0)

你可以在PL / SQL中做到这一点,它看起来像这样(如果我理解你的要求):

create table sql_commands (cmd varchar2(1000));
insert into sql_commands values ('select * from table_1');
insert into sql_commands values ('select * from table_2');
commit;

declare
begin
   for aLine in (select cmd from sql_commands) loop
      execute immediate aLine.cmd into ... -- depends on your command
   end loop;
end;