2015-11-03 130 views
0

下面是经过3个输入参数创建功能如何解决ORA-00933:SQL命令在oracle中没有正确结束?

CREATE OR replace PACKAGE "PKG_CAMPAIGN_EMAIL_QTY" 
AS 
    FUNCTION Getcampaignoutgoingemailqty(
    tablename  IN VARCHAR2, 
    ActivatedDate IN DATE, 
    CompletedDate IN DATE) 
    RETURN NUMBER; 
END pkg_campaign_email_qty; 

/

下面是该查询得到计数

SELECT 
(
pkg_campaign_email_qty.Getcampaignoutgoingemailqty(
     9142632263013677974, 
     To_date('20/10/2015', 'DD/MM/YYYY'), 
     To_date('30/11/2015', 'DD/MM/YYYY') 
    ) 
) AS 
email 
FROM dual; 

获取ORA-00933软件包:SQL命令未在Oracle

正确地结束

这里是包装体

CREATE OR REPLACE PACKAGE BODY "PKG_CAMPAIGN_EMAIL_QTY" as 
FUNCTION getCampaignOutgoingEmailQty(tableName IN VARCHAR2 ,ActivatedDate DATE,CompletedDate DATE) RETURN NUMBER IS 
OutgoingEmailQuantity NUMBER; 
    begin 
     EXECUTE IMMEDIATE 'select NVL(COUNT(1),0) from campaign_'||tableName||' 
      join flat_interactions out_email on campaign_'||tableName||'.fullname=out_email.o_parent_id and out_email.N9135700037713613964=9135706250013621563 and out_email.D9135699928113613119 between TO_DATE(''ActivatedDate'',''MM/dd/YYYY'') and TO_DATE(''CompletedDate'',''MM/dd/YYYY'')' INTO OutgoingEmailQuantity; 
RETURN OutgoingEmailQuantity ; 
    EXCEPTION 
     WHEN OTHERS THEN 
     RETURN 0; 
    end getCampaignOutgoingEmailQty; 
end PKG_CAMPAIGN_EMAIL_QTY; 
/
+0

请你可以更新你的问题,以显示Getcampaignoutgoingemailqty代码(这将是在包体中)。 – Boneist

+1

我没有得到运行你的代码的错误。我得到零,因为你在包函数中压缩的异常 - 当别人不这样做时,不要使用'''''''''''''''''''''''' –

+0

我没有看到使用这么差的异常处理程序的任何观点。 –

回答

1

我不知道这是不是你看到的错误的原因,但有一个与功能代码的问题 - 如果你看一下里面的execute眼前,你有

'<snip> and out_email.D9135699928113613119 between TO_DATE(''ActivatedDate'',''MM/dd/YYYY'') and TO_DATE(''CompletedDate'',''MM/dd/YYYY'')' 

这意味着,通过这些参数,你最终会试图执行的SQL语句:

select NVL(COUNT(1),0) 
from campaign_9142632263013677974 
     join flat_interactions out_email on campaign_9142632263013677974.fullname = out_email.o_parent_id 
              and out_email.N9135700037713613964 = 9135706250013621563 
              and out_email.D9135699928113613119 between TO_DATE('ActivatedDate','MM/dd/YYYY') 
              and TO_DATE('CompletedDate','MM/dd/YYYY'); 

所以,你要的字符串时明确转换“ActivatedDate”和“CompletedDate”到日期他们不是日期。

不是这样做,我会使用绑定变量,是这样的:

create or replace package body pkg_campaign_email_qty 
as 
    function getcampaignoutgoingemailqty(tablename in varchar2 ,activateddate date,completeddate date) 
    return number 
    is 
    outgoingemailquantity number; 
    begin 
    execute immediate 'select NVL(COUNT(1),0)'||chr(10)|| 
         'from campaign_'||tablename||chr(10)|| 
         '  join flat_interactions out_email on campaign_'||tablename||'.fullname=out_email.o_parent_id'||chr(10)|| 
         '           and out_email.N9135700037713613964=9135706250013621563'||chr(10)|| 
         '           and out_email.D9135699928113613119 between :ActivatedDate and :CompletedDate' into outgoingemailquantity using activateddate, completeddate; 
    return outgoingemailquantity; 
    exception 
    when others then 
     return 0; 
    end getcampaignoutgoingemailqty; 
end pkg_campaign_email_qty; 
/

注:未经测试,因为您没有提供任何表格定义。


顺便说一句,你的电话查询,外支架是不必要的,我会删除它们,所以您的查询就会变成:

SELECT pkg_campaign_email_qty.Getcampaignoutgoingemailqty(9142632263013677974, 
                  To_date('20/10/2015', 'DD/MM/YYYY'), 
                  To_date('30/11/2015', 'DD/MM/YYYY')) email 
FROM dual; 
+0

当你说'#Date From#'时,你的意思是说它是一个参数吗?什么会调用这个函数?一些前端代码(例如C#,Java等)或用户手动运行它?如果是后者,他们会在哪里运行它?作为脚本还是作为蟾蜍等图形用户界面中的临时声明? – Boneist

-1
SELECT 
(
    pkg_campaign_email_qty.Getcampaignoutgoingemailqty(9142632263013677974, To_date('20/10/2015', 'DD/MM/YYYY'), To_date('30/11/2015', 'DD/MM/YYYY'))) AS 
    email 
    FROM dual 
); <- missing 
+0

复制查询时错过了同样的问题 – Rahmath

1

您在动态SQL中使用错误的日期。

我会用结合为:

EXECUTE IMMEDIATE 
    'select NVL(COUNT(1),0) 
    from campaign_'||tableName||' 
    join flat_interactions out_email on 
     campaign_'||tableName||'.fullname=out_email.o_parent_id and 
     out_email.N9135700037713613964=9135706250013621563 and 
     out_email.D9135699928113613119 between :ActivatedDate and :CompletedDate' 
    INTO OutgoingEmailQuantity 
    USING ActivatedDate, CompletedDate; 

你想要做什么是更难遵循:

EXECUTE IMMEDIATE 
    'select NVL(COUNT(1),0) 
    from campaign_'||tableName||' 
    join flat_interactions out_email on 
     campaign_'||tableName||'.fullname=out_email.o_parent_id and 
     out_email.N9135700037713613964=9135706250013621563 and 
     out_email.D9135699928113613119 between 
      TO_DATE('||to_char(ActivatedDate,'MM/dd/YYYY')||',''MM/dd/YYYY'') 
      and 
      TO_DATE('||to_char(CompletedDate,'MM/dd/YYYY')||',''MM/dd/YYYY'')' 
    INTO OutgoingEmailQuantity; 
相关问题