Вы можете создать представление на основе вашего запроса. («Представление» означает просто именованный запрос, код которого сохранен для будущего использования; представление не содержит никаких данных. Поэтому, даже если вы не хотите создавать таблицы на рабочем сервере, возможно, все в порядке для создания представлений.) Затемвы можете использовать это представление при вызове процедуры проверки соответствия.
Сначала давайте уточним, что DBMS_STAT_FUNCS.normal_dist_fit
не является функцией, как может быть предложено FUNCS в имени пакета (и, как выскажем в вашем посте), но процедура . Фактически, все подпрограммы в этом пакете являются процедурами!
Документация для пакета неверна .
https://docs.oracle.com/database/121/ARPLS/d_stat_f.htm#ARPLS68476
В нем говорится, что mean
и stddev
являются IN параметрами. Они не;это OUT параметров. Не совсем понятно, зачем они нужны в этой процедуре (есть отдельные функции для их вычисления), но, опять же, это не мой выбор, а Oracle.
Вот краткий пример использования normal_dist_fit
процедура на физической таблице (из другой схемы: стандартная HR
схема). Обратите внимание, что у меня должна быть привилегия select any table
или какая-либо другая привилегия, которая позволяет мне выбирать из таблиц в схеме HR
. (Я вошел не как HR
, а как другой пользователь, MATHGUY
.)
declare
mn number;
sd number;
sw number;
begin
dbms_stat_funcs.normal_dist_fit('HR', 'EMPLOYEES', 'SALARY',
'SHAPIRO_WILKS', mn, sd, sw);
end;
/
W value : .8739562109117848523112862359519603805821
PL/SQL procedure successfully completed.
(Обратите внимание, что аргумент для теста Шапиро-Уилка 'SHAPIRO_WILKS' , с S в конце, возможно, у Oracle была веская причина для этого, хотя я сомневаюсь в этом.)
Теперь, скажем, в моей схеме Iиметь этот запрос, который производит столбец чисел:
select salary * (1 + nvl(commission_pct, 0)) as total_compensation
from hr.employees
;
Это вычисляет общую компенсацию, включая комиссию (для тех сотрудников, у которых есть такая; звонок NVL
необходим, потому что для сотрудников без комиссии,процент отображается как NULL, а не ноль).
Я создам представление на основе этого запроса ... но мне нужно будет иметь необходимые привилегии, и есть лишь небольшаяосложнение.
До сих пор я предполагал, что могу выбрать из таблицы в схеме HR
;действительно, у меня есть привилегия SELECT ANY TABLE
. Но в моем случае у меня есть эта привилегия через роль . Это нормально для выбора, но не ОК для создания представления на основе этого SELECT
. Чтобы создать представление, я должен иметь SELECT ANY TABLE
(или гораздо более слабый грант: чтобы выбрать конкретно из этой таблицы, или, возможно, ограничить его только двумя необходимыми столбцами) , предоставленный мне напрямую ,не через роль. Это то, что вам нужно обсудить с вашим администратором базы данных;эта привилегия у вас уже есть (в противном случае ваш существующий SELECT
не будет работать), но если у вас есть эта роль через роль, теперь вам нужно будет предоставить ее непосредственно вам. И, конечно, у вас должна быть привилегия CREATE VIEW
.
OK, поэтому предположим, что у вас есть нужные привилегии. Затем вы можете сделать это:
Создать представление
create or replace view my_emp(total_comp)
as
select salary*(1 + nvl(commission_pct, 0)) from hr.employees;
Вызвать процедуру
declare
mn number;
sd number;
sw number;
begin
dbms_stat_funcs.normal_dist_fit('MATHGUY', 'MY_EMP', 'TOTAL_COMP',
'SHAPIRO_WILKS', mn, sd, sw);
end;
/
W value : .8852586932906502861798487994791857389177