Oracle преобразует функцию pl/sql в sql

Мне нужно преобразовать это 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;

Пожалуйста, опишите вашу текущую проблему. В приведенном выше коде не используется какой-либо расширенный PL/SQL, это очень простой код, который выглядит более или менее одинаково на любом процедурном языке. И мы не знаем anumb и fraction определений. И какова цель этого перехода с PL/SQL на SQL?

astentx 20.02.2023 09:29

Какой SQL вы хотите использовать в качестве цели? ANSI/ISO SQL PSM? (Т.е. какие СУБД вы собираетесь использовать?)

jarlh 20.02.2023 09:39

мы не можем создавать функции в oracle fusion, поэтому мне нужно сделать похожей эту функцию, такой же результирующий столбец, но в обычном sql, например, if else будет case when, в настоящее время я не очень хорошо разбираюсь в plsql, поэтому я действительно не знаю, что такое anumb и fraction

Faris Adnan 20.02.2023 09:39

мы используем Oracle SQL

Faris Adnan 20.02.2023 09:41

Начиная с 12c вы можете объявлять функции локально с помощью с plsql_declarations: with function numb(cnumber in number) return varchar2 ....

astentx 20.02.2023 10:50

Похоже, вы могли бы заменить это выражением case, to_char() и другими вызовами встроенных функций. Это немного зависит от того, что делают отсутствующие функции - и мы этого не знаем, они в вашем коде. Но если вы можете вызывать встроенные функции, почему вы не можете вызывать пользовательскую функцию?

Alex Poole 20.02.2023 10:51

мы все равно не можем вызывать встроенные функции в этом случае, мне просто нужно найти функции anumb и fraction

Faris Adnan 20.02.2023 12:29

Как я писал в комментарии выше: если ваше приложение поддерживает предложение with и ваша СУБД не является древней, вы можете объявить эти функции локально и использовать точно такой же код, как в пакете SQL Developer или PL/SQL. Просто получите другие объявления и вставьте их в инструкцию SQL. Его нужно протестировать на производительность, но его гораздо проще реализовать без особого реверс-инжиниринга. См. пример в скрипте

astentx 20.02.2023 12:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
8
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете запросить разрешение на выполнение этой функции, если она находится в схеме другого пользователя, отличного от того, с которым ваше приложение подключается к базе данных. Если бы это было что-то довольно простое, логика могла бы быть реализована с помощью оператора case. Тем не менее, в этой функции я вижу вызовы Fraction и Anumb, которые, я полагаю, являются некоторыми другими функциями, и я не могу представить, что они делают.

да, вы правы, мне тоже нужно увидеть эти функции, чтобы заменить полученные значения в качестве подзапросов.

Faris Adnan 20.02.2023 12:30
Ответ принят как подходящий
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

Faris Adnan 20.02.2023 12:24

Я понимаю, вы хотите преобразовать только эту функцию: numb в версию SQL, так что есть, но что вы делаете в anumb и franction idk, и никто не мог знать

SebCza 20.02.2023 13:49

Хотя этот блок кода может ответить на вопрос, этот ответ будет гораздо полезнее, если вы объясните, чем этот код отличается от кода в вопросе, что вы изменили, почему вы его изменили и почему это решает проблему без представляя других.

Gravitate 21.02.2023 13:49

Другие вопросы по теме