Tshumore Ответов: 2

Как мне получить все записи с падением дня рождения сегодня в oracle


Я получаю синтаксическую ошибку с хранимой процедурой PL/SQL :

Errors: check compiler log
Error starting at line : 1 in command -
exec GET_BIRTHDAYS
Error report -
ORA-06550: line 1, column 7:
PLS-00905: object SYS.GET_BIRTHDAYS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:



Требование состоит в том, чтобы запросить таблицу Oracle для всех записей, где день рождения клиента приходится на сегодняшний день, то есть на текущую дату. Для всех возвращенных строк я затем хочу захватить соответствующий адрес электронной почты, а затем использовать его в другом месте моего приложения.

Это моя хранимая процедура :
create or replace PROCEDURE GET_BIRTHDAYS(returned_Email OUT VARCHAR2) AS   
   DECLARE 
   currentSystemDate VARCHAR2(128 Byte);
    DECLARE 
    custBirthday VARCHAR2(128 Byte);
     DECLARE 
    custEmail VARCHAR2(128 Byte);
BEGIN

SELECT into currentSystemDate TO_CHAR(SYSDATE,'DD-MON')  FROM dual
SELECT INTO custBirthday to_char(DATE_OF_BIRTH,'DD-MON') FROM STTM_CUST_PERSONAL WHERE DATE_OF_BIRTH=currentSystemDate
SELECT INTO custEmail E_MAIL FROM STTM_CUST_PERSONAL WHERE DATE_OF_BIRTH=custBirthday
returned_Email:= custEmail 
END GET_BIRTHDAYS;


Просто для ясности в таблице
STTM_CUST_PERSONAL
DATE_OF_BIRTH хранится как 16 июля 2020 года, 13 марта 1964 года и т.д.

Что я упускаю?

Это мой первый раз, когда я создаю хранимые процедуры с базой данных Oracle, и я думаю, что есть некоторые тонкие вещи, которые мне не хватает.

Что я уже пробовал:

Синтаксическая ошибка всплывает именно в строке :
DECLARE 
   currentSystemDate VARCHAR2(128 Byte);
для объявления типа данных.

Я уже проверил с помощью отдельных запросов, что я могу сегодняшнюю дату с :
SELECT TO_CHAR(SYSDATE,'DD-MON')  FROM dual


и я могу получить компонент даты сравнения из первичной таблицы с помощью :
SELECT to_char(DATE_OF_BIRTH,'DD-MON') FROM STTM_CUST_PERSONAL

0x01AA

Разве это не так

...
DECLARE
currentSystemDate VARCHAR2(128 Byte);
custBirthday VARCHAR2(128 Byte);
custEmail VARCHAR2(128 Byte);
...

Richard MacCutchan

Это может быть то ответ.

0x01AA

Чем больше документальных фильмов о oracle я читаю, тем больше запутываюсь. Я уже не так уверен, что это проблема :-)

Richard MacCutchan

Я не смог найти ничего полезного в документации Oracle, но я видел некоторые примеры в ответах на SO.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
Как мне получить все записи с падением дня рождения сегодня в oracle

Не ваша реальная проблема, а другой подход.
Давайте предположим, что процедура будет выполняться каждый день, если в таблице около 20 человек, независимо от того, как вы это делаете, рабочая нагрузка будет примерно одинаковой, если таблица обрабатывает миллионы людей, то способ выполнения запроса имеет значение.
Ваш подход : среда выполнения линейна с количеством обрабатываемых людей, с некоторыми вычислениями для каждого человека в таблице SQL server не может выполнить никакой оптимизации.
Другой подход: сделайте поле "DayOfBirth", содержащее только день и месяц рождения в виде строки, поле является постоянным после создания (так же, как дата рождения), сделайте поле индексированным.
Разница: время выполнения зависит от количества людей с рождением сегодня, что примерно равно количеству людей/365, без вычислений для других людей, SQL server использует индекс, таким образом, ускорение.

Совет: вместо электронной почты верните идентификатор человека в таблицу, потому что вы можете персонализировать электронную почту с именем и возрастом.
Dear [FirstName],
We want to be first to whish you an happy [Age]th birthday.


Рейтинг:
0

Richard MacCutchan

Посмотрите на название вашей процедуры и имя, которое вы используете для ее вызова.


Tshumore

Извините , что это опечатка, я исправил ее соответствующим блоком ошибок.

Richard MacCutchan

Почему вы используете символьные строки в качестве дат? Используйте правильные типы Date или DateTime, чтобы ваш код мог правильно выполнять вычисления и сравнения.

Что касается сообщения об ошибке, то мне непонятно, на что оно жалуется. Но смотрите комментарии по адресу http://www.dba-oracle.com/t_pls_00905_object_is_invalid.htm[^].

Tshumore

Просто чтобы уточнить, есть ли ошибка, когда я на самом деле создал SP. Ошибка была на линии
ОБЪЯВЛЯТЬ
currentSystemDate VARCHAR2(128 байт); (Красная строка на VARCHAR2, которая говорит о синтаксической ошибке.Частично признанные правила (железнодорожные схемы))

Richard MacCutchan

Я думаю, что предложение выше 0x01AA может быть ответом. Я не могу найти железнодорожную диаграмму для оператора DECLARE.