Я хочу функцию excute, но она терпит неудачу. вы мне поможете?

#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, приятно знать, я никогда не слышал об этом, честно.