oracle pragma的用法
- 格式:docx
- 大小:11.87 KB
- 文档页数:6
O r a c l e存储过程学习目录Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。
存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。
这样的结果就是,代码存储一次但是能够被多个程序使用。
要创建一个过程对象 procedural object ,必须有 CREATE PROCEDURE 系统权限。
如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。
执行procedure 的时候,可能需要excute权限。
或者EXCUTE ANY PROCEDURE 权限。
如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE 'ONE PARAMETER' ;存储过程 PROCEDURE 和函数 FUNCTION 的区别。
function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。
本质上没有区别,都是 PL/SQL 程序,都可以有返回值。
最根本的区别是:存储过程是命令, 而函数是表达式的一部分。
比如:select max NAME FROM但是不能 exec max NAME 如果此时max是函数。
PACKAGE是function,procedure,variables 和sql 语句的组合。
package允许多个procedure使用同一个变量和游标。
创建 procedure的语法:Sql 代码:可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute 权限都将被保留。
IN, OUT, IN OUT用来修饰参数。
Oracle存储过程中的事务处理当在SQL*Plus中进行操作时,用户可以使用COMMIT语句将在事务中的所有操作“保存”到数据库中。
如果用户需要撤销所有的操作,则可以使用ROLLBACK语句回退事务中未提交的操作,使数据库返回到事务处理开始前的状态。
在PL/SQL过程中,不仅可以包括插入和更新这类的DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。
Oracle支持事务的嵌套,即在事务处理中进行事务处理。
在嵌套的事务处理过程中,子事务可以独立于父事务处理进行提交和回滚。
对于过程而言,每个过程就相当于一个子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是回滚,用户都可以确保过程中的子事务被执行。
下面通过一个示例演示过程中的事务处理。
(1)以用户SCOTT身份连接到数据库,并建立两个表TEMP和LOG_TABLE。
SQL> create table temp(n number);表已创建。
SQL> create table log_table(2 username varchar2(20),3 message varchar2(4000));表已创建。
(2)建立一个存储过程INSERT_INTO_LOG,用于向表LOG_TABLE添加记录。
SQL> create or replace procedure insert_into_log(msg_param varchar2) is2 pragma autonomous_transaction;3 begin4 insert into log_table(username,message)5 values(user,msg_param);6 commit;7 end insert_into_log;8 /过程已创建。
其中,PRAGMA AUTONOMOUS_TRANSACTION语句表示自动开始一个自治事务,实际上该语句也可以省略。
pragma用法总结"pragma" 是一个在编程中经常使用的关键字,它在不同的编程语言中有不同的用法。
我将从多个角度来总结一下 "pragma" 的用法。
1. C/C++ 中的用法:在 C/C++ 中,"pragma" 是用来控制编译器行为的指令。
常见的用法包括:"#pragma once",在头文件中防止多重包含。
"#pragma pack",指定结构体成员的对齐方式。
"#pragma comment",用于在链接时指定库文件。
2. Python 中的用法:在 Python 中,"pragma" 通常用于控制解释器的行为,例如:"#pragma pylint",用于关闭特定的 pylint 检查。
"#pragma no-cover",用于指示代码行不被覆盖率测试覆盖。
3. SQL 中的用法:在 SQL 中,"pragma" 通常用于查询和设置数据库的元数据信息,例如:"PRAGMA table_info(table_name)",用于查询表的结构信息。
"PRAGMA foreign_keys",用于启用或禁用外键约束检查。
4. 其他语言中的用法:在其他编程语言中,"pragma" 也可能有不同的用法,例如在Ada、Fortran 等语言中也有类似的用法,用于控制编译器或解释器的行为。
总的来说,"pragma" 是一个用于控制编译器或解释器行为的关键字,在不同的编程语言中有不同的用法,但总的目的都是为了优化程序的性能或者控制程序的行为。
希望这些信息能够帮助到你。
Oracle 非预定义异常在一个异常产生、被捕获并处理之前,它必须被定义。
Oracle定义了几千个异常,绝大多数只有错误编号和相关描述,仅仅命名了21个最常被用到的异常,即系统预定义异常。
这些异常的名称被储存在STANDARD,UTL_FILE,DBMS_SQL这几个系统包中。
除此之外的绝大多数异常都未命名,这些异常就是非预定义异常,它们需要程序员对其进行命名。
当然,只使用错误码也可以完成异常的处理,但是这种异常处理会使代码非常生涩。
例如:exceptionwhen others thenif sqlcode=-1843 then…..end if;为非预定义异常命名时,需要使用语句PRAGMA EXCEPTION_INIT为错误号关联一个名称,随后就可以像对待系统预定义异常一样进行处理。
EXCEPTION_INIT是一个编译时运行的函数,它只能出现在代码的声明部分,而异常名字必须在此之前被定义。
例如,下面的示例在程序块中为异常-1834关联了一个名称:declareinvalid_company_id exception;pragma exception_init(invalid_id, -1834);下面通过一个完整的示例,演示如何在程序中处理Oracle错误ORA-2292。
SQL> set serveroutput onSQL> declare2 fk_delete_exception exception;3 pragma exception_init(fk_delete_exception,-2292);4 begin5 delete dept6 where dname='SALES';7 exception8 when fk_delete_exception then9 dbms_output.put_line('该项目存在于另一个表中!');10 end;11 /该项目存在于另一个表中!PL/SQL 过程已成功完成。
c语言pragma的用法以下是 9 条关于 C 语言pragma 的用法:1. 嘿,你知道吗?pragma 可以用来指定编译器的一些特殊行为呢!就好像给编译器下达特别指令一样。
比如 pragma warning(disable: 4996),这就像是对编译器说:“嘿,别给我报 4996 这个警告啦!”2. 哇塞,pragma 还能优化代码的生成呢!像 pragma pack(1),这就像给代码的排列定下了严格规则,让其紧凑起来。
“哎呀,这样代码就更整齐啦!”3. 嘿呀,pragma 甚至可以影响代码的调试呢!像 pragma optimize("", off),这简直就是在说:“现在先别太着急优化,让我好好调试下!”4. 告诉你哦,pragma 能在一些特定情况下发挥大作用。
比如说 pragma once,就像是给文件加上了一个独特标记,“嘿嘿,这样就不会重复包含啦!”5. 哇哦,pragma 也能处理一些硬件相关的事情呢!像特定平台的指令设置,这多神奇呀,“这岂不是像给硬件开了个小后门?”6. 嘿嘿,pragma 有时候就像一个魔法开关。
比如控制某些警告的显示与否,“哇,这开关一扳,效果就不一样了呢!”7. 哟呵,pragma 还能针对代码的排版和风格做调整呢!像设置代码对齐方式,“嘿,这样代码看起来就更顺眼了呀!”8. 哈哈,pragma 真的好有趣呀!它可以根据你的需要灵活运用。
比如控制某些优化选项,“哇,这就像是给代码穿上了合适的衣服。
”9. 你想啊,pragma 就像是给 C 语言代码赋予了各种特别能力。
从优化到调试,从格式到硬件相关,无所不能。
“所以啊,一定要好好利用它呀!”我的观点结论:C 语言的 pragma 用法多样且神奇,能在很多方面为我们的代码编写带来便利和优化,真的是非常重要的一个部分呢!。
最近总有人问#pragma CODE_SEG __NEAR_SEG NON_BANKED,还有#pragmaLINK_INFO DERIVATIVE "mc9s12xs128"这些函数是什么意思!我在网上收集了一些资料希望能解大家疑惑!#pragma LINK_INFO DERIVATIVE "mc9s12xs128“是用来改变mcu的,有了这句就不用手工改了,自动修改,你可以试一下,建一个工程,然后改变mcu具体:你先建一个工程,然后改变mcu,在工程窗口里有一个类似芯片的按钮按一下,或者在工程里面点击change mcu,然后你在查看一下工程文件,就会自动改变相应的文件!#pragma CODE_SEG __NEAR_SEG NON_BANKED前一段时间写函数中断时,经常要加上#pragma语句,否则,编译就会出错。
有飞思卡尔的16位单片机写过中断函数的人,就会知道在中断函数前必须加上代码#pragma CODE_SEG __NEAR_SEG NON_BANKED ,函数结束的时候最好加上#pragmaCODE_SEG DEFAULT(这个也可不加,但最好加上,以防出现bug)前一段时间写函数中断时,经常要加上#pragma语句,否则,编译就会出错。
有飞思卡尔的16位单片机写过中断函数的人,就会知道在中断函数前必须加上代码#pragma CODE_SEG __NEAR_SEGNON_BANKED ,函数结束的时候最好加上#pragma CODE_SEG DEFAULT(这个也可不加,但最好加上,以防出现bug)现汇总#pragma用法如下:1.#pragma message#pragma message("消息文本") 当编译器遇到这条指令时,就在编译输出窗口中将消息文本打印出来。
2.#pragma code_seg#pragmacode_seg(["section-name"["section-class"]])它能够设置程序中函数代码存放的代码段。
oracle 语句块函数摘要:1.简介2.Oracle语句块的概述3.Oracle函数的使用4.总结正文:1.简介在Oracle数据库中,语句块和函数是两种重要的编程结构,可以帮助我们实现复杂的业务逻辑。
本文将详细介绍Oracle语句块和函数的使用方法。
2.Oracle语句块的概述Oracle语句块是Oracle中一种可执行的代码块,它允许我们在一个SQL 语句中执行多个SQL命令。
语句块有三种类型:PL/SQL块、匿名PL/SQL块和扩展SQL块。
其中,PL/SQL块是最常用的语句块类型,它支持变量、循环、条件语句等高级编程功能。
使用PL/SQL块时,我们需要使用BEGIN和END关键字来标识代码块的开始和结束。
例如:```BEGIN-- 这里是PL/SQL块的内容END;```3.Oracle函数的使用在Oracle中,函数是一种将输入参数转换为特定输出的PL/SQL代码块。
函数可以提高代码的重用性,减少冗余代码。
Oracle提供了许多内置函数,如字符串处理函数、数学函数等。
我们还可以自定义函数,以满足特定的业务需求。
定义函数时,我们需要使用CREATE FUNCTION关键字,并指定函数名、参数类型和返回类型。
例如:```CREATE FUNCTION add_numbers (p1 NUMBER, p2 NUMBER)RETURN NUMBER ISresult NUMBER;BEGINresult := p1 + p2;RETURN result;END;/```4.总结本文介绍了Oracle语句块和函数的使用方法。
语句块是一种可执行的代码块,可以帮助我们实现复杂的业务逻辑;函数是将输入参数转换为特定输出的PL/SQL代码块,可以提高代码的重用性。
oracle中package用法,在Oracle数据库中,Package是一种特殊的对象,它是一个包含多个过程、函数、变量和常量的集合体。
由于Oracle数据库中的代码重用性和可维护性的要求越来越高,Package的使用变得越来越重要。
本文将详细介绍Package的用法,包括创建Package、包含的过程和函数的编写、调用以及维护。
【一、Package的概述】Package是Oracle数据库中提供的一种用于封装相关过程、函数、变量和常量的对象。
它可以在多个程序之间共享和重用,提高代码的可维护性和可复用性。
Package中的过程和函数可以调用其他过程和函数,这样一来可以实现多层次的代码调用和封装。
【二、Package的创建】1. 创建Package规约:在Oracle数据库中,通过使用CREATE PACKAGE语句来创建一个Package规约。
这个规约定义了Package的名称、变量和常量的声明,以及过程和函数的声明可以是公共的还是私有的。
2. 创建Package体:在定义好Package规约后,需要使用CREATE PACKAGE BODY语句来创建Package的体。
Package体定义了Package中实际的过程和函数的具体实现。
【三、Package的结构】Package由规约(Specification)和体(Body)两部分组成。
1. Package规约:Package规约定义了Package的接口,即可供外部调用的过程和函数,以及公共的变量和常量。
它使用CREATE PACKAGE语句创建。
2. Package体:Package体定义了Package中所包含的过程和函数的具体实现。
它使用CREATE PACKAGE BODY语句创建。
【四、Package中过程和函数的编写】Package中的过程和函数是实现具体业务逻辑的代码段,它们可以被其他过程和函数调用,也可以被外部程序直接调用。
oracle集合变量以及⾃定义异常的⽤法oracle 集合变量以及⾃定义异常的⽤法,在过程 record_practice 有record变量和⾃定义异常的⽤法实例。
具体在3284⾏。
1CREATE OR REPLACE Package Pkg_Weiyl Is2 Pkg_Name Constant Varchar2(20) :='pkg_weiyl';3 Too_Young Constant Number :=-20001;4 Exc_Too_Young Exception;5 Pragma Exception_Init(Exc_Too_Young, -20001);6Procedure Updateaae140(Pi_Aac002 In Varchar2,7 Pi_Aae140 In Varchar2,8 Po_Fhz Out Varchar2,9 Po_Msg Out Varchar2);10Procedure Updateidcard(Pi_Bae007 In Varchar2,11 Pi_Flag In Varchar2,12 Pi_Aac002 In Varchar2,13 Pi_Aac002_New In Varchar2,14 Pi_Aae013 In Varchar2,15 Pi_Aae011 In Varchar2,16 Pi_Bae001 In Varchar2,17 Po_Fhz Out Varchar2,18 Po_Msg Out Varchar2);19Procedure Cancelupdate(Pi_Bae007 In Varchar2,20 Po_Fhz Out Varchar2,21 Po_Msg Out Varchar2);22Procedure Updateidfh(Pi_Bae007 In Varchar2,23 Pi_Aae012 In Varchar2,24 Po_Fhz Out Varchar2,25 Po_Msg Out Varchar2);26Procedure Validateidcard(Pi_Aac001 In Number,27 Pi_Aac002_New In Varchar2,28 Po_Fhz Out Varchar2,29 Po_Msg Out Varchar2);30Procedure Vali_Idcard_Lenandchar(Pi_Aac002 In Varchar2,31 Po_Fhz Out Varchar2,32 Po_Msg Out Varchar2);33Procedure Updateidcard_Fortest(Pi_Aac002 In Varchar2,34 Pi_Aac002_New In Varchar2,35 Pi_Aae013 In Varchar2,36 Pi_Aae011 In Varchar2,37 Pi_Bae001 In Varchar2,38 Po_Fhz Out Varchar2,39 Po_Msg Out Varchar2);40--截取字符串 split_type 是⾃⼰建的类型 CREATE or replace type split_comma is table of varchar2(4000);41-- 取出字符串的⽅法: select column_value from table (pkg_weiyl.split_dh('dd,aa,134'));42Function Split_Dh(p_Str In Varchar2,43 p_Delimiter In Varchar2Default (',') --分隔符,默认逗号44 ) Return Split_Type;4546Function Func_Wyl(Pi_Aaa100 Varchar2, Pi_Aaa102 Varchar2)47--字典转换,把代码值转换成对应的可理解的中⽂,卫永乐,2014110548Return Varchar2;49Function Func_Check_Para(Pi_Aab999 In Varchar2,50 Pi_Pch In Varchar2,51 Pi_Aae001 In Number,52 Pi_Aae036 In Varchar2,53 Pi_Aac027 In Number)54/*拼接where条件过程 check_sdnmdc 的游标的where条件*/55Return Varchar2;5657/*58 added 2016080159获取⽉份差值,主要针对于转移统计的60*/61function getMonthNum(pi_ksyf in number,62 pi_zzyf in number,63 pi_aae180 in number) return number;6465Procedure Xjyyzf(Pi_Bae007 In Varchar2,66 Pi_Operid In Varchar2,67 Pi_Aae037 In Varchar2,68 Pi_Aae038 In Varchar2,69 Po_Fhz Out Varchar2,70 Po_Msg Out Varchar2);71--- 循环调⽤的过程,解决每次都要⾃⼰写⼀个declare plsql代码块,72--⼊参:73Procedure Prc_Xunhuan(Pi_Prcname In Varchar2, --要调⽤的过程名74 Pi_Tabname In Varchar2, --cursor取值的表75 Po_Fhz Out Varchar2,76 Po_Msg Out Varchar2);77Procedure Xjyyzf_Callback(Pi_Bae007 In Varchar2,78 Pi_Operid In Varchar2,79 Po_Fhz Out Varchar2,80 Po_Msg Out Varchar2);81Procedure Xjyyzfqx(Pi_Bae007 In Varchar2,82 Po_Fhz Out Varchar2,83 Po_Msg Out Varchar2);84-- 添加⾃治事务85Procedure Autonomous_Tran(Pi_Aac001 In Varchar2,86 Po_Fhz Out Varchar2,87 Po_Msg Out Varchar2);88/*⼿⼯添加表级锁,使⽤场景,如果要操作⼀张⼤表的⼤部分数据,89如果不加表级锁,那么就会耗费⼤量的资源,这种情况下可以使⽤90⼿⼯给表加锁,释放⽅式 rollback,或者commit91*/92Procedure Update_Ac02_Aae140(Pi_Aae140 In Varchar2,93 Pi_Fhz Out Varchar2,94 Po_Msg Out Varchar2);9596Procedure Querycheck(Pi_Aac002 In Varchar2,97 Pi_Aac003 In Varchar2,98 Po_Fhz Out Varchar2,99 Po_Msg Out Varchar2);100101Procedure Check_Ac02(Pi_Aac002 In Varchar2,102 Po_Aac001 Out Number,103 Po_Cac012 Out Varchar2,104 Po_Aab001 Out Varchar2,105 Po_Fhz Out Varchar2,106 Po_Msg Out Varchar2);107Procedure Check_Skc84(Pi_Aac001 In Varchar2,108 Po_Fhz Out Varchar2,114Procedure Check_Sdnmdc(Pi_Bae001 In Varchar2,115 Pi_Aab999 In Varchar2,116 Pi_Pch In Varchar2,117/* PI_GLT in varchar2,*/118 Pi_Aae001 In Varchar2,119 Pi_Aae036 In Varchar2,120 Pi_Aac027 In Varchar2,121 Pi_Bzw In Varchar2,122 Pi_Oper In Varchar2,123 Po_Fhz Out Varchar2,124 Po_Msg Out Varchar2);125Procedure Check_Sdnmdc_Multi(Pi_Bae001 In Varchar2,126 Pi_Aab999 In Varchar2,127 Pi_Pch In Varchar2,128/* PI_GLT in varchar2,*/129 Pi_Aae001 In Varchar2,130 Pi_Aae036 In Varchar2,131 Pi_Aac027 In Varchar2,132 Pi_Bzw In Varchar2,133 Pi_Oper In Varchar2,134 Po_Fhz Out Varchar2,135 Po_Msg Out Varchar2);136Procedure Updatekbb5(Pi_Bae007 In Varchar2,137 Pi_Ckz545 In Varchar2,138 Pi_Ckb626 In Varchar2,139 Pi_Ckb627 In Varchar2,140 Pi_Ckb629 In Varchar2,141 Pi_Ckb630 In Varchar2,142 Po_Fhz Out Varchar2,143 Po_Msg Out Varchar2);144Procedure Getaaz601(Pi_Rc In Varchar2,145 po_aaz601 out number,146 Po_Fhz Out Varchar2,147 Po_Msg Out Varchar2);148Procedure Insertfw_Zsk(PI_AAA200 in varchar2,149 Pi_Aae202 In Varchar2,150 Pi_Aaa203 In Varchar2,151 Pi_Aae008 In Varchar2,152 PI_AAE011 IN VARCHAR2,153 PI_AAE906 IN VARCHAR2,154 PI_BZ IN VARCHAR2,155 Po_Fhz Out Varchar2,156 Po_Msg Out Varchar2);157/*拼接两个字符串,练⼿嵌套存储过程*/158procedure testNestedPro(pi_xing in varchar2,159 pi_ming in varchar2,160 pi_aab001 in number,161 po_fhz out varchar2,162 po_msg out varchar2);163/*触摸屏查询标记*/164procedure cancelCmp(PI_SERIALNUM in varchar2,165 po_fhz out varchar2,166 po_msg out varchar2);167/*取消征集通知单*/168procedure cancelAaz288(PI_OPERID in varchar2,169 PI_AAZ288 in varchar2,170 po_fhz out varchar2,171 po_msg out varchar2);172/*删除知识库核销的附件内容,否则数据⾥的不必要的附件会越来越多*/ 173procedure deleteZskFile(PI_CAE232 in varchar2,174 po_fhz out varchar2,175 po_msg out varchar2);176procedure generatexmmx(pi_ksrq in varchar2,177 pi_zzrq in varchar2,178 po_fhz out varchar2,179 po_msg out varchar2);180procedure rebuild_sic86(pi_aac001 in varchar2,181 po_fhz out varchar2,182 po_msg out varchar2);183procedure rebuild_ab07(pi_aab001 in varchar2,184 pi_ksny in varchar2,185 pi_zzny in varchar2,186 pi_aae140 in varchar2,187 po_fhz out varchar2,188 po_msg out varchar2);189190/*Pkg_Ryhb_Pl_New191 --批量合并,初始数据⽣成192 Procedure Plhb_Start(Pi_Bae001 In Varchar2,193 Pi_Aab001 In Number,194 Pi_Jbr In Varchar2,195 Po_Fhz Out Varchar2,196 Po_Msg Out Varchar2)197*/198procedure generate_plhb_data(pi_bae001 in varchar2,199 po_fhz out varchar2,200 po_msg out varchar2);201procedure queryZSK(PI_AAE906 in varchar2,202 PO_AAE202 out varchar2,203 PO_AAE008 out varchar2,204 po_fhz out varchar2,205 po_msg out varchar2);206/*207⽣成失地农民汇总数据208 by weiyongel 20160519209*/210procedure generate_sdnmhzsj(PI_BAE001 in varchar2,211 po_fhz out varchar2,212 po_msg out varchar2);213/*214⽣成失地农民清理数据215 by weiyongel 20160519216*/217procedure generate_sdnmqlsj(PI_BAE001 in varchar2,218 po_fhz out varchar2,219 po_msg out varchar2);220/*⽣成失地农民数据清理后的变化字段,⽤于查询失地农民数据清理模块*/ 221procedure generate_sdnmdatachange(PI_AAC001 in varchar2,222 PI_AAZ288 in varchar2,223 PO_FHZ out varchar2,224 PO_MSG out varchar2);225/*检查ac35时间,增减员时⽤*/226procedure checkAC35Tim(PI_AAC002 in varchar2,227 pi_aab999 in varchar2,228 Po_AAE042 OUT varchar2,229 PO_FHZ out varchar2,230 PO_MSG out varchar2);231/* 重新统计ac43 aae002 ,20160526 */237 PO_FHZ out varchar2,238 PO_MSG out varchar2);239/* for test ,20160530 */240procedure myInsert(PI_AAC002 in varchar2,241 PO_FHZ out varchar2,242 PO_MSG out varchar2);243/*统计社会保险参保情况查询 */244procedure tongji_shbx_old(PI_AAC001 in varchar2,245 PO_FHZ out varchar2,246 PO_MSG out varchar2);247248/*统计社会保险参保情况查询 2016081 */249procedure tongji_shbx(PI_AAC001 in varchar2,250 PO_FHZ out varchar2,251 PO_MSG out varchar2);252253/*批量赋权限,我⾃⼰的权限放在表 fw_operator2right_wyl_ 中 */254procedure prc_right(pi_loginid in varchar2,255 pi_loginid_other in varchar2,256 po_fhz out varchar2,257 po_msg out varchar2);258259/* 测试goto 的⽤法 */260procedure test_loop_go(pi_aab001 in number,261 po_fhz out varchar2,262 po_msg out varchar2);263/*264集合变量265*/266procedure record_practice(pi_aac001 in number,267 po_fhz out varchar2,268 po_msg out varchar2);269270End Pkg_Weiyl;271/272CREATE OR REPLACE Package Body Pkg_Weiyl Is273 c_Pkg_Name Constant Varchar2(20) :='PKG_WEIYL';274--修改险种275Procedure Updateaae140(Pi_Aac002 In Varchar2,276 Pi_Aae140 In Varchar2,277 Po_Fhz Out Varchar2,278 Po_Msg Out Varchar2) Is279 v_Count Number(2);280Begin281 Po_Fhz :='1';282 Po_Msg :='成功';283Select Count(*) Into v_Count From Sab11 Where Bcc347 = Pi_Aac002;284If v_Count >0Then285Update Ac02286Set Aac008 ='2'287Where Aae140 ='342'288And Aac001 = (Select Aac001289From Ac01290Where Aac002 = Pi_Aac002291And Aae140 = Pi_Aae140);292End If;293 Exception294When No_Data_Found Then295 Po_Fhz :='0';296 Po_Msg :='失败';297End Updateaae140;298299--修改⾝份证号300Procedure Updateidcard(Pi_Bae007 In Varchar2,301 Pi_Flag In Varchar2,302 Pi_Aac002 In Varchar2,303 Pi_Aac002_New In Varchar2,304 Pi_Aae013 In Varchar2,305 Pi_Aae011 In Varchar2,306 Pi_Bae001 In Varchar2,307 Po_Fhz Out Varchar2,308 Po_Msg Out Varchar2) Is309 v_Aac001 Ac02.Aac001%Type;310 v_Prc Varchar2(20);311 v_Aab001 Ac02.Aab001%Type;312 v_Yl_Count Number(2); --养⽼待遇记录数313 v_Msg Varchar2(200);314 v_Aaa076 Ac60.Aaa076%Type;315 v_Prcname Varchar2(200);316 v_Params Varchar2(500);317 v_Sqlerrm Varchar2(500);318 v_Aac003 Ac01.Aac003%Type;319 v_Aac002_Tmp Ac01.Aac002%Type;320Begin321-- 初始化返回值322 Po_Fhz :='1';323 Po_Msg :='';324 v_Prc :='.updateIDCard';325 v_Prcname := c_Pkg_Name || v_Prc;326 v_Params :=',传⼊参数为:pi_aac002='|| Pi_Aac002 ||',pi_aac002_new='||327 Pi_Aac002_New ||',pi_aae013='|| Pi_Aae013 ||328',pi_aae011='|| Pi_Aae011 ||',pi_bae001='|| Pi_Bae001;329Select Aac001, Aab001330Into v_Aac001, v_Aab001331From Ac01332Where Aac002 = Pi_Aac002;333-- 调⽤校验过程进⾏判断334 Validateidcard(v_Aac001, Pi_Aac002_New, Po_Fhz, Po_Msg);335If Po_Fhz <>'1'Then336Return;337End If;338339-- 先做是否有养⽼待遇的判断,如果有就直接返回,不更新ac01.aac002340Select Count(1) Into v_Yl_Count From Ac60 Where Aac001 = v_Aac001;341If v_Yl_Count >0Then342-- 如果有养⽼待遇,那么抛出更详细的结果,以便于前台更容易理解343-- 只取第⼀条344Select Aaa076345Into v_Aaa076346From Ac60347Where Aac001 = v_Aac001348And Rownum =1;349Select Func_Wyl('AAA076', v_Aaa076) Into v_Msg From Dual;350 Po_Fhz :='-2';351 Po_Msg := v_Prcname ||'执⾏失败,该⼈员存在养⽼待遇类型为 "'|| v_Msg || 352'" 的养⽼待遇,且待遇状态正常,因此不能更新⾝份证';353Return;354End If;359/*v_aac002_tmp := BXGX_SEQ_aac002_tmp.Nextval||substr(pi_aac002,7,length(pi_aac002)-6);*/ 360 v_Aac002_Tmp := Pi_Aac002_New;361Else362 v_Aac002_Tmp := Pi_Aac002_New;363End If;364Update Ac01 Set Aac002 = v_Aac002_Tmp Where Aac001 = v_Aac001;365 Exception366When Others Then367 v_Sqlerrm := Substr(Sqlerrm, 1, 9);368/* 捕获,唯⼀性约束冲突*/369If v_Sqlerrm ='ORA-00001'Then370Select Aac003371Into v_Aac003372From Ac01373Where Aac002 = Pi_Aac002_New;374 Po_Fhz := v_Prcname ||'_-3';375 Po_Msg :='系统⾥已经存在⾝份证为'|| Pi_Aac002_New ||'的参保⼈了,姓名:'||376 v_Aac003 ||',因此不能修改';377 Elsif v_Sqlerrm <>'ORA-00001'Then378/*SQLERRM=ORA-00001*/379/*没法成功捕捉到sqlerrm*/380 Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);381 Po_Fhz := v_Prcname ||'_94';382End If;383384--po_msg := pkg_fun.F_ERRMSG(v_prcName,sqlcode,sqlerrm,v_params);385--po_fhz := v_prcName||'_91';386Return;387End;388Insert Into Ac25389 (Aaz163,390 Bae001,391 Aab001,392 Aac001,393 Cae129,394 Aac050,395 Aae160,396 Cac038,397 Bae007,398 Aae011,399 Aae036,400 Bce326,401 Aae012,402 Bhe949,403 Cae030,404 Cae031,405 Aae013,406 Aac002,407 Aac002_New)408Values409 (Seq_Bxgx_Aaz163.Nextval, --使⽤原来的序列号410 Pi_Bae001,411 v_Aab001,412 v_Aac001,413 To_Char(Sysdate, 'yyyymm'),414'50', -- 50,变更类型为修改资料415'1933', -- 1933,变更原因, 其它416'',417/*seq_ac25_bae007.nextval,*/-- 业务流⽔号418 Pi_Bae007,419 Pi_Aae011,420 To_Char(Sysdate, 'yyyymmddhh24miss'),421'0',422'',423 To_Char(Sysdate, 'yyyymmddhh24miss'),424'',425'',426 Pi_Aae013,427 Pi_Aac002,428 v_Aac002_Tmp);429Update Ac01 Set Aac002 = Pi_Aac002 Where Aac002 = v_Aac002_Tmp;430 Exception431When No_Data_Found Then432-- Sqlcode, Sqlerrm433 Po_Fhz :='-1';434 Po_Msg :='过程'|| Pkg_Name || v_Prc ||'报错,ac01表⾥没有找到该⼈员';435End Updateidcard;436437Procedure Cancelupdate(Pi_Bae007 In Varchar2,438 Po_Fhz Out Varchar2,439 Po_Msg Out Varchar2) Is440 v_Aac002 Ac01.Aac002%Type;441 v_Aac002y Ac25.Aac002%Type;442Begin443-- 初始化返回值444445 Po_Fhz :='-1';446 Po_Msg :='退单失败';447Select a.Aac002_New448Into v_Aac002449From Ac25 a450Where a.Bae007 = Pi_Bae007;451Select a.Aac002 Into v_Aac002y From Ac25 a Where a.Bae007 = Pi_Bae007;452-- 更新复核标志453update ac25 set bce326 ='9'where bae007 = Pi_Bae007;454Begin455Update Ac01 Set Aac002 = v_Aac002y Where Aac002 = v_Aac002;456 Po_Fhz :='1';457 Po_Msg :='成功';458 Exception459When Others Then460 Po_Fhz :='-2';461 Po_Msg :='退单失败2';462End;463464End;465466Procedure Updateidfh(Pi_Bae007 In Varchar2,467 Pi_Aae012 In Varchar2,468 Po_Fhz Out Varchar2,469 Po_Msg Out Varchar2) Is470 v_aac002 ac01.aac002%type;471 v_cnt number(2);472Begin473-- 初始化返回值474 Po_Fhz :='-1';475 Po_Msg :='添加复核⼈';476Begin477Update Ac25482from ac01483where aac002 in484 (Select Aac002_New From Ac25 Where Bae007 = Pi_Bae007);485if v_cnt >0then486Select Aac002_New into v_aac002 From Ac25 Where Bae007 = Pi_Bae007;487 Po_Fhz :='-2';488 Po_Msg :='修改后的新⾝份证号'|| v_aac002 ||489',在新系统已经存在,请回退重新办理!pkg_weiyl.Updateidfh ,Pi_Bae007:'||490 Pi_Bae007 ||',Pi_Aae012:'|| Pi_Aae012;491return;492else493Update Ac01494Set Aac002 =495 (Select b.Aac002_New From Ac25 b Where Bae007 = Pi_Bae007)496Where Aac002 = (Select Aac002 From Ac25 Where Bae007 = Pi_Bae007);497end if;498499 Po_Fhz :='1';500 Po_Msg :='添加复核⼈成功';501End;502 Exception503When Others Then504 Po_Fhz :='-1';505 Po_Msg :='添加复核⼈失败,pkg_weiyl.Updateidfh ,Pi_Bae007:'|| Pi_Bae007 ||506',Pi_Aae012:'|| Pi_Aae012;507End Updateidfh;508--⾝份证校验,把医保局,信息中⼼提出的⾝份证修改的条件分出来,单独校验509--⾝份证校验,把医保局,信息中⼼提出的⾝份证修改的条件分出来,单独校验510Procedure Validateidcard(Pi_Aac001 In Number,511 Pi_Aac002_New In Varchar2,512 Po_Fhz Out Varchar2,513 Po_Msg Out Varchar2) Is514 v_Prcname Varchar2(200) := c_Pkg_Name ||'.validateIDCARD';515 v_Params Varchar2(500) :='pi_aac001='|| Pi_Aac001;516 v_Aae240 Skc81.Aae240%Type;517 v_Lc31_Count Number(2);518 v_Count_Skc81 Number(2);519 v_Aac002_Tmp Ac25.Aac002_New%Type;520 v_Count_Cardinfo Number(2);521 v_Count_Ac60 Number(2);522 v_Count_Kc21 Number(2);523/*function validate_aac002 return varchar2 is524 v_aac002_new ac25.aac002_new%type;525 v_aac002_after number(20);526 begin527 select a.aac002_new into v_aac002_new from ac25 a where a.aac001 = pi_aac001;528 v_aac002_after := to_number(v_aac002_new);529 return '1';530 exception531 when others then532 return '-1';533 end;*/534Begin535-- 初始化536 Po_Fhz :='1';537-- 对修改后的⾝份证进⾏校验,防⽌不是纯数字,长度已经在前台进⾏了校验538 Vali_Idcard_Lenandchar(Pi_Aac002_New, Po_Fhz, Po_Msg);539If Po_Fhz <>'1'Then540Return;541End If;542543-- 1 医保局提出的要求,如果skc81.aae240>0 ,余额⼤于0 就不让改⾝份证。
Oracle Exception 用法Oracle Exception 是处理数据库错误的机制。
它允许您在发生错误时编写自定义代码块。
创建 Exception使用CREATE EXCEPTION语句创建 exception:CREATE EXCEPTION my_exception;处理 Exception使用WHEN子句在错误发生时处理 exception:BEGIN-- 代码块EXCEPTIONWHEN my_exception THEN-- 错误处理代码END;引发 Exception可以使用RAISE语句引发 exception:RAISE my_exception;捕获 Exception使用PRAGMA EXCEPTION_INIT语句捕获 exception:PRAGMA EXCEPTION_INIT(my_exception, -20001);示例以下示例使用 exception 处理ORA-20001错误:DECLAREsalary NUMBER;BEGIN-- 代码块IF salary < 0 THENRAISE my_exception;END IF;EXCEPTIONWHEN my_exception THENDBMS_OUTPUT.PUT_LINE('Salary cannot be negative.');END;好处使用 exception 的好处包括:•提高代码的可读性: exception 使错误处理代码更易于阅读和理解。
•更好的错误处理: exception 允许您为特定的错误编写特定的处理代码。
•代码重用: exception 可以重用于不同的代码块中,从而节省时间和精力。
注意事项•exception 只能在 PL/SQL 块中使用。
•exception 应始终在代码块的末尾处理。
•如果 exception 未处理,Oracle 将回滚事务并产生错误。
pragma用法Pragma用法详解Pragma是一种指令,用于告诉编译器如何处理代码。
在C和C++中,Pragma指令通常用于控制编译器的优化行为、警告行为、对齐方式等。
本文将详细介绍Pragma的用法。
1.优化指令#pragma GCC optimize("O2") //开启O2优化#pragma GCC optimize("Ofast") //开启Ofast优化#pragma GCC optimize("Os") //开启Os优化#pragma GCC optimize("Og") //开启Og优化2.警告指令#pragma GCC diagnostic error "-Wformat" //将格式化警告转换为错误#pragma GCC diagnostic warning "-Wuninitialized" //将未初始化变量警告转换为警告#pragma GCC diagnostic ignored "-Wunused-variable" //忽略未使用变量警告3.对齐指令#pragma pack(1) //按1字节对齐#pragma pack(2) //按2字节对齐#pragma pack(4) //按4字节对齐4.循环展开指令#pragma GCC unroll 2 //展开2次循环#pragma GCC unroll 4 //展开4次循环#pragma GCC unroll 8 //展开8次循环5.函数属性指令#pragma GCC optimize("inline-functions") //将函数内联#pragma GCC optimize("no-inline-functions") //禁止函数内联#pragma GCC optimize("no-stack-protector") //禁用堆栈保护6.链接指令#pragma GCC visibility push(hidden) //隐藏符号#pragma GCC visibility pop //取消隐藏符号7.其他指令#pragma GCC poison printf //禁止使用printf函数#pragma GCC dependency "file.h" //指定依赖文件总结以上是Pragma指令的常见用法,可以根据需要选择使用。
pragma 语句
#pragma 是一种预处理指令,用于向编译器提供特定的指示或命令。
这种指令通常是与编译器和特定编译器相关的,不是标准的 C 或C++ 语法。
不同的编译器对 #pragma 的支持和功能也可能有所不同。
以下是一些常见的 #pragma 用法:
编译器选项:
#pragma GCC optimize("O3")
这个例子是告诉 GCC 编译器使用最高级别的优化。
不同的编译器可能有类似的指令,但具体的语法和选项可能会有所不同。
警告控制:
#pragma warning(disable: 1234)
这个例子是在Microsoft Visual C++ 编译器中用于禁用特定警告。
1234 是警告的编号。
循环展开:
#pragma unroll
用于告诉编译器尽量展开循环,这在一些图形学和科学计算的优化中可能有用。
标识命名空间:
#pragma once
这个例子是用于标识文件的头部,确保在编译时只包含一次,以防止头文件的多次包含。
需要注意的是,#pragma 的使用可能会使代码在不同的编译器上产生不同的行为。
它通常用于提供对编译器特定功能的访问,但在编写可移植代码时应该谨慎使用。
在大多数情况下,标准的 C 和 C++ 语法足以满足需求,而不需要使用 #pragma。
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 可以在独立的事务中执行。
pragmacomment的使⽤pragma预处理指令详解#pragma comment( comment-type [,"commentstring"] )该宏放置⼀个注释到对象⽂件或者可执⾏⽂件。
comment-type是⼀个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之⼀。
commentstring是⼀个提供为comment-type提供附加信息的字符串,Remarks:1、compiler:放置编译器的版本或者名字到⼀个对象⽂件,该选项是被linker忽略的。
2、exestr:在以后的版本将被取消。
3、lib:放置⼀个库搜索记录到对象⽂件中,这个类型应该是和commentstring(指定你要Liner搜索的lib的名称和路径)这个库的名字放在Object⽂件的默认库搜索记录的后⾯,linker搜索这个库就像你在命令⾏输⼊这个命令⼀样。
你可以在⼀个源⽂件中设置多个库记录,它们在object⽂件中的顺序和在源⽂件中的顺序⼀样。
如果默认库和附加库的次序是需要区别的,使⽤Z编译开关是防⽌默认库放到object模块。
4、linker:指定⼀个连接选项,这样就不⽤在命令⾏输⼊或者在开发环境中设置了。
只有下⾯的linker选项能被传给Linker./DEFAULTLIB/EXPORT/INCLUDE/MANIFESTDEPENDENCY/MERGE/SECTION(1)/DEFAULTLIB:library /DEFAULTLIB 选项将⼀个library添加到 LINK 在解析引⽤时搜索的库列表。
⽤ /DEFAULTLIB 指定的库在命令⾏上指定的库之后和 .obj ⽂件中指定的默认库之前被搜索。
忽略所有默认库 (/NODEFAULTLIB) 选项重写 /DEFAULTLIB:library。
如果在两者中指定了相同的 library 名称,忽略库(/NODEFAULTLIB:library) 选项将重写 /DEFAULTLIB:library。
本篇主要内容如下:5.1 异常处理概念5.1.1 预定义的异常处理5.1.2 非预定义的异常处理5.1.3 用户自定义的异常处理5.1.4 用户定义的异常处理5.2 异常错误传播5.2.1 在执行部分引发异常错误5.2.2 在声明部分引发异常错误5.3 异常错误处理编程5.4 在PL/SQL 中使用SQLCODE, SQLERRM异常处理函数即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。
一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。
任何ORACLE错误(报告为ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误),都可以。
当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前。
ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理。
5.1 异常处理概念异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行.有三种类型的异常错误:1.预定义( Predefined )错误ORACLE预定义的异常情况大约有24个。
对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。
2.非预定义( Predefined )错误即其他标准的ORACLE错误。
对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。
3.用户定义(User_define) 错误程序执行过程中,出现编程人员认为的非正常情况。
对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。
异常处理部分一般放在PL/SQL 程序体的后半部,结构为:EXCEPTIONWHEN first_exception THEN <code to handle fir st exception >WHEN second_exception THEN <code to handle se cond exception >WHEN OTHERS THEN <code to handle others exce ption >END;复制代码异常处理可以按任意次序排列,但OTHERS 必须放在最后.5.1.1 预定义的异常处理预定义说明的部分ORACLE 异常错误对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
Oracle存储过程异常处理1、异常的优点 如果没有异常,在程序中,应当检查每个命令的成功还是失败,如 BEGIN SELECT ... -- check for ’no data found’ error SELECT ... -- check for ’no data found’ error SELECT ... -- check for ’no data found’ error 这种实现的⽅法缺点在于错误处理没有与正常处理分开,可读性差,使⽤异常,可以⽅便处理错误,⽽且异常处理程序与正常的事务逻辑分开,提⾼了可读性,如 BEGIN SELECT ... SELECT ... SELECT ... ... EXCEPTION WHEN NO_DATA_FOUND THEN -- catches all ’no data found’ errors 2、异常的分类 有两种类型的异常,⼀种为内部异常,⼀种为⽤户⾃定义异常,内部异常是执⾏期间返回到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的错误,如除数为零或内存溢出的情况。
⽤户⾃定义异常由开发者显⽰定义,在PL/SQL块中传递信息以控制对于应⽤的错误处理。
每当PL/SQL违背了ORACLE原则或超越了系统依赖的原则就会隐式的产⽣内部异常。
因为每个ORACLE错误都有⼀个号码并且在PL/SQL中异常通过名字处理,ORACLE提供了预定义的内部异常。
如SELECT INTO 语句不返回⾏时产⽣的ORACLE异常NO_DATA_FOUND。
对于预定义异常,现将最常⽤的异常列举如下: exception oracle error sqlcode value condition no_data_found ora-01403 +100 select into 语句没有符合条件的记录返回 too_many_rows ora-01422 -1422 select into 语句符合条件的记录有多条返回 dup_val_on_index ora-00001 -1 对于数据库表中的某⼀列,该列已经被限制为唯⼀索引,程序试图存储两个重复的值 value_error ora-06502 -6502 在转换字符类型,截取或长度受限时,会发⽣该异常,如⼀个字符分配给⼀个变量,⽽该变量声明的长度⽐该字符短,就会引发该异常 storage_error ora-06500 -6500 内存溢出 zero_divide ora-01476 -1476 除数为零 case_not_found ora-06592 -6530 对于选择case语句,没有与之相匹配的条件,同时,也没有else语句捕获其他的条件 cursor_already_open ora-06511 -6511 程序试图打开⼀个已经打开的游标 timeout_on_resource ora-00051 -51 系统在等待某⼀资源,时间超时 如果要处理未命名的内部异常,必须使⽤OTHERS异常处理器或PRAGMA EXCEPTION_INIT 。
如何在Oracle触发器中使⽤查询语句通常情况下,Oracle数据库禁⽌在⾏级触发器或⾏级触发器所调⽤的⼦程序中使⽤查询语句。
但是,⾯对复杂的业务逻辑,不可避免的要使⽤查询语句。
当在⾏级触发器中使⽤查询语句时,Oracle数据库会抛出ORA-04091异常。
Oracle官⽅⽂档中对ORA-04091异常的说明如下:ORA-04091: table string.string is mutating, trigger/function may not see itCause: A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.如果必须要在Trigger中使⽤查询语句,Oracle也提供了⼀种途径。
下⾯以简单的代码为例做说明:1CREATE OR REPLACE TRIGGER TRG_TEST2 BEFORE INSERT OR UPDATE OR DELETE ON SCOTT.EMP3FOR EACH ROW -- ⾏级触发器4DECLARE5 PRAGMA AUTONOMOUS_TRANSACTION; -- 解决⾏级触发器不能使⽤查询语句的关键67 V_COUNT PLS_INTEGER;8BEGIN9SELECT COUNT(*) INTO V_COUNT FROM SCOTT.EMP;10IF V_COUNT >0THEN11-- DO SOMETHING12NULL;13END IF;1415COMMIT; -- 提交16 EXCEPTION17WHEN OTHERS THEN18ROLLBACK; -- 回滚19END TRG_TEST;如上⾯代码所⽰:在定义Trigger时,声明其事务的提交模式为PRAGMA AUTONOMOUS_TRANSACTION。
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 NUMBER
AS
PRAGMA INLINE(myfunction, 'YES');
BEGIN
-- 函数体
END;
Pragma EXCEPTION_INIT
•描述:为指定的异常定义错误代码。
•示例:
DECLARE
my_exception EXCEPTION;
PRAGMA EXCEPTION_INIT(my_exception, ;
BEGIN
-- 引发异常的代码
EXCEPTION
WHEN my_exception THEN
-- 异常处理代码
END;
Pragma RESTRICT_REFERENCES
•描述:将存储过程或函数的敏感度注释为单元规则,有助于优化器发现运行时的错误。
•示例:
CREATE OR REPLACE FUNCTION myfunction (arg NUMBER) RETURN NUMBER
RESTRICT_REFERENCES (myfunction, WNPS, RNDS, WNDS, RNPS)
AS
-- 函数体
END;
Pragma INLINE_SQL
•描述:告诉优化器在执行时使用内联SQL。
•示例:
PRAGMA INLINE_SQL ('ALTER TABLE table_name ADD (column_name NUMBER)');
Pragma EXCEPTION_HANDLER
•描述:在存储过程或函数中定义全局的异常处理器。
•示例:
CREATE OR REPLACE PROCEDURE myprocedure IS
PRAGMA EXCEPTION_HANDLER(myhandler);
BEGIN
-- 存储过程体
EXCEPTION
WHEN OTHERS THEN
myhandler;
END;
PROCEDURE myhandler
IS
BEGIN
-- 异常处理代码
END;
以上是一些常见的Oracle Pragma指令,通过使用它们,你可以更好地控制和优化你的查询性能。
在实际开发中,根据具体情况选择合适的Oracle Pragma指令将是非常有益的。
Pragma INLINE_SQL
•描述:通过使用Pragma INLINE_SQL指令,可以告诉优化器在执行时使用内联SQL。
内联SQL是将存储在代码中的
SQL语句直接插入到程序中,而不是作为独立的SQL命令执行。
这可以减少查询的开销并提高性能。
•示例:
PRAGMA INLINE_SQL ('ALTER TABLE table_name ADD (column_name NUMBER)');
Pragma EXCEPTION_HANDLER
•描述:通过使用Pragma EXCEPTION_HANDLER指令,可以在存储过程或函数中定义全局的异常处理器。
异常处理器会捕捉所有未被特定异常处理块捕捉的异常,并执行指定的异常处理代码。
•示例:
CREATE OR REPLACE PROCEDURE myprocedure IS
PRAGMA EXCEPTION_HANDLER(myhandler);
BEGIN
-- 存储过程体
EXCEPTION
WHEN OTHERS THEN
myhandler;
END;
PROCEDURE myhandler
IS
BEGIN
-- 异常处理代码
END;
以上是一些常用的Oracle Pragma指令示例,你可以根据具体的需求选择相应的指令来优化查询性能或控制数据库行为。
通过合理使用Oracle Pragma,你能够提高数据库的性能,并且更好地满足项目的需求。