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;
/
下面是我的 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;
/