2017-02-27 3 views
0

私のデータベースのユーザーに関する情報を取得したいと思います。SQL * Plusのselect文から返されるテーブルを出力するストアド・プロシージャを取得するにはどうすればよいですか?

これは私が持っているものです。

表:

create table Users(
userID int CHECK (userID > 0), 
email varchar2(30) NOT NULL, 
age varchar2(30) NOT NULL, 
numberBookedSoFar int, 
primary key(userID) 
); 

手順:

CREATE or REPLACE PROCEDURE user_info() AS 
BEGIN 
SELECT age, COUNT(userid) AS numberofusers, 
AVG(numberbookedsofar) AS avgbooked 
FROM users 
GROUP BY age; 
END; 

しかし、何も起こりません。

+1

これでコンパイルエラーが発生します。どのOracleのバージョンを使用していますか? (なぜサブクエリを使用しているのですか) –

+0

あなたは何を持っていますか、達成するために必要なものをもっと明確にしてください –

+0

プロシージャはクエリを実行しますが、それ以上何もしないように求めました。 – BobC

答えて

1

EDIT

私は理解して、あなたは私がパッケージで定義されたタイプを使用するように格納されている機能

CREATE TYPE users_obj IS OBJECT (age varchar2(30), numberofusers int, avgbooked numeric); 

CREATE TYPE users_t IS TABLE OF users_obj; 

CREATE or REPLACE FUNCTION user_info RETURN users_t 
IS 
     users_table users_t := users_t(); 
     n INT := 0; 
BEGIN 
     FOR i IN (SELECT age, COUNT(userid) AS numberofusers, AVG(numberbookedsofar) AS avgbooked FROM users GROUP BY age) -- < here is your query 
     LOOP 
      users_table.EXTEND; 
      n := n + 1; 
      users_table(n) := users_obj(i.age, i.numberofusers, i.avgbooked); 
     END LOOP; 
    RETURN users_table; 
END; 


-- So, now you can call function which returns result as table 
SELECT * FROM TABLE (user_info); 
+0

はい、あります。私はそれ自身でクエリを実行しましたが、これを実行しようとすると何も起こりません。 –

+0

これは本当に私の質問に答えていないことを意味します... –

+0

@ Ana-GabrielPerez - 編集された答え –

0

からテーブルを返す必要があります。これにより、厳密な名前空間でタイプをグループ化することができます。私はこれを他の答えよりも、単に違う答えと呼ぶつもりはありません。ここに例があります:

CREATE OR REPLACE PACKAGE deleteme_pkg 
AS 
    TYPE example_t IS RECORD 
    (
     text   VARCHAR2 (10) 
     , textlength INTEGER 
    ); 

    TYPE example_tt IS TABLE OF example_t; 

    FUNCTION sample 
     RETURN example_tt 
     PIPELINED; 
END deleteme_pkg; 

CREATE OR REPLACE PACKAGE BODY deleteme_pkg 
AS 
    -- Very contrived, in practice, the rows will be from a select statement 
    FUNCTION sample 
     RETURN example_tt 
     PIPELINED 
    AS 
     l_rec example_t; 
    BEGIN 
     l_rec.text   := 'This'; 
     l_rec.textlength := LENGTH (l_rec.text); 
     PIPE ROW (l_rec); 
     l_rec.text   := 'is'; 
     l_rec.textlength := LENGTH (l_rec.text); 
     PIPE ROW (l_rec); 
     l_rec.text   := 'a'; 
     l_rec.textlength := LENGTH (l_rec.text); 
     PIPE ROW (l_rec); 
     l_rec.text   := 'test'; 
     l_rec.textlength := LENGTH (l_rec.text); 
     PIPE ROW (l_rec); 
    END sample; 
END deleteme_pkg; 

-- now select from the package function 
select * from table(deleteme_pkg.sample); 
0

上記の回答の変形です。 BULK COLLECTを使用してください。お役に立てれば。

CREATE OR REPLACE type CUSTOM_OBJ 
IS 
    object 
    (
    AGE  NUMBER, 
    USER_ID NUMBER, 
    AVG_BOOKED NUMBER 
); 

CREATE OR REPLACE TYPE custom_tab 
IS 
    TABLE OF CUSTOM_OBJ; 


CREATE OR REPLACE 
    FUNCTION USER_INFO 
    RETURN CUSTOM_TAB 
    AS 
    tab custom_tab; 
    BEGIN 
    SELECT custom_obj(age,numberofusers,AVGBOOKED) BULK COLLECT 
    INTO tab 
    FROM 
     (SELECT age, 
     COUNT(userid)   AS numberofusers, 
     AVG(NUMBERBOOKEDSOFAR) AS AVGBOOKED 
     FROM users 
    ); 
    RETURN TAB; 
    END; 
関連する問題