Я хочу преобразовать мой MySQL теперь в оракула, но это, для создания терминалов для управления назначением - PullRequest
0 голосов
/ 16 июня 2019

Я вне оракула, но я не пришел к удачному коду. Мне просто нужно 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 ;

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Извините, я не совсем понимаю , в чем цель этой процедуры, но - если «напоминание» вам о синтаксисе 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>

Видимо, что-то , но результат, вероятно, неправильный.

0 голосов
/ 16 июня 2019

Мне кажется, что ваша процедура должна быть такой:

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 в качестве разделителя комментария к строке используется --, , а не -.Точно так же оператор присваивания :=, а не : =.Я также преобразовал это, чтобы считать дни вверх, а не уменьшать, поскольку это более ясно (на мой взгляд), что происходит при отладке.

Удачи.

...