pragma autonomous_transaction的用法 -回复

合集下载

oracle pragma的用法

oracle pragma的用法

oracle pragma的用法Oracle Pragma的用法什么是Oracle Pragma?Oracle Pragma是一种用于在编译时指示Oracle数据库优化器行为的特殊语句。

它的作用是为了提高查询性能,并且能够为开发人员提供更细粒度的控制。

使用Oracle Pragma的好处•提高查询性能:通过指示优化器执行查询操作的特定方法,可以优化查询性能。

•精确控制:开发人员可以通过使用不同的Oracle Pragma指令来精确控制优化器的行为,以便适应不同的查询需求。

常用的Oracle Pragma指令Pragma AUTONOMOUS_TRANSACTION•描述:在一个事务中调用一个独立的事务。

•示例:PRAGMA AUTONOMOUS_TRANSACTION;BEGIN-- 这里是独立事务的代码END;Pragma INLINE•描述:告诉编译器将指定的函数中的代码“内联”到调用处,以减少函数调用带来的开销。

•示例:CREATE OR REPLACE FUNCTION myfunction (arg NUMBER) RETURN NUMBERASPRAGMA INLINE(myfunction, 'YES');BEGIN-- 函数体END;Pragma EXCEPTION_INIT•描述:为指定的异常定义错误代码。

•示例:DECLAREmy_exception EXCEPTION;PRAGMA EXCEPTION_INIT(my_exception, ;BEGIN-- 引发异常的代码EXCEPTIONWHEN my_exception THEN-- 异常处理代码END;Pragma RESTRICT_REFERENCES•描述:将存储过程或函数的敏感度注释为单元规则,有助于优化器发现运行时的错误。

•示例:CREATE OR REPLACE FUNCTION myfunction (arg NUMBER) RETURN NUMBERRESTRICT_REFERENCES (myfunction, WNPS, RNDS, WNDS, RNPS)AS-- 函数体END;Pragma INLINE_SQL•描述:告诉优化器在执行时使用内联SQL。

PRAGMA AUTONOMOUS_TRANSACTION自治事务

PRAGMA AUTONOMOUS_TRANSACTION自治事务

PRAGMA AUTONOMOUS_TRANSACTION自治事务今天想在函数里面进行update操作,发现这样子的错误会抛以下的DML错误,如下:ORA-14551: cannot perform. a DML operation inside a query - 查询资料发现:对数据库有写操作(INSERT、UPDATE、DELETE、CREATE、ALTER、COMMIT)的函数,是无法简单的用SQL来调用的. >>>>>>>>>>>>>>& gt;>>>>>>>>>>>>>>>>>>>>>>>>>>>>& gt;>>>>>>>>>>>>>>>>>>>>>解决办法如下,只需在声明中添加PRAGMA AUTONOMOUS_TRANSACTION Java代码CREATE OR REPLACE FUNCTIONFUN_SET_PROJECT_COST (V_BUDGET_OBJECT_IDIN VARCHAR2,V_ADJUST_ID IN VARCHAR2)RETURN VARCHAR2ISPRAGMA AUTONOMOUS_TRANSACTION;CREATE OR REPLACE FUNCTIONFUN_SET_PROJECT_COST (V_BUDGET_OBJECT_ID IN VARCHAR2,V_ADJUST_ID IN VARCHAR2) RETURN VARCHAR2ISPRAGMA AUTONOMOUS_TRANSACTION;PRAGMA AUTONOMOUS_TRANSACTION自治事务当前的存储过程作为已有事务的子事务运行,子事务的commit,rollback 操作不影响父事务的状态在你的一个事务(外层事务)中可以定义一个或几个自治事务。

pragma autonomous_transaction的用法

pragma autonomous_transaction的用法

pragma autonomous_transaction的用法在数据库编程中,pragma是一种特殊的指令,用于控制数据库的行为和功能。

其中,autonomous_transaction是一种常用的pragma,它允许在事务中执行自主事务。

这对于需要处理大量数据或需要独立于其他事务执行的操作非常有用。

本文将介绍pragmaautonomous_transaction的用法,包括其定义、语法、示例以及注意事项。

一、定义和背景pragmaautonomous_transaction用于在数据库中开启自主事务。

自主事务是一种独立于其他事务的事务,可以在没有其他事务干扰的情况下执行一系列操作。

这对于需要处理大量数据或需要独立执行的操作非常有用,因为它可以减少与其他事务的冲突和干扰。

二、语法这条指令将开启自主事务模式。

如果想要关闭自主事务模式,可以使用以下语法:三、示例假设我们有一个简单的数据库,其中包含一个名为“customers”的表,该表包含客户的姓名和电话号码。

现在,我们想要批量更新所有客户的电话号码,而不需要等待其他事务完成。

我们可以使用pragmaautonomous_transaction来实现这个目标。

首先,我们启动一个常规事务:BEGINTRANSACTION;接下来,我们执行批量更新操作:UPDATEcustomersSETphone='new_phone_number'WHEREname='customer_name';最后,我们提交自主事务:COMMIT;这样,我们就可以在自主事务中独立地执行一系列操作,而不会受到其他事务的干扰。

四、注意事项1.自主事务只能在常规事务之前开启。

如果在常规事务之后开启自主事务,则无法正常工作。

2.自主事务中的操作必须在事务结束时提交或回滚。

如果在自主事务中执行了未提交的操作,可能会导致数据不一致或丢失数据。

3.自主事务中的操作必须与其他事务隔离,以避免与其他事务发生冲突。

Oracle常用FAQ

Oracle常用FAQ

Oracle 常用FAQ第一部分、SQL&PL/SQL (3)第二部分、ORACLE构架体系 (14)第三部分、备份与恢复 (24)第四部分、性能调整 (30)第五部分、ORACLE网络与安全 (40)更多Oracle资料下载,请收藏以下地址:/forum-160286-1.html第一部分、SQL&PL/SQL1.[Q]怎么样查询特殊字符,如通配符%与_[A]select * from table where name like 'A\_%' escape '\'2.[Q]如何插入单引号到数据库表中[A]可以用ASCII码处理,其它特殊字符如&也一样,如insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'或者用两个单引号表示一个or insert into t values('I''m'); -- 两个''可以表示一个'3.[Q]怎样设置事务一致性[A]set transaction [isolation level] read committed; 默认语句级一致性set transaction [isolation level] serializable;read only; 事务级一致性4.[Q]怎么样利用游标更新数据[A]cursor c1 isselect * from tablenamewhere name is null for update [of colum n]……update tablename set column = ……where current of c1;5.[Q]怎样自定义异常[A] pragma_exception_init(exception_name,error_number);如果立即抛出异常raise_application_error(error_number,error_m sg,true|false);其中number从-20000到-20999,错误信息最大2048B异常变量SQLCODE 错误代码SQLERRM 错误信息6.[Q]十进制与十六进制的转换[A]8i以上版本:to_char(100,'XX')to_number('4D','XX')8i以下的进制之间的转换参考如下脚本create or replace function to_base( p_dec in number, p_base in number ) return varchar2isl_str varchar2(255) default NULL;l_num number default p_dec;l_hex varchar2(16) default '0123456789ABCDEF';beginif ( p_dec is null or p_base is null ) thenreturn null;end if;if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) thenraise PROGRAM_ERROR;end if;loopl_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str;l_num := trunc( l_num/p_base );exit when ( l_num = 0 );end loop;return l_str;end to_base;/create or replace function to_dec( p_str in varchar2,p_from_base in number default 16 ) return numberisl_num number default 0;l_hex varchar2(16) default '0123456789ABCDEF';beginif ( p_str is null or p_from_base is null ) thenreturn null;end if;for i in 1 .. length(p_str) loopl_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1;end loop;return l_num;end to_dec;/7.[Q]能不能介绍SYS_CONTEXT的详细用法[A]利用以下的查询,你就明白了selectSYS_CONTEXT('USERENV','TERMINAL') terminal,SYS_CONTEXT('USERENV','LANGUAGE') language,SYS_CONTEXT('USERENV','SESSIONID') sessionid,SYS_CONTEXT('USERENV','INSTANCE') instance,SYS_CONTEXT('USERENV','ENTRYID') entryid,SYS_CONTEXT('USERENV','ISDBA') isdba,SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,SYS_CONTEXT('USERENV','CURRENT_USER') current_user,SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,SYS_CONTEXT('USERENV','SESSION_USER') session_user,SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,SYS_CONTEXT('USERENV','DB_NAME') db_name,SYS_CONTEXT('USERENV','HOST') host,SYS_CONTEXT('USERENV','OS_USER') os_user,SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type, SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_datafrom dual8.[Q]怎么获得今天是星期几,还关于其它日期函数用法[A]可以用to_char来解决,如select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;在获取之前可以设置日期语言,如ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';还可以在函数中指定selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = Am erican') from dual;其它更多用法,可以参考to_char与to_date函数如获得完整的时间格式select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;随便介绍几个其它函数的用法:本月的天数SELECT to_char(last_day(SYSDATE),'dd') days FROM dual今年的天数select add_m onths(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 下个星期一的日期SELECT Next_day(SYSDATE,'monday') FROM dual9.[Q]随机抽取前N条记录的问题[A]8i以上版本select * from (select * from tablename order by sys_guid()) where rownum < N;select * from (select * from tablename order by dbms_random.value) where rownum< N;注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sqldbms_random.value(100,200)可以产生100到200范围的随机数10.[Q]抽取从N行到M行的记录,如从20行到30行的记录[A]select * from (select rownum id,t.* from table where ……and rownum <= 30) where id > 20;11.[Q]怎么样抽取重复记录[A]select * from table t1 where where t1.rowed !=(select m ax(rowed) from table t2where t1.id=t2.id and =)或者select count(*), t.col_a,t.col_b from table tgroup by col_a,col_bhaving count(*)>1如果想删除重复记录,可以把第一个语句的select替换为delete12.[Q]怎么样设置自治事务[A]8i以上版本,不影响主事务pragma autonomous_transaction;……commit|rollback;13.[Q]怎么样在过程中暂停指定时间[A]DBMS_LOCK包的sleep过程如:dbms_lock.sleep(5);表示暂停5秒。

oracle function 语法

oracle function 语法

Oracle Function 语法Oracle Function 是一种可重用的程序单元,它接受输入参数并返回一个值。

Function 可以在 SQL 查询中使用,也可以在 PL/SQL 块中调用。

本文将详细介绍Oracle Function 的语法,包括创建和使用 Function 的步骤,以及一些常用的用法和示例。

创建 Function在 Oracle 中,创建 Function 需要使用CREATE FUNCTION语句。

下面是创建Function 的基本语法:CREATE [OR REPLACE] FUNCTION function_name[ (parameter_name [IN | OUT | IN OUT] data_type [, ...]) ]RETURN return_data_type[DETERMINISTIC]{IS | AS}[PRAGMA AUTONOMOUS_TRANSACTION;]BEGIN-- Function 的逻辑代码RETURN return_value;END;•CREATE FUNCTION:创建 Function 的关键字。

•OR REPLACE:可选项,表示如果 Function 已经存在,则替换它。

•function_name:Function 的名称,遵循标识符的命名规则。

•parameter_name:可选项,Function 的输入参数名称。

•IN | OUT | IN OUT:可选项,指定参数的传递方式。

默认为IN,表示参数是输入参数。

•data_type:参数的数据类型。

•RETURN return_data_type:指定 Function 的返回值数据类型。

•DETERMINISTIC:可选项,表示 Function 的结果只依赖于输入参数,没有其他影响。

•IS | AS:Function 的逻辑代码开始的关键字。

•PRAGMA AUTONOMOUS_TRANSACTION;:可选项,表示 Function 可以在独立的事务中执行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pragma autonomous_transaction的用法-回复pragma autonomous_transaction 是SQL 中的一种特殊的事务控制语句。

它用于在当前事务之外创建一个独立的事务,并且不受外部事务的提交或回滚的影响。

pragma autonomous_transaction 提供了一种在当前事务中执行一个独立的任务,并且不会随着外部事务的结果而受到影响的方法。

在本篇文章中,我们将探讨pragma autonomous_transaction 的用法,以及如何正确地使用它来实现自动化的事务处理。

1. 什么是pragma autonomous_transaction?
pragma autonomous_transaction 是一个用于创建独立事务的特殊SQL 语句。

每个pragma autonomous_transaction 可以包含多个SQL 语句,这些语句将在一个独立的事务中执行。

与常规的事务不同,pragma autonomous_transaction 不受外部事务的提交或回滚的影响。

这意味着,无论外部事务的结果如何,pragma autonomous_transaction 始终能够独立地完成它的任务。

2. 如何使用pragma autonomous_transaction?
要使用pragma autonomous_transaction,首先需要在代码块或存储过程中声明pragma autonomous_transaction。

这可以通过在代码块或存储过程的开头添加pragma autonomous_transaction 的语句来实现。

例如:
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
需要执行的SQL 语句
...
COMMIT;
END;
在上面的示例中,我们声明了一个包含pragma
autonomous_transaction 的代码块,并在其内部执行了一些SQL 语句。

当执行到COMMIT 语句时,pragma autonomous_transaction 中的事务将被提交,而不受外部事务的影响。

3. pragma autonomous_transaction 的应用场景
pragma autonomous_transaction 的主要应用场景是在需要进行独立
事务处理的时候。

有以下几种情况可能需要使用pragma autonomous_transaction:
- 数据插入或更新:在某些情况下,我们可能需要在一个事务中插入或更新一些数据,并且不希望这些操作受外部事务的影响。

这时,可以使用
pragma autonomous_transaction 来创建一个独立的事务,确保数据的插入或更新操作能够独立地执行。

- 日志记录:在记录日志的过程中,我们通常希望日志的写入操作能够独立于外部事务,以防止因为外部事务的回滚而导致日志丢失。

使用pragma autonomous_transaction 可以确保日志记录事务能够被独立
地提交。

- 异常处理:在处理异常时,我们可能需要执行一些特定的操作,并将异常信息记录下来。

使用pragma autonomous_transaction 可以将异常处理过程中的数据库操作独立化,从而避免外部事务的回滚影响到异常处理的结果。

- 并发操作:在高并发环境下,同时进行数据库操作可能会导致锁等待的问题。

使用pragma autonomous_transaction 可以将一些不需要保持锁的操作独立为一个独立事务,从而降低并发冲突的风险。

4. 使用pragma autonomous_transaction 的注意事项
尽管pragma autonomous_transaction 可以提供独立的事务处理能力,但在使用它时需要注意以下几点:
- 提交与回滚:pragma autonomous_transaction 中的事务必须显式地
进行提交或回滚。

如果事务不进行提交,那么其中的数据修改将不会被持久化。

如果事务进行回滚,那么其中的数据修改将被撤销。

- 连接与资源:pragma autonomous_transaction 中的事务会消耗额外的数据库连接和资源。

在高并发环境下,过多地使用pragma autonomous_transaction 可能会导致数据库连接资源紧张。

- 死锁:如果一个事务在pragma autonomous_transaction 中进行了数据修改,而另一个事务也修改了相同的数据,可能会导致死锁问题。

因此,在使用pragma autonomous_transaction 时需要注意数据访问的并发性,并进行合理的锁或并发控制。

- 查询视图问题:在pragma autonomous_transaction 中进行的查询操作可能会受到外部事务的修改的影响。

如果查询的数据被外部事务修改了,那么pragma autonomous_transaction 中的查询结果可能会不准确。

综上所述,pragma autonomous_transaction 是SQL 中一种特殊的事务控制语句,可以创建独立的事务并独立于外部事务进行处理。

它在一些特定场景下非常有用,如数据插入或更新、日志记录、异常处理以及并发操作。

使用pragma autonomous_transaction 需要注意提交与回滚、
连接与资源、死锁以及查询视图等问题。

只有当我们能够正确地理解和使用pragma autonomous_transaction 时,才能充分发挥它的优势,提高数据库操作的效率和稳定性。

相关文档
最新文档