2012-10-16 81 views
1

我试图编写一个函数,根据用户在月度报表中所做的选择来显示每月数据的值。下面的代码片段只是试图获取嵌套表中的值,并且一旦数据在嵌套表中成功加载,我将调用函数来显示表。我尝试了一些东西;但在加载数据时遇到问题。下面是2个不同的SQL来创建这个函数,但他们都得到相同的错误关于不正确的值;我已经尝试了一些事情,但无济于事:无法将值存储到oracle中的嵌套表

片段1:

/* Formatted on 10/16/2012 8:40:45 AM (QP5 v5.215.12089.38647) */ 

CREATE OR REPLACE TYPE tempObject AS OBJECT 
(
    kpiid number, 
    kpigroup VARCHAR2 (300) 
); 

CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject; 


CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
    mainarea IN VARCHAR2) 

    RETURN tempTable 
IS 
    MonthlyData temptable := temptable(); 
    n    INTEGER := 0; 

BEGIN 

    IF (mainarea = 'ALL') 

    THEN 
     FOR r IN (SELECT DISTINCT kpiid, kpigroup 
        FROM kpi_summary_reporting 
       WHERE kpifrequency = 'Monthly' AND active_ind = 'Y') 
     LOOP 
     monthlydata.EXTEND; 
     n := n + 1; 
     monthlydata (n) := tempobject (r.kpiid, r.kpigroup); 
     END LOOP; 
    END IF; 

    RETURN MonthlyData; 
END; 

错误:[错误] PLS-00306(26:29):PLS-00306:错号码或类型的参数来电 'TEMPOBJECT'

Snippet2:

/* Formatted on 10/16/2012 8:27:22 AM (QP5 v5.215.12089.38647) */ 
CREATE OR REPLACE TYPE tempObject AS OBJECT 
(
    kpiid NUMBER, 
    kpigroup VARCHAR2 (300) 
); 

CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject; 


CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
    mainarea IN VARCHAR2) 
    RETURN tempTable 
AS 
    MonthlyData temptable := temptable(); 
BEGIN 
    IF (mainarea = 'ALL') 
    THEN 
     SELECT DISTINCT ksr.kpiid, ksr.kpigroup 
     INTO MonthlyData 
     FROM kpi_summary_reporting ksr 
     WHERE kpifrequency = 'Monthly' AND active_ind = 'Y'; 
    ELSE 
     SELECT DISTINCT kpiid, kpigroup 
     INTO MonthlyData 
     FROM kpi_summary_reporting; 
    END IF; 

    RETURN MonthlyData; 
END; 

错误:[错误] ORA-00947(24:9):PL/SQL:ORA-00947:不够值

回答

0

我会这样做,假设数据足够小,将它完全加载到服务器PGA中的嵌套表中是非常有意义的。如果数据量较大,则可能需要使用流水线表函数。

由于嵌套表是对象类型的表,因此需要使用对象类型构造函数。

CREATE OR REPLACE FUNCTION KPI_HORIZON.Monthly_All_Data (
    mainarea IN VARCHAR2) 
    RETURN tempTable 
IS 
    MonthlyData temptable; 
BEGIN 
    IF (mainarea = 'ALL') 
    THEN 
     SELECT tempObject(kpiid, kpigroup) 
     BULK COLLECT INTO monthlydata 
     FROM kpi_summary_reporting 
     WHERE kpifrequency = 'Monthly' 
     AND active_ind = 'Y'; 
    END IF; 

    RETURN MonthlyData; 
END; 

当我在查询中看到DISTINCT时,我总是怀疑。你真的希望得到你需要删除的重复行吗?如果不是这样,你会更好地去除DISTINCT,如上所述。如果您确实需要DISTINCT,那么您的对象类型将需要MAPORDER方法,这会使示例稍微复杂一点。

这方面的一个示范工作

SQL> CREATE OR REPLACE TYPE tempObject AS OBJECT 
    2 (
    3  kpiid NUMBER, 
    4  kpigroup VARCHAR2 (300) 
    5 ); 
    6/

Type created. 

SQL> CREATE OR REPLACE TYPE tempTable AS TABLE OF tempObject; 
    2/

Type created. 

SQL> create table kpi_summary_reporting (
    2 kpiid integer, 
    3 kpigroup varchar2(300), 
    4 kpifrequency varchar2(30), 
    5 active_ind varchar2(1) 
    6 ); 

Table created. 

SQL> insert into kpi_summary_reporting values(1, 'Foo', 'Monthly', 'Y'); 

1 row created. 

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE FUNCTION Monthly_All_Data (
    2  mainarea IN VARCHAR2) 
    3  RETURN tempTable 
    4 IS 
    5  MonthlyData temptable; 
    6 BEGIN 
    7  IF (mainarea = 'ALL') 
    8  THEN 
    9  SELECT tempObject(kpiid, kpigroup) 
10   BULK COLLECT INTO monthlydata 
11   FROM kpi_summary_reporting 
12   WHERE kpifrequency = 'Monthly' 
13   AND active_ind = 'Y'; 
14  END IF; 
15  RETURN MonthlyData; 
16* END; 
17/

Function created. 

SQL> select monthly_all_data('ALL') from dual; 

MONTHLY_ALL_DATA('ALL')(KPIID, KPIGROUP) 
-------------------------------------------------------------------------------- 
TEMPTABLE(TEMPOBJECT(1, 'Foo')) 
+0

如果我尝试运行此查询我得到以下错误:[错误] ORA-02315(10:14):PL/SQL:ORA-02315:数目不正确的默认构造函数的参数 – user1750578

+0

@ user1750578 - 您的系统中定义的“tempObject”是否与问题中定义的方式完全相同?如果我在模式中创建一个虚拟的'kpi_summary_reporting'表并删除'KPI_HORIZON'模式限定符,则代码在我的环境中工作。 –

相关问题