【问题标题】:Circular Dependency -Table Insertion Error循环依赖 - 表插入错误
【发布时间】:2019-02-21 04:46:54
【问题描述】:

我想向表中插入数据但出现以下错误..谁能帮帮我..

CREATE OR REPLACE TYPE TEST_TYP FORCE IS OBJECT 
    ("id" VARCHAR(5000 NULL) 
NOT FINAL;

CREATE OR REPLACE TYPE TEST_TAB is table of REF TEST_TYP; 

CREATE OR REPLACE TYPE TEST1_TYP FORCE IS OBJECT 
    ("id" VARCHAR2(500) NULL,
     "extension" "TEST_TAB" NULL )
NOT FINAL;


CREATE TABLE "TEST_OBJ_TABLE" OF "TEST1_TYP"
NESTED TABLE "extension" STORE AS "Allin"

当我尝试使用这个语句插入时L

insert into "TEST_OBJ_TABLE" ("id","extension")
VALUES(
'0FE71A85',
"TEST_TAB"("TEST_TYP"( '0FE71A8'))
);

它会抛出这个错误

命令行错误:59 列:12
错误报告 -
SQL 错误:ORA-00932:不一致的数据类型:预期 REF SUB_HWOW.TEST_TYP 得到了 SUB_HWOW.TEST_TYP
00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s”
*原因:
*行动:

【问题讨论】:

  • 为什么是循环依赖?该错误表明问题在于您插入的是对象而不是对象的引用。所以你需要决定第一个表是否真的应该是 refs,如果是的话,实际引用的对象将存在于哪里?
  • 谢谢亚历克斯..要将数据插入该表中我必须做什么..你能更正我的代码吗..

标签: sql oracle nested-table


【解决方案1】:
  1. 您必须修改对象TEST_TYP -> varchar2 has to be max 4000。 您必须将此对象存储在数据库中。
  2. 为 TEST_TYP 创建对象表 create table t_for_test_type of TEST_TYP;
  3. 要获取对象引用,对象必须保存在 db 表中。在你的情况下:

    声明
    v_ref_to_test_type1 参考 TEST_TYP;
    开始 插入 t_for_test_type t 值('abcd1') 将 ref(t) 返回到 v_ref_to_test_type1;
    结束:

  4. 将所有部分连接在一起。

    声明 v_ref_to_test_type1 参考 TEST_TYP;
    v_ref_to_test_type2 参考 TEST_TYP;
    开始 插入 t_for_test_type t values('abcd1') return ref(t) into v_ref_to_test_type1; 插入 t_for_test_type t values('abcd2') 将 ref(t) 返回到 v_ref_to_test_type2; 插入 TEST_OBJ_TABLE 值 (TEST1_TYP('abcd',new TEST_TAB(v_ref_to_test_type1,v_ref_to_test_type2))); 结束;

  5. 查询表。 select t."id",x.column_value from TEST_OBJ_TABLE t, table(t."extension") x 它返回 id + ref 给其他对象

  6. 查看引用的对象。 select t."id",deref(x.column_value) from TEST_OBJ_TABLE t, table(t."extension") x

注1。您应该避免使用双引号声明属性。 Db 变得区分大小写,这不是正常情况:)

注2。我不知道为什么代码格式化今天不起作用

问题。你为什么要尝试使用如此复杂的结构?

【讨论】:

    【解决方案2】:

    改变了原来的答案。引号对您没有任何帮助 - 也没有调用您的列名 id。删除了 REF 引用。

    CREATE OR REPLACE TYPE TEST_TYP FORCE IS OBJECT 
        (id1 VARCHAR(4000) NULL)
    NOT FINAL;
    
    CREATE OR REPLACE TYPE TEST_TAB is table of TEST_TYP; 
    
    CREATE OR REPLACE TYPE TEST1_TYP FORCE IS OBJECT 
        (id2 VARCHAR2(500) NULL,
         extension TEST_TAB NULL )
    NOT FINAL;
    
    
    CREATE TABLE TEST_OBJ_TABLE OF TEST1_TYP
    NESTED TABLE extension STORE AS Allin ;
    
    insert into TEST_OBJ_TABLE ( ID2, EXTENSION)
    VALUES(
    '0FE71A85',
    TEST_TAB(TEST_TYP( '0FE71A8'))
    );
    
    SELECT * FROM TEST_OBJ_TABLE ;
    

    【讨论】:

    • 谢谢布赖恩..在上一个问题中我忘记包含“TEST_TYP”声明。现在我修改了它。你现在能帮我吗。虽然我尝试将数据插入到我创建的表中,但它给出了类似“ “预期 REF SUB_HWOW.TEST_TYP 得到了 SUB_HWOW.TEST_TYP”,但我不知道如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2019-10-28
    • 1970-01-01
    • 2021-10-12
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多