2017-08-30 107 views
0

我已经在Oracle中创建了下面的包创建一个存储过程:在包甲骨文

CREATE OR REPLACE PACKAGE PackageName AS 

TYPE general_item 
IS 
    RECORD 
    (
    item_no item_t.item_no%TYPE , 
    item_type item_t.item_type%TYPE, 
    item_state item_t.item_state%TYPE, 
    item_name item_t.item_name%TYPE, 
    prodname_no item_t.prodname_no%TYPE, 
    prod_name item_t.prod_name%TYPE, 
    prodname_no2 item_t.prodname_no2%TYPE, 
    prod_name2 item_t.prod_name2%TYPE, 
    prodtype_no item_t.prodtype_no%TYPE, 
    prodtype_name item_t.prodtype_name%TYPE, 
    designer_no item_t.designer_no%TYPE, 
    designer_name item_t.designer_name%TYPE, 
    req_assembly item_t.req_assembly%TYPE, 
    unit_name item_t.unit_name%TYPE, 
    valid_designer item_t.valid_designer%TYPE, 
    sale_start_date item_t.sale_start_date%TYPE, 
    sale_end_date item_t.sale_end_date%TYPE, 
    short_material_text item_t.short_material_text%TYPE, 
    imeas_ref_imp item_t.imeas_ref_imp%TYPE, 
    imeas_ref_met item_t.imeas_ref_met%TYPE, 
    valid_design_text item_t.valid_design_text%TYPE, 
    pe_no item_t.pe_no%TYPE, 
    hfb_no item_t.hfb_no%TYPE, 
    hfb_name item_t.hfb_name%TYPE, 
    pra_no item_t.pra_no%TYPE, 
    pra_name item_t.pra_name%TYPE, 
    pa_no item_t.pa_no%TYPE, 
    pa_name item_t.pa_name%TYPE, 
    rec_sales_price item_t.rec_sales_price%TYPE, 
    currency_code item_t.currency_code%TYPE, 
    base_item_no item_cty_spec_t.item_no%TYPE, --YB added 2014-05-01 
    comclass_name item_comclass_t.comclass_name%TYPE); --YB added 2014-05-01 


     PROCEDURE general_get_item(
     p_item_no IN item_t.item_no%TYPE, 
     p_item_type IN item_t.item_type%TYPE, 
     p_item OUT general_item); 


END PackageName; 

,这里是我的过程,我试着去创造:

create or replace PACKAGE BODY PackageName 
AS 
PROCEDURE general_get_item(
    p_item_no IN item_t.item_no%TYPE, 
    p_item_type IN item_t.item_type%TYPE, 
    p_item OUT general_item) 
IS 
BEGIN 
    OPEN p_item FOR SELECT it.item_no, it.item_type, it.item_state, it.item_name, it.prodname_no , it.prod_name, it.prodname_no2, it.prod_name2, it.prodtype_no, it.prodtype_name, it.designer_no, it.designer_name, it.req_assembly, it.unit_name, it.valid_designer, it.sale_start_date, it.sale_end_date, it.short_material_text, it.imeas_ref_imp, it.imeas_ref_met, it.valid_design_text, it.pe_no, it.hfb_no, it.hfb_name, it.pra_no, it.pra_name, it.pa_no, it.pa_name, it.rec_sales_price, it.currency_code, icst.item_no as base_item_no, ict.comclass_name 
    FROM item_t it, item_cty_spec_t icst, 
    (SELECT item_no, item_type, comclass_name FROM item_comclass_t 
    WHERE valid_from < SYSDATE AND valid_to >= SYSDATE) ict 
    WHERE it.item_no = icst.item_no_cty_spec (+) AND it.item_type = icst.item_type_cty_spec (+) 
    AND it.item_no = ict.item_no (+) AND it.item_type = ict.item_type (+) 
    AND it.item_no = p_item_no 
    AND it.item_type = p_item_type; 
END general_get_item; 
END PackageName; 

当我尝试创建过程中,我得到以下信息:

错误(8,3):PL/SQL:SQL语句忽略错误(8,8):PLS-00456:项目 'P_ITEM'不是游标

在Oracle中使用包和过程进行新操作。谁能帮我这个?

+0

错误消息很明显:'general_item'是**类型**。你不能打开一个类型也不能为该类型赋值。请解释你用tis代码解决什么问题? – krokodilko

+0

如果我不得不猜测你想要做什么,你想从select语句的值加载到记录类型中。如果是这种情况,请查看PL/SQL中的'INTO'子句。 –

回答

0

无法打开游标TYPERECORD。它必须是CURSOR类型。因此,只需更换这整个声明 -

TYPE general_item 
IS 
RECORD 
    (
    item_no item_t.item_no%TYPE , 
    item_type item_t.item_type%TYPE, 
    item_state i 
    ..... 


    ..... 
    comclass_name item_comclass_t.comclass_name%TYPE); 

TYPE general_item IS REF CURSOR; 
0

无法获取光标(可能是多行)为TYPE。没有表格结构很难想象这个字段是什么类型。 无论如何easiser的方法是使用item_t%ROWTYPE,如果游标返回一行。