0

問題を検索する(Oracle SQL)クエリがあります:(簡略化)

select a.date, (a.counter1 + c.counter) / (c.counter1 - a.counter1) percentdiferent
  --daily table is agregated to ocupy less space and be faster when searching for the total counters for a day
  from dailytable a
  join (
    --the nonaggregated table has values for each minute
    select trunc(b.date) date, sum(counter1) counter1 
      from minutetable b
      where trunc(b.datea) = a.date
      group by trunc(b.date)
  ) c
  on c.date = a.date and c.counter1 <> a.counter1
  where percentdiferent > 5

これらの問題を修正するには、次の手順を実行する必要があります。

exec aggregate(tablename, date) 

手順は頻繁に変更され、複数のテーブルがあります。のようなことをする方法はありますか

with checktables as (
  --above code
)

select date
  from checktables
  group by date

if result > 0
  for each result
    exec aggregate(tablename,date) 

show results

?

4

2 に答える 2

0

クエリ内では関数を使用できますが、ストアド プロシージャは使用できません。ストアド プロシージャを呼び出す必要がある場合は、カーソルを使用して結果をループする必要があります。Oracle.com の PL/SQL カーソル

BEGIN
   FOR c IN (SELECT * FROM tablename) 
   LOOP
       your_procedure(c.columnname, c.othercolumnname);
   END LOOP;
END;
于 2013-07-16T09:00:31.613 に答える
0
DECLARE
    l_check_state NUMBER;

    /* example procedures */
    PROCEDURE work_with_one
    AS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Procedure one');
    END work_with_one;

    PROCEDURE work_with_two
    AS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Procedure two');
    END work_with_two;

    PROCEDURE work_with_three
    AS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Procedure three');
    END work_with_three;
BEGIN
    /* check query */
    WITH checktables AS
    (
        SELECT  ROUND(DBMS_RANDOM.VALUE(1, 3)) AS state
        FROM    dual
    )
    SELECT  state
    INTO    l_check_state
    FROM    checktables;

    /* based on the query result run proper procedure */
    IF l_check_state = 1 THEN
        /* execute proc 1 */
        work_with_one();
    ELSIF l_check_state = 2 THEN
        /* execute proc 2 */
        work_with_two();
    ELSIF l_check_state = 3 THEN
        /* execute proc 3 */
        work_with_three();
    ELSE
        /* no evaluation */
        DBMS_OUTPUT.PUT_LINE('Error');
    END IF;
END;

乱数 (DBMS_RANDOM.VALUE) のため、何度か実行すると異なる結果が表示されます。これは、シミュレートされたチェック クエリの動作に使用されます。

Procedure two
Procedure one
Procedure two
Procedure one
于 2013-07-16T14:10:26.497 に答える