如何使用时间戳类型数据制作程序

时间:2019-07-19 12:50:52

标签: sql oracle plsql

我试图在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;

3 个答案:

答案 0 :(得分:1)

输入值'07/08/2019'不是DATE,它是一个字符串值。 Oracle尝试使用您当前的会话NLS_DATE_FORMAT格式将其隐式转换为DATE值。使用TO_DATETO_TIMESTAMP函数或Datetime Literals例如DATE '2019-08-07'

根据输入参数dro_id IN DATE, sto_id IN TIMESTAMP,和值'07/08/2019','01:12',您可能会误解DATETIMESTAMP数据类型。

每个 DATE值都有一个日期和一个时间部分。即使仅提供日期部分,时间部分也将是00:00:00。没有理由将数据和时间值的列分开。

DATETIMESTAMP数据类型大致相同。两种数据类型都有日期和时间部分。主要区别在于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.