PL SQL цикл формируется в методах - PullRequest
1 голос
/ 15 апреля 2020

В пакете у меня есть процедуры, которые вызывают другие процедуры и формируют цикл и получают ошибку «PLS-00313:« Контрольный список »не объявлен в этой области».

Checklist procedure -> Task method.
Task method -> Step Checklist method.
Step Checklist method -> Checklist method.

Как решить эту проблему? Есть ли у pl sql что-то вроде прототипов c ++?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

если в вашем пакете есть частные процедуры или функции, которые вы хотите вызвать.

- это те частные функции и процедуры, которые не определены в спецификации

Альтернатива 1: процедура, которая всегда вызывается в верхней части тела пакета или в верхней части вызывающего абонента.

например: Контрольный список опубликован c

create OR REPLACE PACKAGE mypck AS 
  procedure Checklist procedure;
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- private procedures

  procedure Step Checklist is ... -- should be here because is called from  Task method, calls public checklist procedure

  procedure Task is ... -- should be here,because it calls private Step Checklist procedure and is called from  Checklist

 -- public procedures

  procedure Checklist is ... -- calls private Task procedure

  procedure main is ... -- calls public Checklist procedure

END mypck; 
/ 

Альтернатива 2: использовать прямое объявление для все частные процедуры, видимые в теле пакета, путем ввода подписи для всего тела

create OR REPLACE PACKAGE mypck AS 
  procedure main;
end;
/
CREATE OR REPLACE PACKAGE BODY mypck AS 

  -- forward declaration here of all private signature

  procedure Task ;
  procedure Step Checklist;
  procedure Checklist;

  -- define implementation of private procedures

  -- use in order you want to use it
  procedure Step Checklist is ... -- calls private Checklist procedure 

  procedure Task is ...  -- calls private Step Checklist procedure

  procedure Checklist is ...  -- calls private Task procedure


  -- public procedure

  procedure main is -- calls private Checklist procedure

END mypck; 
/ 
1 голос
/ 15 апреля 2020

Есть два способа решения этой проблемы.

Первый подход состоит в том, чтобы «исправить» ошибку области, включив checklist() в спецификацию пакета (что делает его опубликованным c и, таким образом, на него может ссылаться любая процедура, определенная в теле) или с помощью отправьте декларацию для определения процедур в верхней части тела пакета (что позволяет последующим процедурам ссылаться на них независимо от порядка, в котором написаны процедуры). Это решения, предоставленные @ hotfix .

Однако есть проблема с этим подходом: ваш код выполняет рекурсивный l oop, как это

Checklist -> Task -> Step Checklist -> Checklist

Так что вы должны что-то кодировать в checklist() или step checklist() который разрывает цикл и раскручивает код. Для этого нужно сделать красный флаг, что говорит о том, что в вашем дизайне что-то не так

Следовательно, второй подход заключается в том, чтобы сделать шаг назад и рассмотреть, есть ли другой способ реализации вашей бизнес-логики c без зависимости cycli c. Зависимости Cycli c являются плохой вещью в архитектуре программного обеспечения, и их следует по возможности избегать Обычное решение состоит в том, чтобы изолировать общую зависимость - в этом случае операцию, которую нужно выполнить и checklist(), и step checklist() - и извлечь ее в новую подпрограмму. Затем измените обе процедуры, чтобы вызвать новую процедуру.

Это может быть легко или сложно достигнуть, в зависимости от характера общей зависимости: будет проще исправить чистый кусок кода и труднее исправить рекурсию в базовой модели данных. В любом случае стоит потратить время на удаление зависимости cycli c. Графики зависимостей Acycli c менее хрупкие, более понятные и простые в обслуживании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...