为什么带默认值的参数为空?

时间:2018-05-26 14:34:37

标签: oracle plsql oracle11g

我只想问一个简单的问题,我的包中有一个过程:procedure(p_x默认的sysdate)。但是,当我尝试使用这个p_x在我的procdure中进行查询时,我的表格中没有任何内容。我的假设是p_x没有从sysdate获取值并且它为null。为什么会这样?我该如何解决?

提前致谢。

在包装中:

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 :(得分:3)

我认为Wernfried是对的,这取决于你究竟是怎么称呼的。只需在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=

答案 1 :(得分:2)

目前(截至18c),PLSQL参数规范中的default:=子句的行为类似于表列定义中的12c default子句。也就是说,只有在根本没有指定相应的列时才会应用默认值。

如果将表格列定义为

somedate date default sysdate

然后,如果insert语句根本没有提到列somedate,则只会为其分配默认值。如果insertsomedate设置为null,那么它将为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