【发布时间】:2010-04-10 15:38:38
【问题描述】:
我需要通过 pl/sql 存储过程将数据插入到特定的表中。我的要求是:
- 在插入时应为特定列生成 PRIMARY KEY 值;
- 它应该将该 PRIMARY KEY 值返回给输出变量;和
- 对于另一列,它应该验证我的字符串,使其只包含字符,而不是整数。
【问题讨论】:
我需要通过 pl/sql 存储过程将数据插入到特定的表中。我的要求是:
【问题讨论】:
您可以使用 Oracle SEQUENCE 生成主键值作为代理键。您可以在使用TRANSLATE 的列上创建一个约束来检查新插入/更新的数据中是否不存在数字。
一些示例代码,适用于 SQL*Plus:
CREATE SEQUENCE mysequence;
/
CREATE TABLE mytable (
pkidcol NUMBER PRIMARY KEY,
stringcol VARCHAR2(100)
);
/
ALTER TABLE mytable ADD (
CONSTRAINT stringnonnumeric
CHECK (stringcol = TRANSLATE(stringcol,'A0123456789','A'))
);
/
DECLARE
mystring mytable.stringcol%TYPE := 'Hello World';
myid mytable.pkidcol%TYPE;
BEGIN
INSERT INTO mytable (pkidcol, stringcol)
VALUES (mysequence.NEXTVAL, mystring)
RETURNING pkidcol INTO myid;
END;
/
【讨论】:
TRANSLATE 的唯一目的是实现检查约束。它不翻译任何东西 - 它只是说“如果这里有任何数字,则不允许插入/更新”。如果他希望插入/更新成功,他将不得不在应用程序代码中实现TRANSLATE,或者添加一个触发器来修改它(但我不建议这样做)。
在 oracle 中,我认为“身份”列最好通过一个序列和一个插入触发器来实现,该触发器检查主键列是否为空,如果是,则获取下一个序列并插入它。
然后可以使用“returning”子句获取新创建的主键:
insert into <table> (<columns>) values (<values>) returning <prim_key> into <variable>;
在进入数据库之前,我会在代码中亲自处理字符串字段的过滤(如果可能的话)。众所周知,数据库在处理字符串操作方面效率低下。
【讨论】: