2012-02-24 3 views
2

나는 TABLE1라는 정규 표가 있으며 NUMBER(8) 열과 varchar2(100) 열이 있습니다.Oracle PL/SQL에서이를 수행 할 수 있습니까?

이제 NUMBERvarchar2의 두 속성을 사용하여 OBJECT TYPET_MYTYPE을 생성했습니다.

간단히 말해서, 정확히 동일합니다.

이제 다음을 수행하고 싶습니다.

v_obj T_MYTYPE; 

begin 
select * into v_obj from TABLE1 t1 where t1.num = 9;--guaranteed to return only ONE row!! 
end; 

하지만 PL/SQL : ORA-00947 :

... 난 단지에 데이터의 ONE 행을 반환 할 수 있도록 매우 실망 싶어한다이 충분하지 않은 값 .. 수집!! 그것은 기록 또는 개체 유형 !!, 나는 상관 없어 ... 난 그냥이 일을 할 수 없어 .. !!!! 누구든지 도울 수 있습니까 ??

답변

6

하실 수 있습니다. 당신은 그냥

SELECT t_mytype(column1, column2) 
    INTO v_obj 
    FROM table1 t1 
WHERE t1.num = 9; 

것, 객체 생성자

귀하의 경우에는
SQL> create type t_simple_emp 
    2  as object 
    3 (
    4 empno number, 
    5 ename varchar2(100) 
    6 ); 
    7/

Type created. 

SQL> declare 
    2 l_simple_emp t_simple_emp; 
    3 begin 
    4 select t_simple_emp(empno, ename) 
    5  into l_simple_emp 
    6  from emp 
    7  where ename = 'KING'; 
    8 end; 
    9/

PL/SQL procedure successfully completed. 

를 사용해야하는 경우가 있지만, 기록 형으로 테이블에서 전체 행을 선택하기 만 원하는 모든, ruakh이 제안 당신은하고 싶은 것 단지 %ROWTYPE 기록이 대신

declare 
    l_emp_rec emp%rowtype; 
begin 
    select * 
    into l_emp_rec 
    from emp 
    where ename = 'KING'; 
end; 
/
+0

방금 ​​PLSQL에 대한 책 전체를 읽었는데, 나는 이것을 보지 못했을 것입니다. 아마도 나는 그것을 놓쳤습니다. 너무 일찍 돌아올 때만 월요일에 그것을 시험 할 수있을 것입니다. –

+0

생각해 보니 .. 이것은 반 직관적입니다. –

+0

@FelipeAlmeida - 열의 하위 집합을 선택하거나 개체 유형이 필요한 작업을 수행하는 대신 레코드의 모든 열을 레코드로 선택하려는 경우 ruakh의 제안은 '% ROWTYPE'컬렉션을 선호하는 것이 좋습니다. –

3

선언

v_obj T_MYTYPE; 

이 시도 :

v_obj table1%ROWTYPE; 

table1의 행과 동일한 유형을 가진 것으로 선언 할 수 있습니다.

+0

그런데'table'과'cast' 피연산자를 사용해야합니까? 나는'CREATE TYPE foo ....'를 통해 타입을 생성 할 때만'cast'를 사용할 수 있다고 읽었 기 때문에 레코드를 사용하지 않았다. OBJECT TYPE을 사용하기 전에 RECORD를 사용하려했지만'SELECT INTO'를 사용할 수 없었다. 방금 설명한 문제 때문에. –

+0

@FelipeAlmeida :이 방법에는 확실히 장점과 단점이 있습니다. 장점 중 하나는 가장 간단한 방법이라는 것입니다. 또 하나는 테이블의 행을 매우 충실하게 표현한다는 것입니다. 당신은 다음과 같이 썼다 : "나는 단지 하나의 데이터 행을 콜렉션에 반환 할 수 있기를 원한다 !! 그것은 RECORD 또는 OBJECT TYPE이 될 것이다 !!"라고 생각했기 때문에 이러한 장점이 귀하에게 불리한 점보다 중요하다고 생각했습니다. 그렇지 않다면 반드시이 방법을 사용할 필요가 없습니다. : – ruakh

+0

나는 귀하의 접근 방식을 시도한 것 같습니다. 기억하고 있지만 다른 문제를 발견했다고 생각합니다. 월요일에 먼저 확인한 다음 다시 돌아와서 무슨 일이 일어 났는지 말씀 드리겠습니다. –

관련 문제