#oracle #plsql #oracle11g
#Oracle #plsql #oracle11g
Вопрос:
У меня есть функция:
CREATE OR REPLACE FUNCTION GET_NEXT_SEQ (string code1) RETURN NUMBER
BEGIN
DECLARE seq_date DATE ;
DECLARE seq_no number(8,0) ;
DECLARE next_seq number(8,0);
seq_date = SELECT SEQ_DATE FROM PARAM_SEQ ps WHERE SEQ_CODE = code1;
seq_no = SELECT SEQ_NO FROM PARAM_SEQ ps WHERE SEQ_CODE = code1;
IF seq_date = TO_DATE(sysdate,'YYYY-MM-DD HH24:MI:SS')
BEGIN
next_seq := seq_no 1;
END
IF seq_date <> TO_DATE(sysdate,'YYYY-MM-DD HH24:MI:SS')
BEGIN
next_seq := 1;
END
UPDATE PARAM_SEQ
SET SEQ_DATE = TO_DATE(sysdate,'YYYY-MM-DD HH24:MI:SS') , SEQ_NO = next_seq
WHERE SEQ_CODE = code1;
RETURN next_seq;
END
Но я не могу исключить функцию. Я называю это так:
BEGIN
DECLARE c NUMBER(8,0);
c := GET_NEXT_SEQ ('SI_TELEX_NO');
dbms_output.put_line('SI_TELEX_NO: ' || c);
END;
Комментарии:
1. это функция:
2. Вы когда-нибудь заглядывали в руководство по PL / SQL, чтобы узнать, как писать функции в Oracle? Взгляните на какой-нибудь пример кода, и вы обнаружите ошибки в коде вашей функции, поскольку я уверен, что он не компилируется. Если вы используете sqldev для написания подобного кода pl / sql, он сообщит вам, где и какие ошибки.
3. Сначала вы должны ознакомиться с основными правилами синтаксиса PL / SQL
4. Никогда не вызывайте
TO_DATE()
значение, которое уже являетсяDATE
(в вашем случаеSYSDATE
)
Ответ №1:
Ваша функция содержит так много ошибок:
- Вы не можете использовать declare для создания объекта. Объявление предназначено для анонимных блоков.
- Вам не нужно форматировать
sysdate
. это уже дата. Однако, поскольку даты хранятся в виде пакетов, возможно, вам следует пересмотреть сравнение строки с использованием to_char . Неясно, что вы хотите сравнить. - Вы не можете выполнять DML внутри функций, если собираетесь использовать их как часть инструкции select.
- Я не знаю, хотите ли вы обновлять только тогда, когда seq_date отличается от sysdate
string
обычно не используется в качестве типа данных для входного параметра в Oracle.
В любом случае, примером может быть
CREATE OR REPLACE FUNCTION GET_NEXT_SEQ (code1 in varchar2) RETURN NUMBER
is
seq_date date ;
seq_no number(8,0) ;
next_seq number(8,0);
begin
SELECT SEQ_DATE , SEQ_NO into seq_date, seq_no FROM PARAM_SEQ ps WHERE SEQ_CODE = code1;
IF seq_date = sysdate
then
next_seq := seq_no 1;
elsif seq_date <> sysdate
then
next_seq := 1;
UPDATE PARAM_SEQ SET SEQ_DATE = sysdate , SEQ_NO = next_seq WHERE SEQ_CODE = code1;
end if;
RETURN next_seq;
END;
/
Комментарии:
1. Хотя я не могу вспомнить, чтобы кто-либо когда-либо использовал ее, STRING является допустимым типом данных в Oracle. Было, по крайней мере, с версии 10 (возможно, раньше, я никогда не смотрел до этого). Смотрите здесь . В СТАНДАРТЕ пакета это определено как «строка подтипа — VARCHAR2;»
2. @Belayer, приятно знать, я никогда не слышал об этом, честно.