2014-02-07 23 views
0

使用Oracle SQL是它可以運行基於從子查詢text_string的查詢? 一個例子可以解釋什麼,我試圖做一個Oracle SQL查詢可以執行從表中選擇一個查詢字符串?

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

不要以爲你能做到這樣,可能在PL/SQL –

+0

爲什麼不先調用內部查詢,然後從代碼中進行主查詢? –

+0

@Bozorgzadeh我試圖創建一個視圖結果,以刪除一堆舊版系統中的手動編碼 – Rolan

回答

1

通常,這是不是一個特別好的設計 - 存儲表的SQL和動態執行它引入了各種安全和維護問題。

這可能是可能的(儘管週五已經太遲了,但我很快就發現了這樣的結果,我試圖找出答案)做一個非常酷的XML查詢,沿着this query that runs a count(*) against every table in the schema這一行就可以做到這一點查詢。

對於絕大多數程序員,不過,簡單的方法是在循環遍歷查詢,運行它們一次一個,並在一些地方保存結果。例如,可能將局部變量添加到計數集合中。

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在循環中返回數據。然後可以在流水線表函數之上創建您的視圖。

+0

感謝您的鏈接,它告訴我,有功能,可以執行我的SQL並返回值。至於「流水線」,我還沒有冒險進入這個概念領域。聽起來像我需要儘快完成,而不是晚些時候。 – Rolan

1

通過基礎去..

當數據庫執行的SQL
1)首先通過驗證SQL中的語法對象(表和列使用)做SEMANTIC檢查。在此基礎上
2)中,optimizer繪製PLAN(計算的索引來使用,與現有的表的統計信息和直方圖)..
3)和SQL Engine執行查詢具體根據PLAN

所以,所有這些意味着,SQL不能做動態對象引用。因爲它需要在執行本身之前研究SQL中的所有元素。

因此,不幸的是,您的要求是不是可能與一個簡單的SQL解決方案。

PL/SQL或其他數據庫特定的特殊工具..是你必須選擇的。

+0

簡潔明瞭直接回答 - 謝謝。你是對的,需要更復雜的SQL解決方案。 – Rolan

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;