首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle-Sqldeveloper函数:"END my_function;“语句中的编译错误

Oracle-Sqldeveloper函数:"END my_function;“语句中的编译错误
EN

Stack Overflow用户
提问于 2017-08-11 03:20:31
回答 1查看 129关注 0票数 0

因此,我正在调试一个带有编译错误的sql函数:

错误(16,1):PLS-00103:遇到符号"/“

..which发生在函数的最末尾:

代码语言:javascript
复制
create or replace
function total_weekdays(fromdate in date, todate in date)
  return number
  as totaldays number := 0;
  dates number := 0;
BEGIN
  select to_number(count(dates)) into totaldays from
  (select to_char(fromdate + level -1, 'dd/mm/YYYY DY') as dates
    from dual connect by level <= todate - fromdate +1
  minus
  select to_char(ho_date, 'dd/mm/YYYY DY') as dates
    from FS.fs_holiday
    ) where not regexp_like(dates,'SUN|SAT');
return totaldays;
END;
/

Prompt *** RPT_PACK_GEN_INV_MOVEMENT Package ***
CREATE OR REPLACE PACKAGE REPORTS_CLIENT."RPT_PACK_GEN_INV_MOVEMENT" AS

  Procedure GEN_INV_MOVEMENT(pv_RunDate_i DATE default null);
  Procedure RE_GEN_INV_MOVEMENT(pv_RunDate_i DATE default null);
  Procedure GEN_INV_MOVEMENT_SUMMARY(pv_RunDate_i DATE default null);
  Procedure GEN_Opening(pv_RunDate_i DATE);

end RPT_PACK_GEN_INV_MOVEMENT;
EN

回答 1

Stack Overflow用户

发布于 2017-08-11 03:37:04

您所展示的内容可以在工作表中正常编译(没有演示的FS.模式前缀):

代码语言:javascript
复制
create table fs_holiday(ho_date date);

create or replace
function total_weekdays(fromdate in date, todate in date)
  return number
  as totaldays number := 0;
  dates number := 0;
BEGIN
  select to_number(count(dates)) into totaldays from
  (select to_char(fromdate + level -1, 'dd/mm/YYYY DY') as dates
  from dual connect by level <= todate - fromdate +1
minus
 select to_char(ho_date, 'dd/mm/YYYY DY') as dates
 from fs_holiday
 ) where not regexp_like(dates,'SUN|SAT');
 return totaldays;
END;
/

Function TOTAL_WEEKDAYS compiled

如果您在对象查看器中打开该函数并单击SQL选项卡,那么它将不带斜杠显示。

把斜杠加回去,然后编译,就会得到你所看到的错误,

代码语言:javascript
复制
Error(15,1): PLS-00103: Encountered the symbol "/" The symbol "/" was ignored. 

在对象查看器上下文中,您不应该使用斜杠。在工作表中,以in SQL*Plus的身份,SQL Developer:

...处理PL/SQL子程序的方式与处理SQL命令的方式相同,不同之处在于分号(;)或空行不会终止和执行块。通过输入句点(.)终止PL/SQL子程序在一条新的线路上。还可以通过在新行上输入斜杠(/)来终止和执行PL/SQL子程序。

因此,在工作表中,必须使用斜杠来分隔(已命名的)块的末尾,并标识整个create语句。

在对象查看器中,您只能看到该对象的代码,因此不需要使用斜线分隔符,SQL窗口中的所有内容都被视为对象源代码的一部分。

类似地,如果查看user_source数据字典视图,会发现没有为斜杠存储任何行。

代码语言:javascript
复制
select line, text from user_source where name = 'TOTAL_WEEKDAYS' order by line;

      LINE TEXT
---------- --------------------------------------------------------------------------------
         1 function total_weekdays(fromdate in date, todate in date)
         2   return number
         3   as totaldays number := 0;
         4   dates number := 0;
         5 BEGIN
         6   select to_number(count(dates)) into totaldays from
         7   (select to_char(fromdate + level -1, 'dd/mm/YYYY DY') as dates
         8   from dual connect by level <= todate - fromdate +1
         9 minus
        10  select to_char(ho_date, 'dd/mm/YYYY DY') as dates
        11  from fs_holiday
        12  ) where not regexp_like(dates,'SUN|SAT');
        13  return totaldays;
        14 END;

14 rows selected.

它是客户端语句处理的一部分,而不是函数的一部分。

如果您在对象查看器中,则不能在同一SQL窗口中创建第二个对象。这是您正在查看的对象的源代码。

如果您想在脚本中一次创建多个对象,则使用工作表(右键单击您的连接并选择“Open SQL worksheet”),将所有代码放入其中,然后作为脚本运行(F5)。如果你想使用object视图然后展开你的连接,右击“Packages”选项,然后选择“New Package”。

阅读有关managing objectsSQL Worksheet的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45621937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档