Как поместить функцию в 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 шт):
Упрощённо, вот так (на 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 Андромеда Корпорация