sql – 解决方案“无法在查询中执行DML操作”?

我正在使用一个数据分析工具,并且我所要求的是接受用户的值,将其作为参数传递,并将其存储在表中。相当直截了当,所以我坐着写这个

create or replace
procedure complex(datainput in VARCHAR2)
is
begin
insert into dumtab values (datainput);
end complex;

我在SQL Developer中使用以下语句执行此操作

begin
complex('SomeValue');  
end;

它工作正常,值被插入表中。但是,在数据分析工具中不支持上述语句,所以我使用了一个函数。以下是函数的代码,它编译。

create or replace
function supercomplex(datainput in VARCHAR2)
return varchar2
is
begin
insert into dumtab values (datainput);
return 'done';
end supercomplex;   

我再次尝试在SQL Developer中执行它,但执行以下代码后,我无法在查询中执行DML操作

select supercomplex('somevalue') from dual;

我的问题是
– 我需要一个可以在SQL Developer中运行上述函数的语句
– 可以执行我正在寻找哪个可以由select语句执行的函数。
– 如果不可能做我所要求的,我想要一个理由,所以我可以通知我的经理,因为我是新的(像一个星期的旧版)到PL / SQL,所以我不知道规则和语法。

附:我希望这是C甚至Java 🙁

编辑

我需要在SQL Developer上运行这个功能,因为在运行DMIC(这是工具)之前,为了测试它是否有效。在SQL中无效的任何内容在DMine中也是无效的,而不是其他方式。

感谢您的帮助,我了解情况,以及为什么这是非法/不推荐的

您可以使用指令pragma autonomous_transaction。这将运行该功能到一个独立的事务,将能够执行DML而不提高ORA-14551。

请注意,自autonomous transaction独立以来,DML的结果将不在父项交易范围之内。在大多数情况下,这不会是一个可接受的解决方法。

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
  2     RETURN VARCHAR2 IS
  3     PRAGMA AUTONOMOUS_TRANSACTION;
  4  BEGIN
  5     INSERT INTO dumtab VALUES (datainput);
  6     COMMIT;
  7     RETURN 'done';
  8  END supercomplex;
  9  /

Function created

SQL> SELECT supercomplex('somevalue') FROM dual;

SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done

SQL> select * from dumtab;

A
--------------------------------------------------------------------------------
somevalue

汤姆·凯特has a nice explanation关于为什么首先提出错误。它不安全,因为它可能取决于行被处理的顺序。此外,Oracle不保证每行至少执行一次该函数一次。

http://stackoverflow.com/questions/8729236/solution-to-cannot-perform-a-dml-operation-inside-a-query

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:sql – 解决方案“无法在查询中执行DML操作”?