#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. Я знаю, что уже поздно, но спасибо.