Oracle APEX SQL 日期时间导入程序
Oracle APEX SQL Date Time Import Procedure
我有一个包含日期和时间值的字段 (v_date),例如 (30-07-2021 13:30)
我想根据此字段向我的 table 导入两个新的日期和时间值。
第一个是7天后(08-06-202113:30),第二个是7天1小时后(08-06-202114:30)。
这是我的代码:
create or replace PROCEDURE "PR_ADD_MASSIVE_SESSIONS"
(v_date date)
IS
v_counter_day number :=7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := to_date(v_date, 'MM-DD-YYYY HH24:MI') + v_counter_day;
v_session_temp_end := to_date(v_date, 'MM-DD-YYYY HH24:MI') + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
我收到此错误:Ajax 调用返回服务器错误 ORA-01843:不是有效月份。
我尝试使用 to_char 但编译器只需要 to_date 才能获得成功的过程。
变量v_session_temp_date和v_session_temp_date定义为DATE
。函数 TO_DATE
将 字符串 转换为日期。它不应该用于 DATE
类型的变量。删除 TO_DATE
就可以了。下面的示例代码(使用匿名块,而不是过程)
CREATE TABLE sessions
(
clients_id NUMBER,
session_area NUMBER,
session_date DATE,
session_stop DATE,
payment_type_id NUMBER,
price NUMBER,
status NUMBER,
completed NUMBER,
payment_status NUMBER,
session_no NUMBER
);
Table SESSIONS created.
--original code
DECLARE
v_date date := SYSDATE;
v_counter_day number := 7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := to_date(v_date, 'MM-DD-YYYY HH24:MI') + v_counter_day;
v_session_temp_end := to_date(v_date, 'MM-DD-YYYY HH24:MI') + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
/
ORA-01843: not a valid month
ORA-06512: at line 7
01843. 00000 - "not a valid month"
*Cause:
*Action:
--fixed code
DECLARE
v_date date := SYSDATE;
v_counter_day number := 7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := v_date + v_counter_day;
v_session_temp_end := v_date + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
/
PL/SQL procedure successfully completed.
我有一个包含日期和时间值的字段 (v_date),例如 (30-07-2021 13:30) 我想根据此字段向我的 table 导入两个新的日期和时间值。 第一个是7天后(08-06-202113:30),第二个是7天1小时后(08-06-202114:30)。
这是我的代码:
create or replace PROCEDURE "PR_ADD_MASSIVE_SESSIONS"
(v_date date)
IS
v_counter_day number :=7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := to_date(v_date, 'MM-DD-YYYY HH24:MI') + v_counter_day;
v_session_temp_end := to_date(v_date, 'MM-DD-YYYY HH24:MI') + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
我收到此错误:Ajax 调用返回服务器错误 ORA-01843:不是有效月份。 我尝试使用 to_char 但编译器只需要 to_date 才能获得成功的过程。
变量v_session_temp_date和v_session_temp_date定义为DATE
。函数 TO_DATE
将 字符串 转换为日期。它不应该用于 DATE
类型的变量。删除 TO_DATE
就可以了。下面的示例代码(使用匿名块,而不是过程)
CREATE TABLE sessions
(
clients_id NUMBER,
session_area NUMBER,
session_date DATE,
session_stop DATE,
payment_type_id NUMBER,
price NUMBER,
status NUMBER,
completed NUMBER,
payment_status NUMBER,
session_no NUMBER
);
Table SESSIONS created.
--original code
DECLARE
v_date date := SYSDATE;
v_counter_day number := 7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := to_date(v_date, 'MM-DD-YYYY HH24:MI') + v_counter_day;
v_session_temp_end := to_date(v_date, 'MM-DD-YYYY HH24:MI') + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
/
ORA-01843: not a valid month
ORA-06512: at line 7
01843. 00000 - "not a valid month"
*Cause:
*Action:
--fixed code
DECLARE
v_date date := SYSDATE;
v_counter_day number := 7;
v_session_temp_date date;
v_session_temp_end date;
BEGIN
v_session_temp_date := v_date + v_counter_day;
v_session_temp_end := v_date + (v_counter_day + (1/1440*60));
INSERT INTO SESSIONS (CLIENTS_ID, SESSION_AREA, SESSION_DATE, SESSION_STOP, PAYMENT_TYPE_ID, PRICE, STATUS, COMPLETED, PAYMENT_STATUS, SESSION_NO)
VALUES (5, 1, v_session_temp_date, v_session_temp_end, 2, 40, 1, 1, 1, 1);
END;
/
PL/SQL procedure successfully completed.