Мне нужно преобразовать нижеприведенную функцию из DB2 в Oracle, кто-нибудь может помочь? Я понятия не имею о DB2

#sql #database #oracle #function #db2

#sql #База данных #Oracle #функция #db2

Вопрос:

Мне нужно преобразовать нижеприведенную функцию из DB2 в Oracle, кто-нибудь может помочь? Я понятия не имею о DB2 :

 CREATE FUNCTION READMSGS(   SOURCE_NAME    VARCHAR(12),  SOURCE_SCHEMA  VARCHAR(12), SOURCE_VERSION    VARCHAR(64),  EXPLAIN_LEVEL     CHAR(1))                            
RETURNS TABLE ( ID varchar(20),
                  DEPTNUM INT,
                  AVGSAL DECIMAL (9,2),
                  EMPCNT INT,
                  WORKDEPT INT )
  LANGUAGE SQL
  DETERMINISTIC
  NO EXTERNAL ACTION
  READS SQL DATA
  RETURN 
  
  SELECT       ID,
               DEPTNUM,
               AVGSAL,
               EMPCNT,
               WORKDEPT
  FROM EMP3  ;
  

Комментарии:

1. Это странно сконструированная табличная функция. Он имеет 4 параметра, на которые нет ссылок, а затем просто возвращает набор записей, содержащий 5 столбцов из таблицы EMP3. Кроме того, его действия полностью противоречат названию EXPLAINSMSGS; независимо от того, какие значения вы ему передаете, он просто игнорирует их и выполняет простой ВЫБОР. Я не понимаю, почему вы хотите преобразовать ее в Oracle? (или что-нибудь еще!). Есть какая-то особая причина?

2. Я думаю, что я не совсем понимаю, почему вы хотите перенести этот код DB2 в новую среду. Вежливо выражаясь, это чушь! Вы проверили, действительно ли она используется где-либо в вашей системе? Согласно ответу @devaol, вы могли бы создать его как представление, но тогда почему вы назвали его «READMSGS» (извините, неправильно написано как «EXPLAINMSGS» в предыдущем комментарии), когда кажется, что это какая-то таблица «employee» и не имеет ничего общего с чтением сообщений?

Ответ №1:

Функция DB2 объявлена как ДЕТЕРМИНИРОВАННАЯ. Это означает, что он вернет один и тот же набор строк для n числа вызовов. Просматривая этот код DB2, вам не понадобится функция в Oracle, скорее создайте представление для оператора select, как в

 CREATE VIEW explainmsgs КАК 
 ВЫБЕРИТЕ 
идентификатор, 
глубина, 
avgsal, 
empcnt, 
 workdept
 ИЗ emp3 
/

Комментарии:

1. Я знаю, что уже поздно, но спасибо.

Ответ №2:

Все параметры не используются, что немного странно.Вам нужно удалить их, если они не используются.

Мне кажется простым, что это просто возвращает пользовательскую таблицу / тип из функции. Вот моя слабая попытка решить ваш вопрос

первым шагом было бы создать пользовательский тип, если у вас его нет

 create or replace type CustomerType(
        ID Varchar2(20),
        DEPTNUM Number,
        AVGSAL Number,
        EMPCNT Number,
        WORKDEPT Number
    ); 
  

Вторая модифицированная функция в plsql

 FUNCTION EXPLAINSMSGS(SOURCE_NAME in VARCHAR2,SOURCE_SCHEMA in VARCHAR2, SOURCE_VERSION in VARCHAR2,EXPLAIN_LEVEL in Varchar2) return record is
  l_customType   CustomerType;
  l_ID Varchar2(20);
  l_DEPTNUM Number;
  l_AVGSAL Nubmer;
  l_EMPCNT Number,
  l_WORKDEPT Varchar2(100);

  Begin
    SELECT     ID,
               DEPTNUM,
               AVGSAL,
               EMPCNT,
               WORKDEPT
    INTO       l_ID,
               l_DEPTNUM,
               l_AVGSAL,
               l_EMPCNT,
               l_WORKDEPT  
  FROM EMP3  ;

  l_customType :=CustomerType(l_ID,l_DEPTNUM,l_AVGSAL,l_EMPCNT,l_WORKDEPT);

  Return l_customType;

  End;
  

Комментарии:

1. Я знаю, что уже поздно, но спасибо.