我只想问一个简单的问题,我的包中有一个过程: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;
答案 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
,则只会为其分配默认值。如果insert
将somedate
设置为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参数默认值,请考虑在此投票给我的建议: