Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Không thể thực hiện truy vấn sql

Nó chỉ có thể với sql động, vì số lượng cột trong nhóm theo mệnh đề là thay đổi. Ví dụ với một hàm:

    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;
/

và sau đó

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

CHỈNH SỬA do yêu cầu mới:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tên giao diện mạng có thể có độ dài bao nhiêu?

  2. Gọi dịch vụ web BI Publisher với ReportRawData

  3. Giá trị thấp nhất nhưng không phải NULL trong Oracle SQL

  4. Hàm Java 6 hoạt động trong dòng lệnh, nhưng không hoạt động trên máy chủ Oracle (AES 256)

  5. So sánh giữa các hàng trong cùng một bảng trong Oracle