0

把我的头撞在这个上一会儿。我正在 oracle 11g 上构建一个数据库,并尝试在“数据产品”表上创建记录时将记录插入到“注册表”表中。注册表需要自增product_id,然后product_id作为数据产品表的外键。这是我的触发代码:

CREATE OR REPLACE TRIGGER "TR_CAMERA_DP_DPR_CREATE"
BEFORE INSERT ON "DD1"."CAMERA_DP"
FOR EACH ROW
BEGIN
  :new.product_id := ID_SEQ.NEXTVAL;

  insert into dd1.dp_registry
         (    product_id,
              fs_location,
              parent_group_id,
              product_name,
              shortdes,
              createdate,
              revision )
         values
         (    :new.product_id,
              'placeholder',
              0,
              '_image',
              'description placeholder',
              sysdate,
              0
          );

END;

因此,理想情况下,在不提供 product_id 的情况下插入 dd1.camera_dp 将首先将记录插入 dd1.dp_registry,然后使用递增的 product_id 作为 dd1.camera_dp 的键字段。

插入语句在使用 :new.product_id 的硬编码值运行时有效,并且 ID_SEQ.NEXTVAL 也正常工作。我觉得我错过了一些明显的东西。

谢谢!

4

1 回答 1

1

你的代码非常适合我。如果您遇到错误,则说明您从发布的代码中实际运行的代码存在一些问题。

SQL> create table CAMERA_DP(
  2    product_id number,
  3    name varchar2(10)
  4  );

Table created.

SQL> create sequence id_seq;

Sequence created.

SQL> ed
Wrote file afiedt.buf

  1  create table dp_registry
  2           (    product_id number,
  3                fs_location varchar2(100),
  4                parent_group_id number,
  5                product_name varchar2(100),
  6                shortdes varchar2(100),
  7                createdate date,
  8*               revision number)
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER "TR_CAMERA_DP_DPR_CREATE"
  2  BEFORE INSERT ON "CAMERA_DP"
  3  FOR EACH ROW
  4  BEGIN
  5    :new.product_id := ID_SEQ.NEXTVAL;
  6    insert into dp_registry
  7           (    product_id,
  8                fs_location,
  9                parent_group_id,
 10                product_name,
 11                shortdes,
 12                createdate,
 13                revision )
 14           values
 15           (    :new.product_id,
 16                'placeholder',
 17                0,
 18                '_image',
 19                'description placeholder',
 20                sysdate,
 21                0
 22            );
 23* END;
 24  /

Trigger created.

SQL> insert into camera_dp( name ) values( 'Foo' );

1 row created.

SQL> ed
Wrote file afiedt.buf

  1* select product_id from dp_registry
SQL> /

PRODUCT_ID
----------
         1

如果您收到表不存在的错误,常见的罪魁祸首是

  • 您的表名实际上有错字
  • 您没有插入表格的权限。请注意,如果在您的实际代码中,并非所有内容都在同一个模式中,我的猜测是拥有触发器的用户有权通过角色而不是直接授予INSERT进入表。DP_REGISTRY由于通过角色授予的特权在定义者的权限存储过程块中不可用,这可以解释为什么您可以在命令行而不是在 PL/SQL 中执行某些操作。
于 2013-05-21T21:57:24.850 回答