Return 当前分钟和当前日期的记录数的存储过程

Stored Procedure to Return no of records for current minute and current date

下面是我的 table 和创建的索引的结构。

我只想创建一个存储过程以将记录插入此 table 中 return table 中当前分钟和当天的记录数。

下面的存储过程完成了这项工作。如果有更好的方法,请告诉我。

CREATE table RCDC_THROTTLE
( 
  UUID varchar2(50) NOT NULL,
  TRANSACTIONTIMESTAMP timestamp NOT NULL,
  TIMESTAMP timestamp NOT NULL,
  REQTYPE varchar2(20) NOT NULL
);

CREATE INDEX RCDC_THROTTLE_TIMESTAMP_IDX ON RCDC_THROTTLE(TIMESTAMP);
CREATE INDEX RCDC_THROTTLE_REQTYPE_IDX ON RCDC_THROTTLE(REQTYPE);

ALTER TABLE RCDC_THROTTLE
    ADD CONSTRAINT CK_RCDC_THROTTLE_REQTYPE CHECK (REQTYPE IN ('CONNECT','DISCONNECT'));
COMMIT;


create or replace PROCEDURE P_INSERT_RCDC_THROTTLE
(
  I_UUID IN VARCHAR2
, I_TRANSACTIONTIMESTAMP IN TIMESTAMP 
, I_TIMESTAMP IN TIMESTAMP 
, I_REQTYPE IN VARCHAR2 
, O_COUNTCURDAY OUT INT
, O_COUNTCURMIN OUT INT
) AS 
BEGIN

      INSERT INTO RCDC_THROTTLE(UUID, TRANSACTIONTIMESTAMP, TIMESTAMP,REQTYPE)
      VALUES (I_UUID,I_TRANSACTIONTIMESTAMP,I_TIMESTAMP,I_REQTYPE);
      select COUNT(*) INTO O_COUNTCURDAY from RCDC_THROTTLE where TIMESTAMP >= trunc(systimestamp);
      select COUNT(*) INTO O_COUNTCURMIN from RCDC_THROTTLE where TIMESTAMP > systimestamp - numtodsinterval(1,'MINUTE');
END;

您可以在签名中使用 table 的列类型,并且可以在同一个 SELECT 语句中执行两个 COUNT(这样您就不需要查询table 两次):

create or replace PROCEDURE P_INSERT_RCDC_THROTTLE
(
  I_UUID                 IN RCDC_THROTTLE.UUID%TYPE
, I_TRANSACTIONTIMESTAMP IN RCDC_THROTTLE.TRANSACTIONTIMESTAMP%TYPE
, I_TIMESTAMP            IN RCDC_THROTTLE.TIMESTAMP%TYPE
, I_REQTYPE              IN RCDC_THROTTLE.REQTYPE%TYPE
, O_COUNTCURDAY          OUT INT
, O_COUNTCURMIN          OUT INT
) AS 
BEGIN
  INSERT INTO RCDC_THROTTLE(
    UUID, TRANSACTIONTIMESTAMP, TIMESTAMP,REQTYPE
  ) VALUES (
    I_UUID,I_TRANSACTIONTIMESTAMP,I_TIMESTAMP,I_REQTYPE
  );

  SELECT COUNT(*),
         COUNT(CASE WHEN TIMESTAMP > SYSTIMESTAMP - INTERVAL '1' MINUTE THEN 1 END)
  INTO   O_COUNTCURDAY,
         O_COUNTCURMIN
  FROM   RCDC_THROTTLE
  WHERE  TIMESTAMP >= trunc(systimestamp);
END;
/