где определить значение по умолчанию в пакете Oracle - PullRequest
4 голосов
/ 31 августа 2011

когда вы определяете пакет в oracle, появляется заголовок, а затем тело.

Необходимо определить все параметры в обоих местах. Я хочу сделать один из параметров необязательным для вызывающей программы (IBM Message Broker). Нужно ли добавлять значение по умолчанию в заголовок и определение тела?

Кроме того, кто-нибудь может подтвердить, что MessageBroker сможет вызывать процесс без указания какого-либо значения параметра по умолчанию?

Спасибо!

Обновление: я заметил, что я могу добавить по умолчанию в заголовок, а не тело, или я могу добавить его в обоих. Я не могу добавить это только в тело.

Какая разница между добавлением его к обоим и только к заголовку?

Обновление:

Я могу сделать это, если в спецификации указать только значение по умолчанию, а не тело. Или я также могу указать значение по умолчанию в обоих местах. В чем разница?

create or replace
package myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number default null
);
end myPackage;

create or replace
package body myPackage is
PROCEDURE myProc  (
    parm1 IN varchar2,                           
    parm1 IN date,                     
    parm1 IN number
) is
...
...
...
end myProc;
end myPackage;

Ответы [ 2 ]

6 голосов
/ 31 августа 2011

Если вы хотите сделать параметр необязательным, то вы должны указать значение по умолчанию.Я был бы удивлен, если значение по умолчанию работает должным образом, если его нет в объявлении тела.

Я вошел в привычку делать все мои спецификации спецификации пакета точными копиями объявлений тела пакета, чтобы избежать проблем.

РЕДАКТИРОВАТЬ:

Как указывает OP, он может быть только в спецификации, и он работает.Если это в теле, но не в спецификации, возникает ошибка:

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1', p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Warning: Package body created with compilation errors
SQL>

Но если только в спецификации, все работает:

SQL> CREATE OR REPLACE PACKAGE p AS
  2  PROCEDURE prc(p1 VARCHAR2 DEFAULT 'P1Dflt', p2 VARCHAR2);
  3  END;
  4  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY p AS
  2  PROCEDURE prc(p1 VARCHAR2, p2 VARCHAR2)
  3  IS
  4  BEGIN
  5    dbms_output.put_line(p1||','||p2);
  6  END;
  7  END;
  8  /

Package body created
SQL> DECLARE
  2  BEGIN
  3    p.prc(p2=>'Test');
  4  END;
  5  /

P1Dflt,Test

PL/SQL procedure successfully completed

SQL> 

Тем не менее, ответ на вопросЧто касается его разницы, то, похоже, нет никакой разницы между установкой значения по умолчанию только в спецификации или в обоих местах - конечный результат одинаков.Я хотел бы повторить мое убеждение, что вы должны поместить его в обоих местах для документальных целей.

1 голос
/ 01 сентября 2011

В пакете вы можете иметь переменные / константы по умолчанию либо в спецификации, либо в теле.Лично я помещаю их в тело, поскольку мне не нужно смотреть на спецификацию, чтобы понять, что происходит;Я знаю, что официальный Oracle не согласен со мной.В теле это должно быть прямо под create or replace

. Я немного озадачен вашим использованием параметра word, хотя это означает, что вы передаете это функциям / процедурам в вашем пакете.Если у вас есть глобальная переменная, заданная в спецификации или теле пакета, вам вообще не нужно никуда ее передавать.Если вы изменяете глобал, то вы просите целую кучу беспорядка или будете дарить его тому, кто последует за вами через годы.

Если вы используете его только для одной функции / процедурызатем установите его в объявлении для этого конкретного элемента.

Это должно помочь.

...