【问题标题】:INSERT SELECT with SELECT's column object使用 SELECT 的列对象插入 SELECT
【发布时间】:2014-10-02 14:14:04
【问题描述】:

我有这个代码。

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);

它引发了“值过多”错误。
这段代码有什么问题?

【问题讨论】:

  • 你能告诉我们USERS表的描述还输入NST_USERS吗?
  • @MaheswaranRavisankar 我在编辑中显示了我的用户信息。
  • 不相关但:你不需要; 非PL/SQL块的/stackoverflow.com/a/10207695/330315create ... type ...;/将实际运行该语句两次
  • @a_horse_with_no_name 但创建类型需要它。与其他 DDL 不同。
  • @MaheswaranRavisankar:你是对的。我想写create table :)

标签: oracle plsql


【解决方案1】:
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

【讨论】:

  • 对不起,这只是一个错字。我已经将它从 USER_TYPE 编辑为 OBJ_USER_TYPE。还是有错误。
  • @marionjeff 你能检查我的编辑吗? ..我看到你的updated Question behaves as you expected too!您使用的是什么版本的数据库?
猜你喜欢
  • 2018-01-21
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
相关资源
最近更新 更多