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