Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

SQL macro and function p u r i t y level

Function called in SQL statement can't modify table data (WNDS - wriite no database state):

SQL> drop table tbl purge
  2  /

Table dropped.

SQL> create table tbl(
  2                   str varchar2(50)
  3                  )
  4  /

Table created.

SQL> create or replace
  2    function f1(
  3                p_str varchar2
  4               )
  5      return sys.OdciVarchar2List
  6      is
  7      begin
  8          insert
  9            into tbl
 10            values(
 11                   'Insert within select is not allowed.'
 12                  );
 13          return sys.OdciVarchar2List(p_str);
 14  end;
 15  /

Function created.

SQL> select  *
  2    from  f1('ABC')
  3  /
  from  f1('ABC')
        *
ERROR at line 2:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "SCOTT.F1", line 7


SQL>

However, no error is raised for SQL macro:

SQL> create or replace
  2    function f1(
  3                p_str varchar2
  4               )
  5      return clob
  6      sql_macro
  7      is
  8      begin
  9          insert
 10            into tbl
 11            values(
 12                   'Insert within select is not allowed.'
 13                  );
 14          return 'select * from sys.OdciVarchar2List(p_str)';
 15  end;
 16  /

Function created.

SQL> select  *
  2    from  f1('ABC')
  3  /

COLUMN_VALUE
---------------
ABC

SQL> select  *
  2    from  f1('XYZ')
  3  /

COLUMN_VALUE
---------------
XYZ

SQL> select  *
  2    from  tbl
  3  /

STR
--------------------------------------------------
Insert within select is not allowed.
Insert within select is not allowed.

SQL>

SY.

Comments
Post Details
Added on Sep 4 2024
6 comments
157 views