Как поместить функцию в PL/SQL пакет?

Надо написать функцию, которая примет "Корпорация Андромеда" и выведет наоборот, т.е. - "Андромеда Корпорация".

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

CREATE OR REPLACE FUNCTION company_n (base_string VARCHAR2) RETURN VARCHAR2 
IS
    first_word VARCHAR2(50);
    second_word VARCHAR2(50);
BEGIN
    first_word:=regexp_substr(base_string, '(\S*)(\s)');
    second_word:=regexp_substr(base_string, '(\s)(\S*)',1, 1);
    return(second_word||first_word);
END company_n;

Суть задачи: создать PL/SQL пакет, который будет содержать предыдущую функцию и еще одну, которая будет принимать id_company и возвращать name_of_company в перевернутом виде (суть как у предыдущей функции).

Упростим таблицу до:

CREATE TABLE companies (
    id_company NUMBER(8),
    name_of_company VARCHAR2(50)
);

Не понимаю насчет самого пакета, как его создать и поместить в него эти функции. И было бы очень здорово если бы помогли создать вторую функцию где принимается id, а возвращается название наоборот.


Ответы (1 шт):

Автор решения: 0xdb

Упрощённо, вот так (на db<>fiddle):

create table t (id int, name varchar2 (50 char));
insert into t values (1, 'Корпорация  Андромеда');

create or replace package pack as
    function getName (id int) return varchar2;  
end pack;
/
create or replace package body pack as
    function reverseName (name varchar2) return varchar2 is
        n t.name%type := trim (name);
    begin
        return substr (n, instr (n, ' ', -1)+1)||' '||substr (n, 1, instr (n, ' ')-1);
    end reverseName;
    
    function getName (id int) return varchar2 is
        pragma udf;  
    begin
        for r in (select name from t where id = getName.id) loop
            return (reverseName (r.name));
        end loop;
        return 'none';
    end getName ;
end pack;
/

Вот так воспользоватся и получить результат:

select id, pack.getName (id=>id) name from t;

        ID NAME                    
---------- ------------------------
         1 Андромеда Корпорация    
→ Ссылка