Почему параметр со значением по умолчанию равен нулю? - PullRequest
0 голосов
/ 26 мая 2018

Я просто хочу задать простой вопрос, у меня есть процедура в моем пакете: процедура (p_x в sysdate по умолчанию).Однако, когда я пытаюсь использовать этот p_x для выполнения запроса в моей процедуре, я ничего не получаю из своей таблицы.Я предполагаю, что p_x не получает значения из sysdate, и это ноль.Почему это происходит?Как я могу это исправить?

Заранее спасибо.

В упаковке:

Procedure M_m(p_x in default sysdate)

В упаковке:

Procedure M_m(p_x in default sysdate) as

cursor cur is select manager_id, manager_name,manger_department 
  from employ_table where trunc(EmploymentDate)=trunc(p_x);
r_cur cur%rowtype;

Begin
  for r_cur in cur 
  loop
  DBMS_OUTPUT.PUT_LINE(employ_table.manager_id || employ_table.manager_name 
   || employ_table.manager_department);   
end loop;

end;

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

В настоящее время (по состоянию на 18c) предложение default или := в спецификации параметров PLSQL ведет себя как предложение pre-12c default в определении столбца таблицы.То есть значение по умолчанию применяется только тогда, когда соответствующий столбец вообще не указан.

Если вы определите столбец таблицы как

somedate date default sysdate

, тогда ему будет назначено только значение по умолчаниюесли оператор insert вообще не упоминает столбец somedate.Если insert устанавливает somedate в null, тогда он будет нулевым, независимо от значения по умолчанию.То же самое относится и к параметрам PL / SQL.Явное значение null, переданное в параметре, переопределяет любое значение по умолчанию, установленное для параметра.

Вам необходимо определить локальную константу вдоль строк

k_x constant date := coalesce(p_x,sysdate);

, а затем получить остальныепроцедуры ссылаются на это вместо параметра.

В 12c у нас есть default on null для столбцов таблицы, но, на мой взгляд, PL / SQL отстает, так как не имеет эквивалентного синтаксиса для значений параметров по умолчанию.Если вы передаете null параметру PL / SQL, он учитывает null, а не значение по умолчанию, которое вы указали, поскольку у него нет синтаксической опции on null.

Если вы хотите, чтобы Oracle расширялПараметры PL / SQL по умолчанию расположены в тех же строках, что и столбцы таблицы, а затем рассмотрите возможность голосования за мое предложение здесь:

https://community.oracle.com/ideas/18189

0 голосов
/ 26 мая 2018

Полагаю, Вернфрид прав, это зависит от того, как именно вы это называете.Просто добавьте DBMS_OUTPUT.PUT_LINE(p_x) непосредственно перед FOR, чтобы проверить значение переменной:

CREATE TABLE employ_table AS SELECT * FROM scott.emp;
UPDATE employ_table SET hiredate=SYSDATE WHERE ename='SCOTT';

CREATE OR REPLACE PACKAGE P IS
  PROCEDURE M_m(p_x IN DATE DEFAULT sysdate);
END;
/

CREATE OR REPLACE PACKAGE BODY p IS

  PROCEDURE M_m(p_x IN DATE DEFAULT sysdate) IS
    CURSOR cur IS 
    SELECT * FROM employ_table WHERE TRUNC(hiredate)=TRUNC(p_x);
  BEGIN
    DBMS_OUTPUT.PUT_LINE('p_x='||p_x); 
    FOR r_cur IN cur LOOP
      DBMS_OUTPUT.PUT_LINE(r_cur.mgr);   
    END LOOP;
  END M_m;

END P;
/

EXEC P.m_m(DATE '1980-12-17');
p_x=1980-12-17 00:00:00
7902

EXEC P.m_m();
p_x=2018-05-26 17:50:11
7566

EXEC P.m_m(NULL);
p_x=
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...