2017-01-18 26 views
0

表を戻す関数を使用してパッケージを作成しています。ここでは(簡体字)のコードは次のとおりです。PL/SQL:ORA-00947:関数作成時に値が不十分です

DROP TYPE A_TABLE; 
/
CREATE OR REPLACE TYPE A_RECORD IS object (
    ID varchar(10), 
    Name varchar(500) 
); 
/
CREATE TYPE A_TABLE IS TABLE OF A_RECORD; 
/
CREATE OR REPLACE PACKAGE My_Package AS 

    results A_TABLE; 

    FUNCTION A_Data() 
    RETURN A_TABLE; 

END My_Package; 
/
CREATE OR REPLACE PACKAGE BODY My_Package IS 

    FUNCTION A_Data() RETURN A_TABLE IS results A_TABLE; 

    BEGIN 

    SELECT ID,Name 
    BULK COLLECT INTO results 
    FROM Customer_Table customer 

    RETURN results; 

    END A_Data; 

END My_Package; 
/

私はパッケージをコンパイルするには、このエラーを取得する:

Error(9,13): PL/SQL: ORA-00947: not enough values 

データベースがされているとして、現時点でそこにデータがないにもかかわらず、クエリ自体は動作します現時点で取り組んだ。なぜこれが壊れているのか理解できません。私はそれが型と関係するかもしれないと思いますか?

答えて

1

あなたは一つのレコードに2つの値を選択します。そのようには機能しません。

CREATE OR REPLACE PACKAGE BODY My_Package IS 

    FUNCTION A_Data() RETURN A_TABLE IS results A_TABLE; 

    BEGIN 

    SELECT A_RECORD(ID,Name) 
    BULK COLLECT INTO results 
    FROM Customer_Table customer 

    RETURN results; 

    END A_Data; 

END My_Package; 
/
+0

パーフェクト!私がそこで何をしたかを見てください!ありがとう! – Damien

1

問題は、型A_RECORDの

SELECT ID,Name -- here 
BULK COLLECT INTO results 
FROM Customer_Table customer 

オブジェクトが結果に収集する必要があります。ですから、お電話は

SELECT A_RECORD(ID,Name) BULK ...` 

のようにする必要があります。さらに、私はあなたが本当にタイプを外部に作る必要はないと思います。これは動作するはずです:

create or replace PACKAGE My_Package AS 
    TYPE A_TABLE IS TABLE OF Customr_Table%rowtype; 

    FUNCTION A_Data 
    RETURN A_TABLE; 

END My_Package; 
/

CREATE OR REPLACE PACKAGE BODY My_Package 
IS 
FUNCTION A_Data 
    RETURN A_TABLE 
IS 
    results A_TABLE; 
BEGIN 
    SELECT ID, NAME BULK COLLECT INTO results FROM Customr_Table; 
    RETURN results; 
END A_Data; 
END My_Package; 
/

そして、あなたはこのようにそれを使用することができます:

declare 
    v My_Package.A_Table; 
begin 
    v := My_Package.A_data(); 
    for i in 1 .. v.count loop 
    dbms_output.put_line(v(i).id || ' ' || v(i).Name); 
    end loop; 
end; 
/
+0

パッケージの外から関数を呼び出す場合は、型を外部に指定する必要があると思いますか? – Damien

+0

@Damien私の答えを更新しました。 – GurV

+0

乾杯、このケースでは以下の回答でしたが、私も知らなかった情報を提供しました。ありがとう。 – Damien

関連する問題