Oracle Database 19c 触发器问题
Posted
技术标签:
【中文标题】Oracle Database 19c 触发器问题【英文标题】:Oracle Database 19c Trigger issue 【发布时间】:2022-01-20 14:40:54 【问题描述】:我正在使用 Oracle Database 19c 企业版 19 19.0.0.0.0。
我想创建一个触发器,始终将列中的第一个字母设置为大写。
create or replace TRIGGER TRIGGER_NAME
BEFORE INSERT OR UPDATE OF COLUMN_NAME ON TABLE_NAME
FOR EACH ROW
BEGIN
:NEW.COLUMN_NAME := upper(substr(:NEW.COLUMN_NAME,1,1))||substr(:NEW.COLUMN_NAME,2);
END;
触发器已创建,但我收到 ORA-00900: Invalid SQL statement error。
为什么以及解决方案是什么样的?
【问题讨论】:
当我创建一个存根table_name
时,这似乎对我有用。可以分享minimal reproducible example吗?
是的,您已经做对了,只需另一个 oracle 数据库中的一个简单表即可使用此代码。
您的触发器中没有 SQL 语句,所以问题可能出在您尝试运行的插入或更新语句中?
不,我从触发器中得到错误,而不是从任何插入或更新语句。这来自我可以 100% 信任的系统。没有触发器一切正常。
【参考方案1】:
要将字符串中的第一个字母大写,可以使用正则表达式
SELECT
regexp_replace ('string', '[a-z]', upper (substr ('string', 1, 1)), 1, 1, 'i')
FROM dual;
这假定第一个字母是您要转换的字母。如果您的输入文本以数字开头,例如 2 个字符串,则不会将其更改为 2 个字符串。
【讨论】:
@Fedor v. R. 为什么不提供 create table 和 trigger 语句以及 INSERT 和 update 语句,我们可以为您提供答案。编辑您的原始问题以包含此信息。已经提供了几种解决方案,但您尚未确认任何解决方案【参考方案2】:使用 INITCAP 可以实现:
create or replace TRIGGER TRIGGER_NAME
BEFORE INSERT OR UPDATE OF COLUMN_NAME ON TABLE_NAME
FOR EACH ROW
BEGIN
:NEW.COLUMN_NAME := INITCAP(:NEW.COLUMN_NAME);
END;
【讨论】:
以上是关于Oracle Database 19c 触发器问题的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)
Oracle 19c - 手动升级到 Non-CDB Oracle Database 19c 的完整核对清单 (Doc ID 2577572.1)