-1

我没有甲骨文,但我没有找到成功的代码。我只需要踢 1-2 次就可以让我的大脑活跃起来。

CREATE OR REPLACE PROCEDURE kalender_erstellen (monday DATE)
IS
  v1 NUMBER (10) DEFAULT 5;
  v2 NUMBER (10) DEFAULT 1;
  vDate DATE;
BEGIN
  vDate: = monday;

  WHILE v1> 0 LOOP - goes through the days (5 days)

    v2: = 1; - Reset the appointments

    WHILE v2 <20 LOOP - Goes through the appointments per day (20 appointments)
      INSERT INTO Event
        VALUES (NULL, NULL, NULL, NULL, NULL, TO_DATE (MINUTE, (30 * v2), TIMESTAMP ('07: 30: 00 ')));

     - First, the date is converted into a TimeStamp. Subsequently, 30 minutes are expected per run.

      v2: = v2 + 1; - Counter for the dates
    END LOOP;

    vDate: = (vDate, INTERVAL '31' DAY); - Add a day to the day
    v1: = v1 - 1; - Counter for the days
  END LOOP;
END;

Error(326,14): PLS-00382: expression is of wrong type
Error(326,5): PL/SQL: Statement ignored
Error(320,7): PL/SQL: SQL Statement ignored

原始 MySQL 代码:

 DELIMITER $$
 DROP PROCEDURE IF EXISTS  kalender_erstellen $$
 CREATE PROCEDURE kalender_erstellen (monday DATE)
 BEGIN
 DECLARE v1 INT(6) DEFAULT 5;
 DECLARE v2 INT(6) DEFAULT 1;
 DECLARE vDate DATE;

 SET vDate = monday;

  WHILE v1 > 0 DO -- geht die Tage durch (5 Tage)

SET v2 = 1; -- Setzt die Termine zurück
WHILE v2 < 20 DO -- Geht die Termine pro Tag durch (16 Termine)
  INSERT INTO Termin VALUES (NULL,NULL, NULL, NULL, NULL, TIMESTAMPADD(MINUTE,(30 * v2),TIMESTAMP(vDate,'07:30:00'))); 
  -- Erst wird das Date in einen TimeStamp umgewandelt. Anschließend werden pro durchlauf 30 min drauf gerechnet.

  SET v2 = v2 + 1; -- Counter für die Termine
END WHILE;

SET vDate = DATE_ADD(vDate, INTERVAL 31 DAY); -- Addiert auf den Tag einen Tag
SET v1 = v1 - 1; -- Counter für die Tage
    END WHILE;
    END$$
  DELIMITER ;
4

2 回答 2

0

很抱歉,我不太明白这个过程的目的是什么,但是 - 如果“提醒”你 Oracle 语法有帮助,那么你就去吧请注意,我不会说 MySQL,所以我的一些疑问肯定取决于此。

几点说明:

  • 应该是:=,不是: =,例如vdate := monday;
  • 评论标有两个连续的连字符--,而不仅仅是一个-
  • 无论如何,我删除了几列(从event表中)null,所以......在这里使用它们没有任何目的
  • 第 18 行(在第 21 行中描述):我不知道你想要得到什么结果。如果可能的话,发布一个例子,我(或其他人)可能会有所帮助
  • 第 28 行:您似乎要添加 31 天(看起来更像是一个月而不是一天;这就是我使用的原因add_months(并添加了 1 个月)。如果您想添加一天,那么vDate := vDate + 1

SQL> create table event (col date);

Table created.

SQL> create or replace procedure kalender_erstellen (monday date)
  2  is
  3    v1 number (10) default 5;
  4    v2 number (10) default 1;
  5    vdate date;
  6  begin
  7    vdate := monday;
  8
  9    while v1 > 0 loop -- goes through the days (5 days)
 10
 11      v2 := 1; -- Reset the appointments
 12
 13      while v2 < 20 loop -- Goes through the appointments per day (20 appointments)
 14        insert into event
 15          values (
 16                  -- NULL, NULL, NULL, NULL, NULL,
 17                  -- TO_DATE (MINUTE, (30 * v2), TIMESTAMP ('07: 30: 00 ')));
 18                  vdate + 30 / (24 * 60)
 19                 );
 20
 21       -- First, the date is converted into a TimeStamp. Subsequently, 30 minutes are
 22       -- expected per run.
 23
 24        v2 := v2 + 1; -- Counter for the dates
 25      end loop;
 26
 27      -- vDate := (vDate, INTERVAL '31' DAY); -- Add a day to the day
 28      vdate := add_months(vdate, 1);          -- "31 day" looks more like a "month" than a "day"
 29      v1 := v1 - 1; -- Counter for the days
 30    end loop;
 31  end;
 32  /

Procedure created.

测试:

SQL> exec kalender_erstellen(date '2019-06-17');

PL/SQL procedure successfully completed.

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select * from event where rownum < 4;

COL
-------------------
17.06.2019 00:30:00
17.06.2019 00:30:00
17.06.2019 00:30:00

SQL>

显然,它做了一些事情,但结果可能是错误的。

于 2019-06-16T19:43:35.980 回答
0

在我看来,您的程序应该是:

CREATE OR REPLACE PROCEDURE kalender_erstellen (monday DATE)
IS
  nDay_count  NUMBER := 1;
  nAppt_count NUMBER := 1;
  vDate       DATE;
BEGIN
  vDate := monday;

  WHILE nDay_count <= 5 LOOP -- goes through the days (5 days)
    nAppt_count := 1; -- Reset the appointments

    WHILE nAppt_count < 20 LOOP -- Goes through the appointments per day (20 appointments)
      INSERT INTO Event
        VALUES (NULL, NULL, NULL, NULL, NULL, 
                TRUNC(SYSDATE)  + INTERVAL '450' MINUTE + ((30 * nAppt_count )/1440));
      --       beginning-of-day + 07:30                 + (30 *nAppt_count ) minutes

      nAppt_count := nAppt_count + 1; -- Counter for the dates
    END LOOP;

    vDate := vDate + INTERVAL '31' DAY;  -- this adds 31 days to vDate which seems to conflict with the comment in the original code.  ???

    nDay_count := nDay_count + 1; -- Counter for the days
  END LOOP;
END;

将字段列表从 INSERT 语句中删除是不好的做法 - 我强烈建议您添加它。此外,PL/SQL 中的行注释分隔符是--而不是 -。同样,赋值运算符是:=,不是: =。我还将它转换为向上计算天数,而不是递减,因为它更清楚(在我看来)调试时发生了什么。

于 2019-06-16T19:35:26.970 回答