如何为PLSQL中的函数调用过程内部的更新表?

Posted

技术标签:

【中文标题】如何为PLSQL中的函数调用过程内部的更新表?【英文标题】:How to call an update table that is inside in the procedure for a function in PLSQL? 【发布时间】:2019-05-21 14:14:29 【问题描述】:

这是我的情况:

我有一个像这样更新表的过程:

PROCEDURE UPDATE_MODEL AS
STR VARCHAR2(10000);

BEGIN

STR:='UPDATE SAE_MODEL_TABLE.....'
EXECUTE IMMEDIATE STR;

我需要做一个函数来调用这个UPDATE SAE_MODEL_TABLE...

我用这段代码试过

FUNCTION GET_MODEL_TABLE  RETURN CLOB AS
STR4 VARCHAR2(50);
count_table number;

BEGIN

str4:='select count(1) from SAE_MODEL_TABLE;
execute immediate str4 into count_table;

IF count_table <> 0 then
UPDATE_MODEL ;

我有这个错误:

ORA-14551: 无法在查询中执行 DML 操作,

我知道那是指添加更新...

【问题讨论】:

为什么要用动态sql来统计行数或者更新?一般来说,函数的最佳实践是不使用 DML 集合(插入、更新、删除)。 【参考方案1】:

我不知道你为什么使用动态SQL,但如果你真的想这样做,它可能看起来像这样

PROCEDURE UPDATE_MODEL AS
  STR VARCHAR2(10000);
BEGIN

  STR:='UPDATE SAE_MODEL_TABLE.....'
  EXECUTE IMMEDIATE STR;
end;


FUNCTION GET_MODEL_TABLE  RETURN CLOB AS
  STR4 VARCHAR2(50);
  count_table number;
  my_clob clob;
BEGIN

  str4:='select count(1) from SAE_MODEL_TABLE';
  execute immediate str4 into count_table;

  IF count_table <> 0 then
    UPDATE_MODEL() ;
  end if;

  return my_clob;
end;

【讨论】:

以上是关于如何为PLSQL中的函数调用过程内部的更新表?的主要内容,如果未能解决你的问题,请参考以下文章

接受 id 并返回表的函数 - 如何为多个 id 调用它?

如何为 PL SQL 中的现有表创建唯一 ID?

如何为R中字符串中的每个位置调用函数?

如何为单例函数创建别名?

如何为调用 API 的方法编写 JUnit 测试?

如何使用动态用户输入在 plsql 中使用函数/过程创建表