Oracle SQL 开发人员

Posted

技术标签:

【中文标题】Oracle SQL 开发人员【英文标题】:Oracle SQL deveoper 【发布时间】:2016-08-08 09:00:46 【问题描述】:

我需要制作一个自动时间系统。我想知道哪个 SHIPPING1, SHIPPING 有很多卡车,每辆卡车将在装卸码头停留 30 分钟, 例如。 :

运输 1 : 3 卡车

truck    Time
-----    ----- 
truck1   11.00,
truck2   11.30.
truck3   12.00

如果我输入了卡车 1 的时间,那么卡车 2 将分配到之后的 30 分钟,以此类推。

是否可以为此制作自动序列?

【问题讨论】:

欢迎来到 SO。在这里您可以找到有关 How to Ask 以及如何构建 minimal reproducible example 的信息 【参考方案1】:

使用排序器的解决方案:

CREATE SEQUENCE TRUCK_SEQUENCE MINVALUE 0 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 0 CACHE 20 NOORDER NOCYCLE;

SELECT 'NEXT_CAR',
TO_CHAR(TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')+1/24/60*30*TRUCK_SEQUENCE.NEXTVAL, 'dd.mm.yyyy hh24:mi:ss')
 FROM DUAL;

缺点:一旦您从音序器中拉出,该时间框架就会丢失。这意味着,例如,如果您决定在 11:00 不加载汽车 3(从表中删除)但要加载汽车 4(另一个插入),您将得到 11:30。这是音序器的实际功能。

使用表中最大时间的解决方案:

WITH LOAD_TIMES AS
  (SELECT 'TRUCK1'                                       AS CAR,
    TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss') AS TIME
     FROM DUAL
  )
 SELECT 'TRUCK2',
  TO_CHAR(MAX(TIME)+1/24/60*30, 'dd.mm.yyyy hh24:mi:ss')
   FROM LOAD_TIMES;

缺点:您每次都查询整个表以找到最大使用时间,然后增加它。

所有解决方案通用:

--This is basic offset (date to start with)
TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')

【讨论】:

没错,我在这个解决方案的缺点部分也说过。请注意原始请求,但是 是否可以为此进行自动排序?如果我想做这样的事情,我会先查看并尝试找到间隙(未被占用)并且不小于当前 sysdate,但这比要求的要复杂得多。要求很模糊。 我们知道什么是“自动序列”吗?我当然不会。【参考方案2】:

您可以在insert 语句中尝试类似的操作,而不是使用sequence

考虑TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')shipping1的初始时间

INSERT INTO table1
(shipping_number, truck_number, truck_time) 
VALUES ('shipping1', 'truck3', 
(SELECT count(truck_number) 
FROM table1
group by shipping
WHERE shipping_number='shipping1')*30/(24*60)+TO_DATE('08.08.2016 10:00', 'dd.mm.yyyy hh24:mi:ss')));

【讨论】:

以上是关于Oracle SQL 开发人员的主要内容,如果未能解决你的问题,请参考以下文章

用于 Oracle 开发人员/dba 的 SQL 服务器

标记 SQL Oracle 开发人员最佳实践

Oracle sql 开发人员 - 连接“xe”不存在?

长期 Oracle 开发人员/DBA 学习 SQL Server - 书籍推荐?

安装 SQL Server 2017 开发人员版时 Oracle JRE 规则失败

如何使用 pl/sql 脚本导出 oracle sql 开发人员表模式?