2015-12-21 84 views
0

我想将光标插入我的自定义tableObject,但并不总是找到它。ORACLE将自定义tableObject用于函数

我的纪录:

create or replace type "RECORDRANKING" as object 
(

    -- Attributes 
    COL1 NUMBER, 
    COL2 VARCHAR(50), 
    COL3 NUMBER 

    -- Member functions and procedures 
-- member procedure <ProcedureName>(<Parameter> <Datatype>) 
) 

这是对象表:

CREATE OR REPLACE TYPE "TBRANKING" AS TABLE OF RECORDRANKING; 

现在我进入创建函数(成包):

CREATE OR REPLACE PACKAGE BODY PKLBOTTONI as 
FUNCTION testlb 
( 
p_gapup IN NUMBER, 
p_gadown IN NUMBER 
) 
RETURN SYS_REFCURSOR IS 
cursor_ranking SYS_REFCURSOR; 
position NUMBER ; 
gap_ranking TBRANKING; 
gaprecord RECORDRANKING; 
upgap NUMBER; 
downgap NUMBER; 
    BEGIN 
     select * into cursor_ranking from(
     select pkranking.getRanking( 100) from dual); 

LOOP 
FETCH cursor_ranking INTO gap_ranking; 
EXIT WHEN cursor_ranking%NOTFOUND; 
    INSERT INTO gap_ranking  (COL1,COL2,COL3) 
    VALUES 
    (cursor_ranking.C1, 
    cursor_ranking.C2, 
    cursor_ranking.C3); 
END LOOP; 
return gap_ranking; 
END; 


END PKLBOTTONI; 

我总是得到:

Compilation errors for PACKAGE BODY PKLBOTTONI 

Error: PL/SQL: ORA-00942: table or view does not exist 
Line: 32 
Text: INSERT INTO gap_ranking 
+0

创建表第一 –

+0

如何可以创造吗? – lbottoni

+0

什么版本的oracle? – kevinsky

回答

0

在循环中,您既进入“gap_ranking”,又尝试再次“插入”它。插入到集合中不是有效的语法。无论是在循环中,还是使用批量收集一次获取多个记录,提取都可以。

从您的摘录看来,它看起来并不像物理数据库表,所以在PL/SQL中执行它的方式如下所示。

对于使用更多的帮助集合,您可以检查以下过甲骨文的文档: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm

SQL> set serveroutput on 
SQL> declare 
    2 gap_ranking tbranking := tbranking(null); -- initialize 
    3 begin 
    4 gap_ranking.delete; -- clear empty record 
    5 for cur in 
    6  (select level as i from dual connect by level <= 5) 
    7 loop 
    8  -- insert empty 
    9  gap_ranking.extend; 
10  -- attribute values 
11  gap_ranking(gap_ranking.last) := recordranking(1000 + cur.i, 'TEST' || cur.i, 10 + cur.i); 
12 end loop; 
13 -- loop to print - just to illustrate 
14 for j in gap_ranking.first .. gap_ranking.last 
15 loop 
16  dbms_output.put_line(gap_ranking(j).col1 || ',' || 
17       gap_ranking(j).col2 || ',' || 
18       gap_ranking(j).col3); 
19 
20 end loop; 
21 -- same as... 
22 for j in 1 .. gap_ranking.count 
23 loop 
24  dbms_output.put_line(gap_ranking(j).col1 || ',' || 
25       gap_ranking(j).col2 || ',' || 
26       gap_ranking(j).col3); 
27 
28 end loop; 
29 end; 
30/
1001,TEST1,11 
1002,TEST2,12 
1003,TEST3,13 
1004,TEST4,14 
1005,TEST5,15 
1001,TEST1,11 
1002,TEST2,12 
1003,TEST3,13 
1004,TEST4,14 
1005,TEST5,15 
PL/SQL procedure successfully completed 

SQL> 
+0

但在函数中我可以写(声明???)我写...封装,函数..但是这对我写全部很重要 – lbottoni

+0

请使用我的示例函数 – lbottoni

+0

这是一个样本,让你感受它。我不清楚你想用插件完成什么。为什么在实际尝试插入数据_values_时使用ref游标? –