【问题标题】:Can an oracle SQL query execute a string query selected from a table?oracle SQL 查询可以执行从表中选择的字符串查询吗?
【发布时间】:2014-02-12 03:44:42
【问题描述】:

使用 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 语句。

【问题讨论】:

  • 别以为可以这样,可能在PL/SQL中
  • 为什么不先调用内部查询,然后从代码中进行主查询?
  • @Bozorgzadeh 我正在尝试从结果中创建一个视图,以删除遗留系统中的一堆手动编码
  • 伙计,这对我帮助很大,你的答案正是我想要的,谢谢!

标签: sql oracle oracle11g


【解决方案1】:

通常,这不是一个特别好的设计——将 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 在循环中返回数据。然后可以在流水线表函数之上创建您的视图。

【讨论】:

  • 感谢您的链接,它向我展示了可以执行我的 sql 并返回值的函数。至于“流水线”,我还没有涉足那个概念领域。听起来我需要尽快做一些事情。
【解决方案2】:

了解基础知识..

当数据库执行SQL
1) 它将首先通过验证 SQL 中的 语法对象(使用的表和列)来进行 SEMANTIC 检查。
2)在此基础上,optimizer 绘制了PLAN(计算要使用的索引,以及可用的表统计信息和直方图)..
3) SQL Engine 按照 PLAN 执行查询。

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

因此,很遗憾,您的要求无法通过简单的 SQL 解决方案实现。

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

【讨论】:

  • 简洁、清晰和直接的答案 - 谢谢。您说得对,需要更复杂的 sql 解决方案。
【解决方案3】:

您可以在 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-03
    • 2014-08-09
    • 1970-01-01
    • 2012-12-16
    • 2021-04-14
    • 2016-03-15
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多