首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle:在PLSQL中获取引用

Oracle:在PLSQL中获取引用
EN

Stack Overflow用户
提问于 2013-06-14 02:56:57
回答 2查看 710关注 0票数 6

我需要获取:new.OBJECT_VALUE的引用,但我现在不知道如何获取。

我试过这么做。

类型声明:

代码语言:javascript
复制
CREATE TYPE Virus_ObjType AS OBJECT (
    name        VARCHAR2(50),
    description VARCHAR2(700)
);
/

CREATE TYPE Paper_ObjType AS OBJECT (
    id         NUMBER,
    title      VARCHAR(100),
    magazine   VARCHAR2(100),
    vol        NUMBER,
    num        NUMBER,
    year       NUMBER(4)
);
/

CREATE TYPE Virus_NestTabType AS TABLE OF REF Virus_ObjType;
/
CREATE TYPE Paper_NestTabType AS TABLE OF REF Paper_ObjType;
/

ALTER TYPE Virus_ObjType ADD ATTRIBUTE papers Paper_NestTabType CASCADE;
/
ALTER TYPE Paper_ObjType ADD ATTRIBUTE virus Virus_NestTabType CASCADE;
/

表的声明:

代码语言:javascript
复制
CREATE TABLE Virus_ObjTable OF Virus_ObjType (
    PRIMARY KEY(name))
NESTED TABLE papers STORE AS papersVirus_NestTable;

CREATE TABLE Paper_ObjTable OF Paper_ObjType (
    PRIMARY KEY (id))
NESTED TABLE virus STORE AS virus_NestTable;

CREATE GLOBAL TEMPORARY TABLE virus_aux (
    type varchar2(1),
    virus REF Virus_ObjType,
    paper REF Paper_ObjType)
ON COMMIT DELETE ROWS;
/

触发器的声明:

代码语言:javascript
复制
create or replace 
trigger Virus_Trigger_Before BEFORE INSERT ON Virus_ObjTable 
FOR EACH ROW 
DECLARE
    paper REF Paper_ObjType;
    virus REF Virus_ObjType;
BEGIN
    IF inserting THEN
        IF :new.papers IS NOT NULL THEN
            FOR i IN 1..:new.papers.COUNT LOOP
                -- getting the pointer of the papers
                SELECT refe INTO paper
                    FROM (SELECT REF(a) as refe FROM Paper_ObjTable a)
                    WHERE refe=:new.papers(i);

                SELECT REF(:NEW.OBJECT_ID) INTO virus FROM dual;
                INSERT INTO virus_aux VALUES ('i', virus, paper);
            END LOOP;
        END IF;
    END IF;
END;

如果有人想尝试使用数据:

代码语言:javascript
复制
INSERT INTO paper_objtable (id, title, magazine, vol, num, year) VALUES (1, 'Que mala es la Gripe', 'Fuzzy Sets', 1, 1, 1993);
INSERT INTO paper_objtable (id, title, magazine, vol, num, year) VALUES (3, 'La Gripe ataca de nuevo', 'Information Sciences', 1, 1, 1996);
INSERT INTO virus_objtable
    (SELECT 'Gripe', 'Virus de la Gripe', CAST(COLLECT(REF(a)) AS Paper_NestTabType)
     FROM paper_objtable a);

但是我得到了下一个错误:

代码语言:javascript
复制
ORA-01747: invalid user.table.column, table.column, or columns specification

有谁可以帮我?

EN

回答 2

Stack Overflow用户

发布于 2013-06-19 07:47:28

试试MAKE_REF

代码语言:javascript
复制
SELECT MAKE_REF(virus_objtable, :new.object_id) INTO virus FROM dual;
票数 1
EN

Stack Overflow用户

发布于 2014-04-16 10:57:22

解决此Oracle错误的选项包括:

选项#1

尝试重新定义您的表,使您的列名都不是保留字。

选项#2

尝试用双引号将保留字引起来。

例如,如果您有一个包含名为number的列的供应商表,并且您尝试按如下方式更新此字段:

代码语言:javascript
复制
UPDATE suppliers SET number = 10000;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17094891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档