在 Oracle PL/SQL 的触发器中扩展变量(IF :new.variable_name IS NULL THEN

Posted

技术标签:

【中文标题】在 Oracle PL/SQL 的触发器中扩展变量(IF :new.variable_name IS NULL THEN【英文标题】:Expanding variables in a trigger in Oracle PL/SQL (IF :new.variable_name IS NULL THEN 【发布时间】:2017-09-18 20:06:30 【问题描述】:

在定义触发器时,我想在 Oracle (PL/SQL) 中执行以下操作:

宣布 pk_column_name VARCHAR(50) := 'id'; 开始 EXECUTE IMMEDIATE '创建或替换触发器 table_a_trigger 在插入 table_a 之前 每一行 开始 IF :new.pk_column_name IS NULL THEN /* 这里 */ 选择 table_a_sequence.nextval INTO :new.pk_column_name /* 和这里 */ 从双; 万一; 结尾;'; 结尾;

我希望变量 pk_column_name(包含字符串 'id')被“扩展”,所以我可以像上面的例子一样写它:

IF :new.pk_column_name ....

而不是...

如果 :new.id ....

我尝试了很多方法,例如:

:new."pk_column_name" :new.&pk_column_name :new.:pk_column_name

有人可以帮帮我吗?

谢谢,最好的问候,

乌多

【问题讨论】:

为什么?您必须在创建触发器时知道实际的列名才能设置变量,那么为什么不到处使用实际名称呢?无论如何,你不能使用这样的变量...... 不,我不知道实际的列名,因为此 SQL 是软件中代码的一部分,以前不知道列名。 如果在编译时不知道表的结构,就不能在表上创建触发器。 (除非你不参考它的任何专栏,我想)。 为什么要select from dual? PL/SQL 有这个方便的:= 赋值运算符。同样在 12.1 中,您可以将其设置为列默认值。 【参考方案1】:

我明白了!

...如果:新。 || pk_column_name || ' 为 NULL 那么...

...进入:新的。 || pk_column_name || ' 从双;

【讨论】:

对,所以您确实在编译时知道列名。您没有说您正在动态创建它(这是一件不寻常的事情)。 其实不是。不是在编译时。该软件用于动态重命名表并在运行时重新创建触发器。 在编译(动态)触发器时,您确实知道 PK 列名称,否则您无法像那样连接它. 什么都不感谢。对不起,但我认为我的例子很容易理解。我想知道如何扩展变量并在触发器中使用它。你说不可能,但我自己找到了解决办法。 好吧,我是想帮忙,但下次我可以不打扰了。您的问题在哪里说您正在动态创建它?您将变量显示为触发器的本地变量,它不可能,也不在您的解决方案中。我只能根据您在问题中所说的话发表评论并尝试提供帮助。

以上是关于在 Oracle PL/SQL 的触发器中扩展变量(IF :new.variable_name IS NULL THEN的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?

Oracle PL/SQL 的一个很好的参考

Oracle实战笔记(第六天)之PL/SQL基础

PL/SQL编程_概述

Oracle 12 PL/SQL 在触发器中检索存储过程名称

Oracle的基本语法,存储函数及触发器