Условная процедура оракула Pl / sql - PullRequest
0 голосов
/ 07 октября 2019

Я хочу создать процедуру со следующим условием

$$
select 'Y'
     from dual
    where exists
             (select 'Y'
                from pa_expenditure_items_all paei, pa_expenditures_all pae
               where     paei.expenditure_id = pae.expenditure_id
                     and pae.incurred_by_person_id =&person_id
                     and paei.cost_distributed_flag = 'N')
$$

, если условие возвращает Null, тогда должно появиться сообщение об ошибке, а затем ошибка. для сообщения об ошибке я использую dbms_output.put_line и для ошибки я использую исключение, а затем кто-нибудь может мне помочь из этих

я пытаюсь эти

 create or replace procedure validate_terminate
declare
l_yes out varchar2 (1);
null_found exception;
is
begin
   select 'Y'
     into l_yes
     from dual
    where exists
             (select 'Y'
                from pa_expenditure_items_all paei, pa_expenditures_all pae
               where     paei.expenditure_id = pae.expenditure_id
                     and pae.incurred_by_person_id =&person_id
                     and paei.cost_distributed_flag = 'N');

   if l_yes is null
   then
      dbms_output_put_line ('Condition is not met'); 
   raise null_found;
   end if;
   exception 
   when null_found then 
     dbms_output_put_line('CANNOT PROCESS TERMINATE');
end;

Ответы [ 3 ]

0 голосов
/ 07 октября 2019

Ваше объявление переменных и обработка исключений некорректны.

Попробуйте следующий код:

create or replace procedure validate_terminate
declare
l_yes varchar2(1);
--null_found exception;
is
begin
   select 'Y'
     into l_yes
     from pa_expenditure_items_all paei, pa_expenditures_all pae
   where paei.expenditure_id = pae.expenditure_id
     and pae.incurred_by_person_id =&person_id
     and paei.cost_distributed_flag = 'N';
   exception 
   when no_data_found then 
     dbms_output_put_line ('Condition is not met'); 
     dbms_output_put_line('CANNOT PROCESS TERMINATE');
end;
/

Cheers !!

0 голосов
/ 07 октября 2019

PL / SQL не является интерактивным языком программирования. Это инструмент для материализации SQL и связанного кода, который вызывается из других клиентов. Это те клиенты, которые обрабатывают пользовательский ввод и другие вещи пользовательского интерфейса.

Так что идиоматическим способом написания вашей процедуры будет передача PERSON_ID в качестве параметра ....

create or replace procedure validate_terminate
   (p_person_id in pa_expenditure_items_all.incurred_by_person_id%type ) 
is
  l_yes out varchar2 (1);
  null_found exception;
is
begin
   select 'Y'
   into l_yes
   from dual
   where exists
             (select 'Y'
                from pa_expenditure_items_all paei
                     ,pa_expenditures_all pae
               where paei.expenditure_id = pae.expenditure_id
                 and pae.incurred_by_person_id =p_person_id
                 and paei.cost_distributed_flag = 'N');

   if l_yes is null
   then
      dbms_output_put_line ('Condition is not met'); 
   raise null_found;
   end if;
exception 
   when null_found then 
     dbms_output_put_line('CANNOT PROCESS TERMINATE');
end;

ТогдаВы вызываете процедуру следующим образом (при условии, что вы хотите использовать SQL * Plus, как подсказывает выбранный вами вариант записи):

exec validate_terminate(&person_id)

Примечание. Я предположил, что PERSON_ID является числовым;если это строка, вам нужно ее заключить в кавычки.

0 голосов
/ 07 октября 2019

При объявлении процедуры используйте IS вместо DECLARE - не используйте оба.

Вам не нужно проверять, является ли l_yes нулевым - если ваш выбор возвращает 0 строк,это автоматически вызовет исключение NO_DATA_FOUND. Просто поймайте это.

Вам не нужно выбирать второй раз (из двойного). Первый выбор отлично работает.

Не ставьте out после l_yes в объявлении. Это просто l_yes varchar2(1);.

Это dbms_output.put_line.

Используйте переменную связывания :person_id вместо переменной подстановки &person_id

set define off
create or replace procedure validate_terminate
is
   l_yes varchar2(1);
begin
   select 'Y'
     into l_yes
     from dual
    where exists
             (select 'Y'
                from pa_expenditure_items_all paei, pa_expenditures_all pae
               where     paei.expenditure_id = pae.expenditure_id
                     and pae.incurred_by_person_id = :person_id
                     and paei.cost_distributed_flag = 'N');

   exception 
   when NO_DATA_FOUND then
     dbms_output.put_line ('Condition is not met');  
     dbms_output.put_line('CANNOT PROCESS TERMINATE');
     raise;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...