我试图在PLSQL上创建一个过程。 当我执行下面的代码时,问题是“ ORA-01843:无效的月份”。 我在TIMESTAMP上遇到的问题
CREATE OR REPLACE PROCEDURE SP_InsertOvertimes
(
ov_id IN VARCHAR,
dro_id IN DATE,
sto_id IN TIMESTAMP,
eto_id IN TIMESTAMP,
acto_id IN Varchar,
otfk_id IN VARCHAR,
slfk_id IN VARCHAR,
SttsO_id IN VARCHAR,
empfk_id IN NUMBER
)
IS
BEGIN
INSERT into TB_T_Overtimes VALUES (ov_id,dro_id,TO_CHAR(TO_TIMESTAMP(sto_id,'HH24:MI')),eto_id, acto_id,otfk_id,slfk_id,sttso_id,empfk_id);
END;
==== EXECUTE
BEGIN
SP_InsertOvertimes(9, '07/08/2019','01:12', CURRENT_TIMESTAMP(), 'Kerja Lembur Bagai Kuda', '1', '1', 'Kampret' ,1);
END;
答案 0 :(得分:1)
输入值'07/08/2019'
不是DATE
,它是一个字符串值。 Oracle尝试使用您当前的会话NLS_DATE_FORMAT
格式将其隐式转换为DATE值。使用TO_DATE
或TO_TIMESTAMP
函数或Datetime Literals例如DATE '2019-08-07'
根据输入参数dro_id IN DATE, sto_id IN TIMESTAMP,
和值'07/08/2019','01:12'
,您可能会误解DATE
和TIMESTAMP
数据类型。
每个 DATE
值都有一个日期和一个时间部分。即使仅提供日期部分,时间部分也将是00:00:00
。没有理由将数据和时间值的列分开。
DATE
和TIMESTAMP
数据类型大致相同。两种数据类型都有日期和时间部分。主要区别在于TIMESTAMP
还提供小数秒,而DATE
仅提供整秒。
答案 1 :(得分:0)
假设您的月份为7月,请使用第二个参数使用IndexError
而不是date'2019-07-08'
来执行过程以消除错误。
此外,第一个参数应加引号('07/08/2019'
),因为它在表中被定义为'9'
(不是数字)。
答案 2 :(得分:0)
您应该匹配数据类型。这是一个示例,显示了您可能如何完成此操作。
样品表:
{'product_x_name_1L': 'product_x_pic_1l',
'product_y_name_4L': 'product_y_pic_4l',
'product_z_name_20L': 'product_z_pic_20l'}
程序:
SQL> CREATE TABLE tb_t_overtimes(
2 ov_id VARCHAR2(20),
3 dro_id DATE,
4 sto_id TIMESTAMP,
5 eto_id TIMESTAMP,
6 acto_id VARCHAR2(20),
7 otfk_id VARCHAR2(20),
8 slfk_id VARCHAR2(20),
9 sttso_id VARCHAR2(20),
10 empfk_id NUMBER
11 );
Table created.
测试:
SQL> CREATE OR REPLACE PROCEDURE sp_insertovertimes(
2 ov_id IN VARCHAR,
3 dro_id IN DATE,
4 sto_id IN TIMESTAMP,
5 eto_id IN TIMESTAMP,
6 acto_id IN VARCHAR,
7 otfk_id IN VARCHAR,
8 slfk_id IN VARCHAR,
9 sttso_id IN VARCHAR,
10 empfk_id IN NUMBER
11 )IS
12 BEGIN
13 INSERT INTO tb_t_overtimes VALUES(
14 ov_id,
15 dro_id,
16 sto_id,
17 eto_id,
18 acto_id,
19 otfk_id,
20 slfk_id,
21 sttso_id,
22 empfk_id
23 );
24
25 END;
26 /
Procedure created.
结果:
SQL> BEGIN
2 sp_insertovertimes
3 ('9',
4 DATE '2019-08-07',
5 to_timestamp('01:12', 'hh24:mi'),
6 current_timestamp,
7 'Kerja Lembur',
8 '1',
9 '1',
10 'Kampret',
11 1);
12 END;
13 /
PL/SQL procedure successfully completed.