2017-08-31 54 views
0

定義されたレコードをOUTパラメータとして使用できますか?ストアドプロシージャのOUTパラメータとしてレコードを使用する

私はこのような何かやりたい:私は次の操作を実行しようとしてい

create or replace PACKAGE WEBSEARCH 
AS 

TYPE rec_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); --YB added 2014-05-01 

CURSOR columns RETURN rec_general_item; 

    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 columns); 
END WEBSEARCH; 

EDIT を:

create or replace PACKAGE MIX_WEBSEARCH 
AS 

TYPE rec_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); --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 rec_general_item); 
END MIX_WEBSEARCH; 

そして、ここでは、本体である:

create or replace PACKAGE BODY MIX_WEBSEARCH 
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 c_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; 

ときパッケージの本体を作成しようとすると、次のエラーが表示されます。

Error(3,5): PL/SQL: Item ignored 
Error(6,16): PLS-00201: identifier 'C_GENERAL_ITEM' must be declared 
Error(41,16): PLS-00323: subprogram or cursor 'GENERAL_GET_ITEM' is declared in a package specification and must be defined in the package body 

私はここで間違っていますか?誰か説明できますか? :)

+0

----これを試してみて、あなたの現在のエラーが解決されます。違いを見るには私とMT0の答えを見てください。 –

答えて

0

あなたは強く型付けされたカーソルを指定するCURSOR型を宣言することができます。

CREATE PACKAGE WEBSEARCH 
AS 
    TYPE rec_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 
); 

    TYPE general_item_cursor IS REF CURSOR RETURN rec_general_item; 

    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_cursor 
); 
END WEBSEARCH; 
/

CREATE PACKAGE BODY WEBSEARCH 
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_cursor 
) 
    IS 
    BEGIN 
    OPEN p_item FOR 
    SELECT item_no, item_type, item_state 
    FROM item_t 
    WHERE item_no = p_item_no AND item_type = p_item_type; 
    END; 
END WEBSEARCH; 
/
1

はい、このようにそれを書く:

create or replace PACKAGE WEBSEARCH 
AS 

    TYPE rec_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); 

    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 rec_general_item); 
END; 

create or replace PACKAGE BODY WEBSEARCH 
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 rec_general_item) is 

    begin 
     SELECT p_item_no, p_item_type, 1 
     INTO p_item 
     FROM dual; 
    end; 

END; 
+0

@WenfriedDomscheit:begin-statementで構文エラーが発生しました: "構文エラー部分的に認識されたルール(鉄道図) – Bryan

+0

私の更新を参照してください –

+0

あなたの答えをありがとう、私はまだ同じエラーが発生します:) – Bryan

0

あなたが現在PLS-00201のようになっているエラーとPLS-00323は、パッケージ宣言とパッケージ本体のTYPEの名前の不一致に起因するものです。パッケージ本体に "c_general_item"と書かれています。これは "rec_general_item"でなければなりません。 あなたが `RECORD`と` REF CURSOR`を混ぜ

create or replace PACKAGE BODY MIX_WEBSEARCH 
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 rec_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;