【问题标题】:PL/SQL: setting a column value by its name in a triggerPL/SQL:在触发器中按名称设置列值
【发布时间】:2023-12-11 09:21:01
【问题描述】:

我在我的 Oracle 基础上创建了一个触发器。

TRIGGER Customer_trigger
BEFORE INSERT ON Customer
FOR EACH ROW

它通过 http 请求连接到某个服务。该服务在响应中提供列及其值。我的问题是如何按名称设置列值。我想做这样的事情。

column_name := from http response
column_value := from http response
:new.<column_name> := column_value

我尝试使用立即执行,但没有成功。

感谢您的帮助。

【问题讨论】:

  • 您不能在 AFTER INSERT 触发器中更改列的值 - 但是,您可以在 BEFORE INSERT 触发器中使用 :NEW.&lt;column_name&gt; := 语法。
  • 我的错!它在触发器之前。
  • 当您说“我尝试使用立即执行但没有运气”时发生了什么 - 还是没有发生?请向我们展示您的代码和其他相关详细信息,包括错误消息。
  • 对不起,我没有提供足够的信息,但我已经尝试了很多方法......通常我在将“新”变量绑定到匿名块时遇到了麻烦。
  • 也许你可以尝试这样的事情:EXECUTE IMMEDIATE 'SELECT ' || nColumn_value || ' INTO :NEW.' || strColumn_name || ' FROM DUAL'。不过,老实说,我认为从触发器执行 HTTP 请求只是在寻找问题。仅仅因为你可以做某事并不意味着你应该。我认为应该在执行 INSERT 之前完成 HTTP 请求是合理的。 YMMV。

标签: oracle triggers plsql httprequest httpresponse


【解决方案1】:

您不能在触发器中动态设置列名,但您可以执行以下操作:

case http_response.column_name
  when 'c1' then :new.c1 := http_response.column_value;
  when 'c2' then :new.c2 := http_response.column_value;
  when 'c3' then :new.c3 := http_response.column_value;
  ...
end case;

【讨论】:

  • 我赞成这个,因为它是一个可行的解决方案。不过,我确实同意@BobJarvis 的观点,即提议的场景是一个非常糟糕的实现。