我正在使用数据分析工具,我的要求是接受用户的值,将其作为参数传递并将其存储在表中。

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 ,但我得到了cannot perform a DML operation inside a query执行以下代码后

select supercomplex('somevalue') from dual;

我的问题是 - 我需要一个可以运行上述函数的语句SQL Developer或者 - 可以执行我正在寻找的功能的函数,可以通过 select 语句执行。

附:

EDIT

我需要在 SQL Developer 上运行该函数,因为在 DMine(该工具)中运行它之前,为了测试它是否有效。

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

答案

你可以使用该指令pragma 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

汤姆·凯特有一个很好的解释关于为什么首先会引发错误。

来自: stackoverflow.com