事务中的Oracle函数

时间:2012-09-20 17:00:25

标签: oracle

我在事务中插入记录,然后我通过Oracle函数检索相同的记录。 oracle函数没有返回任何记录。我的DBA告诉我,Oracle函数不在事务中运行。我该如何解决这个问题?

实施例: 使用oracle提供程序开始事务

执行一些SQL:

INSERT OWNER (FIRST_NAME,LAST_NAME) VALUES ('JOHN','SMITH')

从函数中获取事务中的记录(71是示例ID): select * from table(GET_OWNER_DETAILS_FNC(71))

这是Oracle功能:

CREATE OR REPLACE FUNCTION "AROH"."GET_OWNER_DETAILS_FNC" (p_owner_information_oid  in aroh_owner_information.owner_information_oid%type ) 
return OWNER_DETAILS_TABLE_TYPE_FNC

IS 
PRAGMA AUTONOMOUS_TRANSACTION; 

v_owner_details_set   OWNER_DETAILS_TABLE_TYPE_FNC := OWNER_DETAILS_TABLE_TYPE_FNC();

CURSOR c_owner_dtls IS
select oi.owner_information_oid, 
oi.first_name, 
oi.last_name, 
oi.company_name, 
oi.license_information, 
oi.company_ind, 
oi.middle_initial, 
oi.title_type_oid, 
oi.suffix, 
oi.status_type_code, 
oi.primary_phone, 
oi.secondary_phone, 
oi.secondary_phone_type_code, 
oi.primary_phone_type_code, 
oi.email_address, 
oi.comments, 
oi.primary_phone_extension, 
oi.secondary_phone_extension, 
poa.owner_address_oid as primaryaddressid, 
poa.address_type_code as primaryaddresscode, 
poa.address1 as primaryaddress1, 
poa.address2 as primaryaddress2, 
poa.city as primarycity, 
poa.state as primarystate, 
poa.postal_code as primaryzip, 
poa.current_ind as primarycurrent, 
soa.owner_address_oid as secondaryaddressid,
soa.address_type_code as secondaryaddresscode, 
soa.address1 as secondaryaddress1, 
soa.address2 as secondaryaddress2, 
soa.city as secondarycity, 
soa.state as secondarystate, 
soa.postal_code as secondaryzip, 
soa.current_ind as secondarycurrent,
(    select
      (    select oa2.owner_information_oid 
            from aroh_owner_aircraft_rlshp oa2 
            where upper(primary_owner) like '%PRIMARY%' 
                            and oa2.aircraft_oid = oa1.aircraft_oid
                            and rownum = 1) as prim_owner_oid
                from aroh_owner_aircraft_rlshp oa1
                where oa1.owner_information_oid = p_owner_information_oid
                   and rownum = 1 
) as primary_owner_oid,
(          select 
              case when (upper(primary_owner) like '%PRIMARY%')
                                                then 'Y'
                                                else 'N' end as isprimary
                from aroh_owner_aircraft_rlshp
                where owner_information_oid = p_owner_information_oid
                and rownum = 1
) as is_primary
from aroh_owner_information oi 
inner join (select * 
                  from aroh_owner_address 
                where upper(current_ind) = 'Y' 
                    and address_type_code = 'OPRIM') poa 
on oi.owner_information_oid = poa.owner_information_oid 
left outer join (select * 
                        from aroh_owner_address 
                        where upper(current_ind) = 'Y' 
                        and address_type_code = 'OSEC') soa 
on oi.owner_information_oid = soa.owner_information_oid 
where   oi.owner_information_oid = p_owner_information_oid; 

begin 

For main_row in c_owner_dtls 
loop 
  v_owner_details_set.EXTEND; 
  v_owner_details_set(v_owner_details_set.LAST) :=  OWNER_DETAILS_TYPE    (main_row.owner_information_oid  , main_row.first_name   , main_row.last_name   , main_row.company_name   
   , main_row.license_information   , main_row.company_ind   , main_row.middle_initial   , main_row.title_type_oid   , main_row.suffix    , main_row.status_type_code   , main_row.primary_phone  
   , main_row.secondary_phone   , main_row.secondary_phone_type_code   , main_row.primary_phone_type_code   , main_row.email_address   , main_row.comments   , main_row.primary_phone_extension   
   , main_row.secondary_phone_extension   , main_row.primaryaddressid   , main_row.primaryaddresscode   , main_row.primaryaddress1   , main_row.primaryaddress2   , main_row.primarycity   
   , main_row.primarystate   , main_row.primaryzip   , main_row.primarycurrent   , main_row.secondaryaddressid    , main_row.secondaryaddresscode   , main_row.secondaryaddress1   
   , main_row.secondaryaddress2   , main_row.secondarycity   , main_row.secondarystate   , main_row.secondaryzip    , main_row.secondarycurrent   , main_row.primary_owner_oid   , main_row.is_primary ); 
end loop; 

return v_owner_details_set;

EXCEPTION
When others 
then dbms_output.put_line ('Oracle error: '||SQLERRM);

end;

2 个答案:

答案 0 :(得分:3)

AUTONOMOUS_TRANSACTION pragma意味着该函数在单独的事务的上下文中运行。默认情况下(参见http://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm#sthref1972),这使用“读提交”隔离级别,这意味着,当事务查询数据时,它只查看在查询开始之前提交的数据。由于您插入的数据尚未提交,这意味着该功能无法查看。

答案 1 :(得分:1)

来自Oracle Docs:

AUTONOMOUS_TRANSACTION pragma改变子程序在事务中的工作方式。标有此pragma的子程序可以执行SQL操作并提交或回滚这些操作,而无需在主事务中提交或回滚数据。

你能尝试摆脱那个pragma吗?

最后,“我的DBA告诉我Oracle功能不在事务中运行”是值得怀疑的。我不是专家,但我真诚地怀疑这是否正确。