sql >> データベース >  >> RDS >> Oracle

SQLクエリを実行できません

    group by句の列数は可変であるため、動的SQLでのみ可能です。たとえば、次の関数を使用します。

        create or replace
        function sum_cash_transactions ( p_threshold_type varchar2) return number
        is
          v_result NUMBER;
        begin
          execute immediate ' select max( sum_amount) 
                              from( select sum(amount) as sum_amount
                                    from   cash_transactions
                                    group by ' || p_threshold_type || ' )'
         into v_result;
         return v_result;
         end;
    /
    

    そして

    select threshold_id
     from thresholds
     where threshold_amount < sum_cash_transactions(threshold_type);
    

    新しい要件による編集:

    CREATE OR REPLACE package pkg AS
      TYPE res_rec_type IS RECORD (
        threshold_id  VARCHAR2(200)
      , Tran_inst_id  NUMBER(10,0)
      , sum_amount    NUMBER(22)
      );
      TYPE res_tab_type IS TABLE of res_rec_type;
      FUNCTION f1 RETURN  res_tab_type PIPELINED;
    END;
    /
    
    CREATE OR REPLACE PACKAGE BODY pkg AS
    
      FUNCTION f1 RETURN  res_tab_type PIPELINED
      IS
        CUR    SYS_REFCURSOR;
        v_rec  res_rec_type;
      BEGIN
        FOR treshold in ( SELECT Threshold_id,  Threshold_type,   Threshold_amount FROM thresholds)
        LOOP
          OPEN CUR FOR 'SELECT ' || threshold.Threshold_id || ', tTran_inst_id,  s FROM (SELECT  tTran_inst_id, SUM(AMOUNT) OVER (PARTITION BY ' || p_Threshold_type || ') as s from cash_transactions ) WHERE s > ' || treshold.Threshold_amount ;
          LOOP
            FETCH cur INTO v_rec;
            EXIT WHEN cur%NOTFOUND;
            pipe row(v_rec);
          END LOOP;
        END LOOP;
        CLOSE cur;
        RETURN;
      END;
    END;
    /
    
    SELECT * form table(pkg.f1);
    


    1. mysqlの別のテーブルから複数のフィールドをどのように更新しますか?

    2. クエリでのANSI1992JOINとCOMMAの混合

    3. MySQLで1か月の日数を取得する方法

    4. T-sql ストアド プロシージャの SHA256