2014-10-02 2 views
0

이 코드가 있습니다.
SELECT의 열 개체가있는 INSERT SELECT

CREATE TABLE USERS(
    USERNAME NVARCHAR2(30), 
    USER_TYPE VARCHAR2(13) 
); 
/

CREATE OR REPLACE TYPE OBJ_USER_TYPE IS OBJECT(
    USER_TYPE VARCHAR2(13), 
    USER_LEVEL NUMBER(38, 0) 
); 
/

CREATE OR REPLACE TYPE OBJ_USER IS OBJECT(
    USERNAME NVARCHAR2(30), 
    USER_TYPE OBJ_USER_TYPE 
); 
/

CREATE OR REPLACE TYPE NST_USERS IS TABLE OF OBJ_USER; 
/

DECLARE 
    objUser OBJ_USER NOT NULL DEFAULT OBJ_USER('MARION', OBJ_USER_TYPE('USER', 3)); 
    tblUSERS NST_USERS NOT NULL DEFAULT NST_USERS(objUser); 
BEGIN 
    INSERT INTO USERS(USERNAME, USER_TYPE) 
    SELECT USERNAME, USER_TYPE.USER_TYPE 
    FROM TABLE(tblUSERS); 
END; 
/

은 그냥 here 같은 "잘못된 식별자"의 오류가 발생합니다. 내가 사용하는 경우
는하지만 :

INSERT INTO USERS(USERNAME, USER_TYPE) 
SELECT USERNAME, TREAT(USER_TYPE AS OBJ_USER_TYPE).USER_TYPE 
FROM TABLE(tblUSERS); 

그것은 오류 "너무 많은 값"을 제기했다.
이 코드의 잘못된 점은 무엇입니까?

+0

당신은 또한'NST_USERS'을 입력 우리에게'USERS' 테이블의 설명을 보여줄 수 있습니까? –

+0

@MaheswaranRavisankar 내 편집장에서 내 USERS 정보를 보여 줬습니다. –

+0

관련 없음 : 그러나 : PL/SQL 블록이 아닌 경우에는';'**와 ** the /'가 필요하지 않습니다 : http://stackoverflow.com/a/10207695/330315'create ... type .. ./ /'실제로 그 문장을 두 번 실행합니다 * –

답변

0
DECLARE 
    objUser OBJ_USER ; 
    tblUSERS NST_USERS; 
BEGIN 
    objUser := OBJ_USER('MARION', OBJ_USER_TYPE('USER', 3)); 
    tblUSERS := NST_USERS(objUser); 

    INSERT INTO USERS(USERNAME, USER_TYPE) 
    SELECT USERNAME, TREAT(USER_TYPE AS OBJ_USER_TYPE).USER_TYPE 
    FROM 
    TABLE(tblUSERS); 

END; 
/

Fiddle Demo

+0

죄송 합니다만 오타 일뿐입니다. USER_TYPE에서 OBJ_USER_TYPE (으)로 이미 편집했습니다. 여전히 오류가 있습니다. –

+0

@marionjeff 내 편집을 확인할 수 있습니까? .. 귀하의 [업데이트 된 질문은 예상대로 작동합니다] (http://sqlfiddle.com/#!4/2491b/8)! 어떤 버전의 데이터베이스를 사용하고 있습니까? –