2017-02-27 29 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

编辑

据我了解,你需要从存储功能

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

只是以上答案的变种。 Usin 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;