2016-07-18 2 views
1

Я новичок в Clojure и работает над приложением jdbc, где у меня есть строка с тремя запросами, определенными в этой строке, как показано ниже.Реализовать результат каждого запроса в строке

(def tpch_query15 
     (str "create view revenue0 (supplier_no, total_revenue) as select l_suppkey, sum(l_extendedprice * (1 - l_discount)) " 
     "from lineitem where l_shipdate >= date '1993-04-01' and l_shipdate < date '1993-04-01' + interval '3' month group by l_suppkey; " 
      "select s_suppkey, s_name, s_address, s_phone, total_revenue from supplier, revenue0 where s_suppkey = supplier_no " 
     "and total_revenue = (select max(total_revenue) from revenue0) order by s_suppkey LIMIT 1; drop view revenue0")) 

(defn run-a-query 
    "Run a query three times and return the average time." 
    [conn-db query queryno] 
    (println (str "Running query " queryno)) 
    (let [starttime (System/currentTimeMillis)] 
    (dotimes [n 3] 
     (try 
     (let 
      [rs (sql/query conn-db query)] 
     ;; Print column names with | as delimiter 
     (dorun 0 (map #(println (clojure.string/join " | " (keys %))) rs)) 
     ;; Print a seperator between column names and rows 
     (println "------------------------------------------------------") 
     ;; Print rows with | as delimiter 
     (dorun (map #(println (clojure.string/join " | " (vals %))) rs))) 
     (catch Exception e))) 
     (/ (- (System/currentTimeMillis) starttime) 3.0))) 

;;https://clojuredocs.org/clojure.core/conj! 
(defn run-all-queries 
    "Run all TPC-H queries. Return a vector of average time taken for each query." 
    [conn-db] 
    (loop [i 0 v (transient [])] 
    (if (< i 22) 
     (recur (inc i) (conj! v (run-a-query conn-db (get queries-to-run i) (+ i 1)))) 
     (persistent! v)))) 

Возможно ли, чтобы функция run-a-query распечатывала результаты всех трех запросов, определенных в этой строке. В настоящее время, когда run-a-query передается tpch_query15, он не распечатывает никаких результатов. Из того, что я понимаю, это потому, что последний из трех запросов, который представляет собой представление с кавычками, не возвращает результирующий набор, и он возвращает только последний результат запроса.

ответ

0

Переформулировать запрос в качестве одного оператора SQL SELECT с использованием WITH пункта (https://www.postgresql.org/docs/current/static/queries-with.html) вместо создания, а затем сбросив вид:

with 
    revenue0 (supplier_no, ...) as (select l_suppkey, ...) 
select s_suppkey, ... 
from supplier, revenue0,... 

Вы действительно не нужен вид здесь, с или без Clojure, JDBC и т. Д. И в любом случае смешивание DDL с запросами/DML на одном и том же соединении (и особенно в рамках одного и того же запроса), как правило, является плохой идеей - производительность может сильно пострадать в зависимости от базы данных, версии, драйвера и т. Д.

Смежные вопросы