2014-10-02 4 views
0

У меня есть этот код.
INSERT SELECT с объектом столбца 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

Можете ли вы показать нам описание 'USERS' таблицы также типа' NST_USERS'? –

+0

@MaheswaranRavisankar Я показал свою информацию ПОЛЬЗОВАТЕЛЕЙ в своем редактировании. –

+0

Несвязанный, но: вам не нужны ';' ** и ** '/' для блоков без PL/SQL: 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)! Какую версию базы данных вы используете? –