Мне нужно преобразовать это pl/sql
в не pl/sql
, так как у нас нет доступа к функциям и пакетам в oracle fusion, но в настоящее время я ничего не знаю о pl/sql
, поэтому я понятия не имею, что делает эта функция, может ли кто-нибудь помочь?
FUNCTION numb(CNUMBER IN NUMBER) RETURN VARCHAR2 IS
TR NUMBER;
FR NUMBER;
fakat VARCHAR2(20) := 'فقط';
l_vc_ar_num VARCHAR2(32766);
BEGIN
IF cnumber > 999999999999.99 THEN
RETURN 'Please enter a number less than 1 Trillion (1,000,000,000,000.00).';
END IF;
TR := TRUNC(CNUMBER, 0);
FR := (ROUND(CNUMBER, 2) - TRUNC(CNUMBER, 0)) * 100;
--if fractional part exists then do not append fakat
--EXCEPTION IS 1 halala where we have to append fakat
IF FR > 0 THEN
IF TR = 0 THEN
IF FR = 1 THEN
l_vc_ar_num := fraction(FR) || ' ' || fakat;
ELSE
l_vc_ar_num := fraction(FR);
END IF;
ELSE
l_vc_ar_num := anumb(TR) || ' و' || fraction(FR);
END IF;
ELSE
l_vc_ar_num := anumb(TR) || ' ' || fakat;
END IF;
RETURN REPLACE(REPLACE(l_vc_ar_num, ' ', ' '), ' ', ' ');
EXCEPTION
WHEN OTHERS THEN
RETURN 'function numb. Others. Ex.' || SQLERRM;
END;
Какой SQL вы хотите использовать в качестве цели? ANSI/ISO SQL PSM? (Т.е. какие СУБД вы собираетесь использовать?)
мы не можем создавать функции в oracle fusion, поэтому мне нужно сделать похожей эту функцию, такой же результирующий столбец, но в обычном sql, например, if else
будет case when
, в настоящее время я не очень хорошо разбираюсь в plsql
, поэтому я действительно не знаю, что такое anumb
и fraction
мы используем Oracle SQL
Начиная с 12c вы можете объявлять функции локально с помощью с plsql_declarations: with function numb(cnumber in number) return varchar2 ...
.
Похоже, вы могли бы заменить это выражением case, to_char()
и другими вызовами встроенных функций. Это немного зависит от того, что делают отсутствующие функции - и мы этого не знаем, они в вашем коде. Но если вы можете вызывать встроенные функции, почему вы не можете вызывать пользовательскую функцию?
мы все равно не можем вызывать встроенные функции в этом случае, мне просто нужно найти функции anumb
и fraction
Как я писал в комментарии выше: если ваше приложение поддерживает предложение with
и ваша СУБД не является древней, вы можете объявить эти функции локально и использовать точно такой же код, как в пакете SQL Developer или PL/SQL. Просто получите другие объявления и вставьте их в инструкцию SQL. Его нужно протестировать на производительность, но его гораздо проще реализовать без особого реверс-инжиниринга. См. пример в скрипте
Вы можете запросить разрешение на выполнение этой функции, если она находится в схеме другого пользователя, отличного от того, с которым ваше приложение подключается к базе данных. Если бы это было что-то довольно простое, логика могла бы быть реализована с помощью оператора case. Тем не менее, в этой функции я вижу вызовы Fraction и Anumb, которые, я полагаю, являются некоторыми другими функциями, и я не могу представить, что они делают.
да, вы правы, мне тоже нужно увидеть эти функции, чтобы заменить полученные значения в качестве подзапросов.
WITH tmp AS (
SELECT
CNUMBER
, TRUNC(CNUMBER, 0) TR
, (ROUND(CNUMBER, 2) - TRUNC(CNUMBER, 0)) * 100 FR
, 'فقط' fakat
FROM
(
SELECT
123332 CNUMBER
FROM dual
)
)
SELECT
CASE
WHEN CNUMBER > 999999999999.99 THEN
'Please enter a number less than 1 Trillion (1,000,000,000,000.00).'
ELSE
REPLACE(
REPLACE(
CASE WHEN FR > 0 THEN
CASE WHEN TR = 0 THEN
CASE WHEN FR = 1 THEN
fraction(FR) || ' ' || fakat
ELSE
fraction(FR)
END
ELSE
anumb(TR) || ' و' || fraction(FR)
END
ELSE
anumb(TR) || ' ' || fakat
END
, ' ', ' '
)
, ' ', ' '
)
END numb
FROM tmp;
так что теперь мне нужно найти функцию anumb
и fraction
и каким-то образом передать значение параметра cnumber
Я понимаю, вы хотите преобразовать только эту функцию: numb в версию SQL, так что есть, но что вы делаете в anumb и franction idk, и никто не мог знать
Хотя этот блок кода может ответить на вопрос, этот ответ будет гораздо полезнее, если вы объясните, чем этот код отличается от кода в вопросе, что вы изменили, почему вы его изменили и почему это решает проблему без представляя других.
Пожалуйста, опишите вашу текущую проблему. В приведенном выше коде не используется какой-либо расширенный PL/SQL, это очень простой код, который выглядит более или менее одинаково на любом процедурном языке. И мы не знаем
anumb
иfraction
определений. И какова цель этого перехода с PL/SQL на SQL?