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

이렇게하면 컴파일 오류가 발생합니다. 어떤 오라클 버전을 사용하고 있습니까? (그리고 하위 쿼리를 사용하는 이유는 무엇입니까?) –

+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 대량 수집. 희망이 도움이됩니다.

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;