代码:
CREATE OR REPLACE FUNCTION DAY_ORD_SF
(
P_DATE_CREATED IN bb_basket.dtcreated%type
)
RETURN DATE AS
lv_date_created bb_basket.dtcreated%type;
BEGIN
SELECT to_char(to_date(P_DATE_CREATED,'yyyy-mm-dd'),'DAY') DAY_CREATED
INTO lv_date_created
FROM BB_BASKET
WHERE lv_date_created <= sysdate
ORDER BY lv_date_created ASC;
RETURN lv_date_created;
END DAY_ORD_SF;
/
SELECT IDBASKET, dtcreated date_created, to_char(DTCREATED,'DAY') DAY_CREATED, day_ord_sf(dtcreated) weekday_created
FROM BB_BASKET
order by DTCREATED asc;
这是我的存储函数,我正在练习存储函数的任务。我真的快要完成这个问题了,但是我得到了一个没有找到数据的错误。我并不是真的理解这个错误,因为当我自己运行代码时,它是有效的。基本上,这个函数的作用是接受一个日期并返回一个varchar2数据类型。我确实有"to_date(…,'yyyy-mm-dd'),..“在将这段代码添加到函数中之前。此任务的第一部分是创建一条SELECT语句,列出每个篮子的篮子ID和工作日,第二部分是创建一条SELECT语句,使用GROUP BY子句列出每个工作日的篮子总数。根据结果,哪一天是最受欢迎的购物日?我也忘了问,如果你能告诉我为什么我得到了“没有数据找到”的错误,将不胜感激!
谢谢你帮我的忙!
发布于 2019-03-11 01:47:25
好吧,这里似乎有多个问题。
让我们从没有发现数据问题开始。如果在select语句中使用INTO,而select没有返回任何行,则会得到一个未找到数据的异常。这可以通过内部有异常处理程序的匿名begin end块来处理,但我相信情况并非如此。举个例子:
declare
v_value number;
begin
select null
into v_value
from dual
where 1=2;
exception
when NO_DATA_FOUND then
null; -- Ignore exception and continue
end;
条件1=2永远不会满足,因此select始终不返回任何行,这将始终产生no data found错误。使用异常处理程序,我们决定下一步要做什么。在此示例中,Null将不执行任何操作。
返回到您的函数,您的条件是如果变量lv_date_created小于或等于当前日期,则执行某些操作。这永远不会起作用,因为lv_date_created在执行时将等于null。它只是在您的函数中声明,然后在您的select中使用。这将始终导致false,因此select将始终不返回任何行,也不返回任何数据发现异常。
您还提到,您希望函数返回varchar2,但您的定义是它返回日期。此外,变量lv_date_created的类型是date,这是返回的变量,您用Oracle值填充它,所以显然varchar2的值正在进行一些不受控制的转换,这不会抛出预期数据类型的异常。
另外,条件lv_date_created <= sysdate可能表示select将找到多个值,如果找到多个行,这将导致太多行异常。
现在让我们开始修复这个函数。主要的问题是,你是否需要在其中选择一些东西。选择类似的东西通常用于检查表中的条目是否存在,并且没有发现数据异常将告诉我们条目不存在。如果它是一个通用的函数,在你的数据库中的多个地方使用,那么我认为select是不需要的。我将包括这两个解决方案作为示例。
请注意,对于第一个示例,您不应该在调用它时提供dtcreated列,而应该提供idBase.
CREATE OR REPLACE FUNCTION DAY_ORD_SF
(
P_IDBASKET IN bb_basket.idbasket%type
)
RETURN VARCHAR2 AS
lv_date_created VARCHAR2(240);
BEGIN
SELECT to_char(dtcreated,'DAY') DAY_CREATED
INTO lv_date_created
FROM BB_BASKET
WHERE IDBASKET = P_IDBASKET;
RETURN lv_date_created;
END DAY_ORD_SF;
/
或
CREATE OR REPLACE FUNCTION DAY_ORD_SF
(
P_DATE_CREATED IN bb_basket.dtcreated%type
)
RETURN VARCHAR2 AS
BEGIN
RETURN to_char(P_DATE_CREATED,'DAY');
END DAY_ORD_SF;
/
https://stackoverflow.com/questions/55093915
复制