版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle_PLSQL培训Oracle_PLSQL培训汉得信息技术有限公HANDEnterpriseSolutionsCompany1汉得公技术有限公司版权所PLSQL是Oracle公司在SQL基础上进行扩展而成的一种过程语言。PLSQL提供了典型的高级语言特性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具集中。与C#相比PLSQL是Oracle公司在SQL基础上进行扩展而成的一种过程语言。PLSQL提供了典型的高级语言特性,包括封装,例外处理机制,信息隐藏,面向对象等;并把最新的编程思想带到了数据库服务器和工具集中。与C#相比,PLSQL的优势是:SQL语言可以直接写到PLSQL的“块”中或者是PLSQL的过程ava那样先创建Statemet对象来执行SQ;言,即:使用SQL来处理数据,使用控制结构来处理业务逻辑。这使得PLSQL成为很强大的事务处理PL/SQLSQLstatementOraclePLSQL在数据库服务器(在存储过程、函数、数据库触发器,Package包中使用)和Oracle开(包含使用PLSQL写的过程和函数,扩展名为PL的文件);SQ数据类型也可以在PLSQL中使用,结合SQPLSQ和Oracle的数据库字典。PLSQ消除了存取数据库的便利性与过程语言之间的障碍。汉得公司版权所有PLSQL概PLSQL的另一个显著好处在于它可以通过减少来回交PLSQL的另一个显著好处在于它可以通过减少来回交互减轻网络流量压力、节省时间OtherENDIF;3汉得公版权PLSQL概PLSQL是一种类PASCAL语言,每一段程序都是由组成的使用分号PLSQL是一种类PASCAL语言,每一段程序都是由组成的使用分号作为一句或者PLSQL语句的结束;块结构关键字后面跟分号;END后面需带分号;你可以把一句SQL语句写在一行上,但一般不建议这么做,因为代码不够漂亮WHENexception_name4汉得公司版权所有DECLAREVariables,cursors,user-definedBEGINSQLPL/SQLEXCEPTIONActionstoperformwhenerrorsEND;PLSQL的块概PLSQL的块包括三种:匿名块、存储过程、函数PLSQL的块包括三种:匿名块、存储过程、函数5汉得公版权FUNCTIONnameRETURNPLSQL的块概PLSQL的变量类型1、系统内置的常规简单变量类PLSQL的变量类型1、系统内置的常规简单变量类型2、用户自定义复杂变量类型比如记录类型3、引用类型:保存了一个指针值4、大对象类型LOB):保存了一个指向大对象的地址SQLPLUS变PLSQL本身没有输入输出功能,如果要像命令行运行C程序那样可以接收输入值,那你必须依赖执行环值传给PLSQL块,比iSQLPlus执行环境或者PLSQLDeveloper的CommandWindow执行环境中,有一种substitution变量可以用来接收输入值;而另一种Host变量可以把运行时的值传出到执行环境中。6汉得公版权PLSQL变PLSQL的变量类型举例日期类25-JAN-布尔类BLOB类“FourscoreandPLSQL的变量类型举例日期类25-JAN-布尔类BLOB类“Fourscoreandsevenyearsourfathersbroughtforthupon thiscontinent,anewnation,conceivedinLIBERTY,andtothepropositionthatallmenarecreatedequal.”LONG类数值类字符串类BFILE类7汉得公司版权所有PLSQL变PLSQL的变量声明语法举例说明1、变PLSQL的变量声明语法举例说明1、变量命名建议遵循通用规则,比如表示一个变量,c_name表示一个常量2、一般建议每一行声明一个变量,这样程序的可读性比较好3、如果声明了变量,但未进行初始化,则在没有赋值之前该变量的值为变量进行初始化赋值一个好的编程习惯是对所有声8汉得公司版权所有 NUMBER(2)NOTNULL:= VARCHAR2(13):='Atlanta'; CONSTANTNUMBER:=1400;identifier[CONSTANT]datatype[NOTNULL][:=|DEFAULTexpr];PLSQL变说明4、在同一个块中,说明4、在同一个块中,避免命名与数据库表中的字段名相同的变量9汉得公司版权所有employee_idNUMBER(6); PLSQL变常规类型的变量声明举例PLSQL特有的常规类型的变量声明举例PLSQL特有的%TYPE属性来声明与XX类型一致的变量类型语法举例汉得公司版权所有 v_balance%TYPE:=10; BINARY_INTEGER:= NUMBER(9,2):= DATE:=SYSDATE+7; CONSTANTNUMBER(3,2):=8.25; BOOLEANNOTNULL:=TRUE;PLSQL变可绑定变量也称为HostVariable,非PLSQL变量可绑定变量是一种可绑定变量也称为HostVariable,非PLSQL变量可绑定变量是一种在缩主环境中定义的变量,所谓缩主环境一般指示SQLPLUS执行环境或者PLSQL 的 Window执行环境;可绑定变量可用于在运行时把值传递给创建语法VARIABLEreturn_codeVARIABLE大家注意,在标准的PLSQLS执行环境中有效,可使用T语句输出变量内容。在PLSQL中使用这种变量时,前面加以示区分汉得公司版权所有 employee_id=178;/PRINTPLSQL变DBMS_OUTPUT.PUT_LINE()介绍在接下来的实验中,经常需要DBMS_OUTPUT.PUT_LINE()介绍在接下来的实验中,经常需要在调试程序时输出中间变量的值,我们可使用内置的Package中的函数上述例子中,我们使用 输出变量v_sal的值解释&p_annual_sal在PlsqlDeveloper的SQLwindow执行环境中,可用于提示用户输入一个具体注意:在SQLPLUS中执行DBMS_OUTPUT.PUT_LINE前,必须先执行SETSERVEROUTPUTON,而在PLSQLDeveloper的SQLWindow中则不需要这句话汉得公司版权所有v_salNUMBER(9,2):=&p_annual_sal;v_sal:=DBMS_OUTPUT.PUT_LINE('Themonthlysalaryis'PLSQL变PLSQL中的注释语句1、多行注释类似于javaPLSQL中的注释语句1、多行注释类似于javaC使和2、单行注释是在语句后面使–举例汉得公版权v_salNUMBER(9,2);/*Computetheannualsalarybasedonthemonthlysalaryinputfromtheuser*/v_sal:=:g_monthly_sal* --ThisistheendofthePLSQL变SQL函数在PLSQL的过程语句中的使用SQL函数在PLSQL的过程语句中的使用哪些可以用?哪些不可以用大多数SQL函数都可以PLSQL的过程语句中使用,比如函数等但有些函数在PLSQL的过程语句中是不能使用的,比如Decode函数、分组函数(AVG,MIN,MAX,COUNT,SUM,STDDEV,andVARIANCE)等汉得公司版权所有PLSQL变块嵌套和变量范围PLSQL的块是可以块嵌套和变量范围PLSQL的块是可以嵌套的,变量的作用范围与其他语言类汉得公司版权所有xBINARY_INTEGER;yNUMBER;y:=ScopeofScopeofPLSQL变假设我假设我们在块嵌套的程序中,里层和外层有相同的变量声明,而里层的程序要访问外层的同名变答案是:使用块限定词,请看例子这个例子中 是同名变量,限定outer.birthdate这种格式 表示外层,里层要访问外层的bithdate时使汉得公司版权所有TO_DATE('03-AUG-'DD-MON-PLSQL变课堂练习12告诉我如下答案课堂练习12告诉我如下答案ThevalueofThevalueofThevalueofThevalueofThevalueofThevalueV_MESSAGEatposition1.V_TOTAL_COMPatposition2.V_COMMatposition1.outer.V_COMMatposition1.V_COMMatposition2.atposition汉得公司版权所有 NUMBER(7,2):= NUMBER(7,2):=v_sal*v_messageVARCHAR2(255):='eligibleforcommission'; NUMBER(7,2):= NUMBER(7,2):= NUMBER(7,2):=v_sal+v_message:='CLERKnot'||v_message;outer.v_comm:=v_sal*0.30;v_message:=PLSQL变PLSQL代码美化使用Developer中功能PLSQL代码美化使用Developer中功能操作:选中欲美化的代码,点上面的Beautifier”按钮即可,注意有时代码有语法错误的时候该功 无效,所以最好先编译通过再美化 汉得公司版权所有PLSQL变语句用于把从数据库查询出内容存入变SETSERVEROUTPUT语句用于把从数据库查询出内容存入变SETSERVEROUTPUTNUMBERNOTNULL:=SELECT--group=('Thesumsalaryis'果Where条件控制不好,导致多行查/汉得公司版权所有 hire_date,salary employee_id=/PLSQL中的SQL语INSERT、UPDATE、DELETE、MERGE语句:在INSERT、UPDATE、DELETE、MERGE语句:在PLSQL中执行这些SQL语句和直接执行这些语句差不多,汉得公版权 employees.salary%TYPE:=800;UPDATE salary=salary+v_sal_increaseWHEREjob_id='ST_CLERK';/INSERTINTO(employee_id,first_name,last_name,email,hire_date,job_id,salary)(employees_seq.NEXTVAL,'Ruth','Cores','RCORES',sysdate,'AD_ASST',4000);/PLSQL中的SQL语汉得公司版权所有v_empnoemployees.employee_id%TYPE汉得公司版权所有v_empnoemployees.employee_id%TYPE:=MERGEINTOcopy_empcUSINGemployeeseON(e.employee_id=v_empno)WHENMATCHEDTHENUPDATE =e.first_name, =e.last_name, =..WHENNOTMATCHEDINSERTVALUES(e.employee_id,e.first_name,.. employees.department_id%TYPE:=10;DELETE department_id=v_deptno;/PLSQL中的SQL语和其他语言一样,控制主要包和其他语言一样,控制主要包括判断和循环判断语句的语法与其他语言类似需要注意的是对NULL的判断处理汉得公司版权所有CASEWHENexpression1THENresult1WHENexpression2THENWHENexpressionNTHENresultN[ELSEresultN+1;]IFcondition[ELSIFconditionENDIF;PLSQL中的控制语需要注意的是对NULL的判断处理:一般人容易犯错误或者不容易记需要注意的是对NULL的判断处理:一般人容易犯错误或者不容易记汉得公司版权所有TRUEFALSE TRUEFALSETRUETRUETRUEFALSETRUEFALSENULL NULLPLSQL中的控制语循环语句的语法与其他语言类似循环语句的语法与其他语言类似:有基本循环、For循环、Wihle循环三汉得公司版权所有FORcounterINlower_bound..upper_bound..ENDWHILEcondition Condition evaluatedat beginning.. eachEND..EXIT[WHENcondition];ENDLOOP;PLSQL中的控制语举例请把它改写成标准举例请把它改写成标准循环、While循汉得公司版权所有 locations.country_id%TYPE:='CA'; locations.city%TYPE:='Montreal';SELECTMAX(location_id)INTOFROMWHEREcountry_id=v_country_id;FORiIN1..3LOOPINSERTINTOlocations(location_id,city,country_id)VALUES((v_location_id+i),v_city,v_country_id);/PLSQL中的控制语嵌套循环和Label嵌套循环和Label一般用不着,只有在使用goto语句,或者内部循环需要访问外部的同名变量的时候才需要,而一般这种做法也是不被提倡的。汉得公司版权所有v_counter:=v_counter+1;EXITWHENv_counter>10;EXITOuter_loopWHENtotal_done=--LeavebothEXITWHENinner_done=--LeaveinnerloopENDLOOPENDLOOPOuter_loop;PLSQL中的控制语概述:PLSQL中常用的自定义类型就两种记录类型概述:PLSQL中常用的自定义类型就两种记录类型、PLSQL内存表类型(根据表中的数据字段的简单和复杂度又可分别实现类似于简单数组和记录数组的功能记录类型的定义语法这里的的具体格式可以是举例汉得公版权所有TYPEemp_record_typeISRECORD field_name{field_type||table.column%TYPE|[[NOTNULL]{:=|DEFAULT}TYPEtype_nameIS(field_declaration[, PLSQL中的复杂自定义数据类%ROWTYPE属性:在PLSQL中%ROWTYPE表示某张表的%ROWTYPE属性:在PLSQL中%ROWTYPE表示某张表的记录类型或者是用户指定以的记录类型,使用此*….的语句使用举例汉得公司版权所有 SELECT*INTOemp_recFROMemployeesWHEREemployee_id=INSERTINTOretired_emps(empno,ename,job,mgr,leavedate,sal,comm,VALUES(emp_rec.employee_id,emp_rec.last_name,emp_rec.job_id,emp_rec.manager_id,emp_rec.hire_date,SYSDATE,emp_rec.salary,emp_mission_pct,emp_rec.department_id);/PLSQL中的复杂自定义数据类PLSQL内存表即IndexByTable这种结构类似于PLSQL内存表即IndexByTable这种结构类似于数组,使用主键提供类似于数组那样的素访问这种类型必须包括两部分:1、使类型构成的索引主键2、另外一个简单类或者用户自定义类型的字段作为具体的数组元素 这种类型可以自动增长,所以也类似于可变长数组语法举例:这是一个简单数汉得公司版权所有TYPEename_table_typeISTABLEINDEXBYename_tableTYPEtype_nameISTABLE{column_type||table.column%TYPE}[NOT|[INDEXBY PLSQL中的复杂自定义数据类PLSQL内存表应用举例下面定PLSQL内存表应用举例下面定义的两个内存表中的元素都是简单数据类型,所以相当于定义了两个简单数组备注:对PLSQ这种数据类型的值在-21474836472147483647范围内,所以下表也可以在这个范围内。汉得公司版权所有TYPEename_table_typeISTABLEOFINDEXBYBINARY_INTEGER;TYPEhiredate_table_typeISTABLEOFDATEINDEXBYBINARY_INTEGER; :='CAMERON';hiredate_table(8):=SYSDATE+7;IFename_table.EXISTS(1)THENINSERTINTO.../PLSQL中的复杂自定义数据类PLSQL内存表应用举例下面PLSQL内存表应用举例下面定义的两个内存表中的元素记录类型,所以相当于定义了真正的内存表汉得公司版权所有TYPEemp_table_typeistableofemployees%ROWTYPEINDEXBYBINARY_INTEGER;my_emp_tableemp_table_type; FORiIN100..v_countSELECT*INTOmy_emp_table(i)FROMemployeesWHEREemployee_id=i;ENDFORiINmy_emp_table.FIRST..my_emp_table.LASTENDLOOP;PLSQL中的复杂自定义数据类游标概论:游标是一个私有的游标概论:游标是一个私有的SQL工作区域,Oracle数据库中有两种游标,分别是隐式游标和显式游标隐式游标不易被用户和程序员察觉和意识到,实际上OracleSQL语句;隐式游标的几个有用属性举例汉得公司版权所有VARIABLErows_deletedVARCHAR2(30)v_employee_idemployees.employee_id%TYPE:=176;DELETEFROM employee_id=:rows_deleted:=(SQL%ROWCOUNT'row/PRINT 受最近的SQL语句影响的行 最近的SQL语句是否影响了一行以上的数 最近的SQL语句是否未影响任何数 对于隐式游标而言永远为PLSQL中的游显式游标:对于返回多行结果的SQL语句的返回结显式游标:对于返回多行结果的SQL语句的返回结果,可使用显式游标独立的处理器中每一行的数据Active 显式游标的相关函数可以做到1、一行一行的处理返回的数据2、保持当前处理行的一个跟踪,像一个指针一样指示当前的处理的记录3、允许程序员在PLSQL块中人为的控制游标的开启、关闭、上下移动汉得公司版权所有 KochharDeHaan Patel PLSQL中的游在程序中对显式游标控制的一般过程•••••在程序中对显式游标控制的一般过程•••••声明游打开游测试行的关闭游•汉得公司版权所有PLSQL中的游举例CURSORemp_cursoremployee_id,声明游打开游OPENFETCHemp_cursorINTO提举例CURSORemp_cursoremployee_id,声明游打开游OPENFETCHemp_cursorINTO提取当前行到变EXITWHENemp_cursor%ROWCOUNT>10测试行存||''||ENDCLOSE关闭游END汉得公司版权所有PLSQL中的游如果你觉得像前面那个例子那样对一个游标的遍历很麻烦的话,可以考虑使用ForFor循环省去了游标的声明、打开、提取、测试、关闭等语句,对程序员来说很方便,语法如下:举例也可以如果你觉得像前面那个例子那样对一个游标的遍历很麻烦的话,可以考虑使用ForFor循环省去了游标的声明、打开、提取、测试、关闭等语句,对程序员来说很方便,语法如下:举例也可以汉得公司版权所有FORemp_recordIN(SELECTlast_name, employees)--implicitopenandimplicitfetchoccurIFemp_record.department_id=80THENENDLOOP;--implicitcloseoccursFORrecord_nameINcursor_name..ENDPLSQL中的游举例思考:在什么情况下举例思考:在什么情况下适用于使用举例,在哪些情况下适用于举例?汉得公司版权所有CURSORemp_cursorSELECTlast_name,department_id FORemp_recordINemp_cursor--implicitopenandimplicitfetchoccurIFemp_record.department_id=80THENENDLOOP;--implicitcloseoccurs/PLSQL中的游游标能否带有参数?答案是肯游标能否带有参数?答案是肯定的举例汉得公司版权所有CURSOR(p_deptnoNUMBER,p_jobVARCHAR2)ISSELECTemployee_id,last_name WHEREdepartment_id=p_deptno job_id=p_job;OPENemp_cursor(80,..CLOSEOPENemp_cursor(60,..CURSOR[(parameter_namedatatype,PLSQL中的游FORET语句:有的时候我们打开一个游标是为了更新或者删除一些记录,这种情况下我们希望rFORET语句:有的时候我们打开一个游标是为了更新或者删除一些记录,这种情况下我们希望re举例汉得公司版权所有CURSORemp_cursorSELECTemployee_id,last_name,department_name WHEREemployees.department_id=ANDemployees.department_id=80FORUPDATEOFsalaryNOWAIT; FORUPDATE[OFWHERECURRENTOFcursor:我们经常WHERECURRENTOFcursor:我们经常要逐条处理游标中的每一条记录,在循环体内做Update或者时需要有Where指向游标的当前记录有没有简单一点的的Where条件写法呢答案是肯定的,就是。。汉得公司版权所有CURSORsal_cursorSELECTe.department_id,employee_id,last_name,salary employeese,departmentsdWHEREd.department_id=e.department_id d.department_id=60FORUPDATEOFsalaryNOWAIT;FORemp_recordINsal_cursorIFemp_record.salary<5000THENUPDATEemployeesSETsalary=emp_record.salary*1.10WHERECURRENTOFsal_cursor;ENDIF;ENDLOOP;/PLSQL中的游PLSQL中的例外一般有两种1、 内部错误抛出的例外:这又分为预定义例外(PLSQL中的例外一般有两种1、 内部错误抛出的例外:这又分为预定义例外(有错误号+常量定义)和非预定义例(仅有错误号,无常量定义2、程序员显式的抛出的例PLSQ外层(外层BOCK或者外层调用者函数)例外捕例外传例外被抛例外被抛例外被捕-结例外未被例外被传递到调用者汉得公司版权所有PLSQL中的例外处PLSQL中的例外处理的一般语PLSQL中的例外处理的一般语法汉得公司版权所有WHENexception1[ORexception2...]..[WHENexception3[ORexception4...]..[WHENOTHERS..PLSQL中的例外处处理预定义的例外:有些常见例外处理预定义的例外:有些常见例外NO_DATA_FOUND和TOO_MANY_ROWS是最常见的例外,大多数Block中都建议对这两种例外有处理整的预定义例外的列表,请参考PL/SQLUser’sGuideandReference,“ErrorHandling.”(百度搜索,下载点很多)都已经预定义好了,使用时无需预先声明,比如...WHENWHENWHENOTHERSTHEN这两例外总要考OTHERS总在最汉得公司版权所有PLSQL中的例外处OTHERS的处理Others表明我们程序员未能预计到这种错误,所OTHERS的处理Others表明我们程序员未能预计到这种错误,所以全部归入到 里面去了,单发生这种况是,我们还是希望了解当时发生的Oracle错误号和相关描述信息,怎样才能取到呢和错误号和错误描提供了两个内置函分别用来返回汉得公司版权所有 WHENOTHERSTHENv_error_code:=INSERTINTOVALUES(v_error_code,SQLCODESQLERRMPLSQL中的例外处处理非预定义的Oracle错误:此类错误属于Oracle声明部例外处理部声处理例使用PRAGMA把错误号和例外名称联系处理非预定义的Oracle错误:此类错误属于Oracle声明部例外处理部声处理例使用PRAGMA把错误号和例外名称联系起给例外命处理抛出的汉得公司版权所有建立关PLSQL中的例外处举例123Oracle内部错误号很多,想了解全部的Ora举例123Oracle内部错误号很多,想了解全部的Ora错误号,请参考:http://www.ora-汉得公司版权所有DEFINEp_deptno=10DELETEFROMWHEREdepartment_id=&p_deptno; DBMS_OUTPUT.PUT_LINE('Cannotremovedept'||TO_CHAR(&p_deptno)||'.Employeesexist.e_emps_remainingPRAGMA(e_emps_remaining,-PLSQL中的例外处这种错误一般是程序员根据具体的业务逻辑定义的应用类错误,需要先声明后使用给例外命名使用RAISE语句显式的抛例外处理抛出的例外汉得公司版权所有例外处理部处理例程序执行部抛出例声明部声PLSQL中的例外处举123汉得公司版权所有 department_name=&p_department_desc举123汉得公司版权所有 department_name=&p_department_desc department_id=&p_department_number;IFSQL%NOTFOUNDTHENENDIF; DBMS_OUTPUT.PUT_LINE('NosuchdepartmentPLSQL中的例外处函数:对于用户自定义的业务错误函数:对于用户自定义的业务错误,如果觉得先定义再使用很麻烦,那也可以简单的使用raise_application_error()来简化处理。它可以无需预先定义错误,而在需要抛出错误的举例:执行部例外处理部分汉得公司版权所有WHENNO_DATA_FOUNDRAISE_APPLICATION_ERROR(-'ManagerisnotavalidDELETEFROMWHEREmanager_id=v_mgr;IFSQL%NOTFOUNDTHENRAISE_APPLICATION_ERROR(-'Thisisnotavalidmanager');ENDIF;PLSQL中的例外处例外传递:当前块中不处理,传递到外层..例外传递:当前块中不处理,传递到外层..PRAGMAEXCEPTION_INIT-FORc_recordINSELECTUPDATE子块可以直接把例外处理掉,也可以不处理,把它扔到外层IFENDIF;e_integrityTHENe_no_rowsTHEN汉得公司版权所有PLSQL中的例外处语法举例汉得公司版权所有CREATE语法举例汉得公司版权所有CREATEORREPLACEPROCEDUREraise_salary(p_idINemployees.employee_id%TYPE)UPDATE salary=salary*1.10WHEREemployee_id=p_id;END/CREATE[ORREPLACE]PROCEDURE[(parameter1[mode1]datatype1,parameter2[mode2]datatype2,...)]PL/SQLPLSQL中的存储过程和函使用开发存储过程File->New-使用开发存储过程File->New-Window-汉得公司版权所有PLSQL中的存储过程和函PLSQL存储过程的参数模式INparameterINOUTIN默认模必须显式必须显式用PLSQL存储过程的参数模式INparameterINOUTIN默认模必须显式必须显式用以把值传给过必须是个必须是个变量可以赋予默认不能赋予默认不能赋予默认汉得公版权所有PLSQL中的存储过程和函举例汉得公司版权所有CREATEOR举例汉得公司版权所有CREATEORREPLACEPROCEDUREformat_phone(p_phone_noINOUTVARCHAR2)p_phone_no:='('||SUBSTR(p_phone_no,1,3)')'||SUBSTR(p_phone_no,4,3)||'-'||SUBSTR(p_phone_no,7);END/CREATEORREPLACEPROCEDURE OUTemployees.last_name%TYPE,p_salaryOUTemployees.salary%TYPE, OUT last_name,salary,commission_pct p_name,p_salary,p_comm employee_id=p_id;ENDquery_emp;/PLSQL中的存储过程和函参数传递方(按顺序传使用=>符号传)或使用默认按顺序传参数传递方(按顺序传使用=>符号传)或使用默认按顺序传add_dept(p_loc=>/1200)SELECTdepartment_id,FROM汉得公司版权所有add_dept('TRAINING',add_dept(p_loc=>2400,p_nameCREATEORREPLACEPROCEDURE(p_nameIN INdepartments.location_id%TYPEDEFAULTINSERTINTOdepartments(department_id,department_name,VALUES(departments_seq.NEXTVAL,p_name,p_loc);ENDadd_dept;/PLSQL中的存储过程和函过程调用的例外处理被调用过调过程调用的例外处理被调用过调用过抛出例例外未被处汉得公司版权所有PROC1...ENDPROC2...ENDPLSQL中的存储过程和函删除储存过程汉得删除储存过程汉得公司版权所有DROPPROCEDUREPLSQL中的存储过程和函PLSQL存储函数CREATEORINPLSQL存储函数CREATEORINemployee_id=END/汉得公司版权所有CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter1[mode1]datatype1,..PL/SQLPLSQL中的存储过程和函使用开发函数汉使用开发函数汉得公司版权所有PLSQL中的存储过程和函哪些SQL语句中可以使用用户自定哪些SQL语句中可以使用用户自定义的函数Select语Where条件和Having子CONNECTBY,STARTWITH,INSERT的Values子UPDATE的Set子BY和BY子举例汉得公司版权所有SELECTemployee_id,tax(salary) WHEREtax(salary)>(SELECTMAX(tax(salary))FROMemployeesWHEREdepartment_id=30)ORDERBYtax(salary)DESC;PLSQL中的存储过程和函想要在SQL语句中可以使用用户自定义的函数想要在SQL语句中可以使用用户自定义的函数,那么这样的用户定义函数有哪些限制答有如下限制必须是个函数(不能是过程-只能用IN模式的参数(不能有OUT,INOUT模式的参数QPLSQL中特有的参数(比如记录、PLSQL函数返回的数据类型也必须是有效的数据类型,而不能是PLSQL特有的数据类型在SQ中使用的函数,其函数体内部不能有DM语句。在UPDATE/DELET在SQ(比如Commit,a汉得公司版权所有PLSQL中的存储过程和函反面教材举例汉得公司版权所有UPDATE反面教材举例汉得公司版权所有UPDATEemployeesSETsalary=dml_call_sql(2000)WHEREemployee_id=170;CREATEORREPLACEFUNCTIONdml_call_sql(p_salNUMBER)RETURNNUMBERISINSERTINTOemployees(employee_id,last_name,hire_date,job_id,salary)VALUES(1,'employee1','emp1@',RETURN(p_sal+100);/PLSQL中的存储过程和函删除储存函数汉得删除储存函数汉得公司版权所有DROPFUNCTIONPLSQL中的存储过程和函函数过程对数据访问的权限概念:定义者权和调用者权PERSON给Scott赋予Select权函数过程对数据访问的权限概念:定义者权和调用者权PERSON给Scott赋予Select权限Scott给Green赋予函数执行权限汉得公版权有权限问题吗GRANT GRANT PLSQL中的存储过程和函定义者权:函数执行时,对表定义者权:函数执行时,对表的访问默认使用定义者权限那么什么情况会使用调用者权限呢?这需要在写函数的时候有特殊语句标识大家想一下在这种情况下:Green执行函数有没有问题汉得公司版权所有CREATEPROCEDURE(p_idINemployees.employee_id%TYPE,p_nameOUTemployees.last_name%TYPE,p_salaryOUTemployees.salary%TYPE,p_commOUTmission_pct%TYPE)AUTHIDCURRENT_USERSELECTlast_name,salary,INTOp_name,p_salary,p_commFROMemployeesENDquery_emp;/PLSQL中的存储过程和函课堂测试Ora1用户创建测试表--(t_idnumber,t_name课堂测试Ora1用户创建测试表--(t_idnumber,t_nameOra2用户创建函数--CREATEorreplacefunctionreturnvarchar2v_namevarchar2(100);INTOv_nameFROMora1.testora_1WHEREt_id=p_id;returnv_name;returnNULL;END赋予系统权限--GRANTcreate,create,create,create,create,create,create,altersessionaltertableprimarykey(t_id);grantselectontestora_1to测试1:在Ora3用户下执行ora2.query_fun_test()函数;selectquery_fun_test(1)fromCURRENT_USER,然后再重复“测试grantexecuteonquery_fun_testto汉得公司版权所有PLSQL中的存储过程和函编译PLSQL程序:使用Developer集成编译PLSQL程序:使用Developer集成环境编译:方便注意在SQLWindow中执行函数或过程的定义,即使有编译错误,也不会显示;只有在ProgramWindow中执行函数或过程的定义的时候才会立即显示编译错误;汉得公司版权所有PLSQL中的存储过程和函Package概念:按照业务逻Package概念:按照业务逻辑、把相关的Func,Procedure组织到一起,形成一个函数或者过程集合,这就是汉得公司版权所有PLSQL中的包Package组成:Package由包说明Specification)和包体body)两部分构成包说部分相当于C语言里面的.H文件,包体部分相当C语言里面针对.H实现的C文件公有变公有过私有变Procedure私Package组成:Package由包说明Specification)和包体body)两部分构成包说部分相当于C语言里面的.H文件,包体部分相当C语言里面针对.H实现的C文件公有变公有过私有变Procedure私有过公有过局部变汉得公版权PLSQL中的包Package常用Package好处1、模块化:一Package常用Package好处1、模块化:一般把有相关性的函数和过程放到一个Package中23、信息隐藏:包体中函数可以部分出现在包说明中,只有出现在包说明中的函数和过程才是该Packae的公有函数和过程,可以被其他包中的函数调用,否则对其他包中的函数是不可见的,未在包说明部分出现的函数和过程相当于私有的。Package中其他函数被调用时,就直接从内存读取了,可以减少磁盘IO,从而提高性能。这个特性也提醒我们不要去搞巨无霸的把你用到的任函数都写到一个Package中,这会导致严重的内存浪费5、重载:一个中可以定义同名、不同参数的函数或过程汉得公司版权所有PLSQL中的包Package中的向前声明特性:在PackaePackage中的向前声明特性:在Packaebody中,一个函数中调用另一个函数(也在该Packae中),则另一个函数必须在前面先定义;如果你非要调用在程序代码中后定义的函数,可把这个函数设置成公有函数,在包说明部分说明;汉得公司版权所有CREATEORREPLACEPACKAGEBODYforward_packPROCEDUREaward_bonus(...)calc_rating(...); PROCEDUREcalc_rating(...)END/PLSQL中的包Package中的初始化过程代码Package中可以Package中的初始化过程代码Package中可以写一段初始化过程代码,这段代码只是一个Session中加载时被执行一次,一般用于一些复变量的初始化(比如某个公有变量的初始化值是需要通过一段负责的SQ来获取的);如果我们没有这样的初始化NUL;就可以了。汉得公司版权所有CREATEORREPLACEPACKAGEBODYtaxes...--declareallprivate...--definepublic/privateprocedures/functions rate_name='TAX';ENDtaxes;/CREATEORREPLACEPACKAGEtaxes ...--declareallpublicprocedures/functionsENDtaxes;/PLSQL中的包Package中的变量的持久状态Package中的变量的持久状态汉得公司版权所有CREATEORREPLACEPACKAGEBODYcomm_packageFUNCTIONvalidate_comm(p_commINNUMBER)RETURNBOOLEANISv_max_comm commission是否低于数据库表中的最大ommission,是则返回TRUEENDvalidate_comm;PROCEDUREreset_comm(p_comm INNUMBER)ISBEGIN validate_comm判断是否超出最大值,若是RAISE_APPLICATION_ERROR;否则设置g_commp_commENDreset_comm;END/CREATEORREPLACEPACKAGEcomm_packageISg_commNUMBER:=10; --初始化为10PROCEDUREreset_comm(p_comm END/PLSQL中的包时数据库用户数据库用户思时数据库用户数据库用户思考:Package中的公共变量,不同的Session是否会相互影响汉得公司版权所有INSERTINTOemployees(last_name,commission_pct)VALUES('Madonna',0.8);--max_comm=0.8>--g_comm=--max_comm=0.4>--g_comm=Selectcomm_package.g_commfromdual; --g_comm=?--max_comm=0.4<0.6PLSQL中的包动态SQL:不是在Time写的而是可以在运行时动态SQL:不是在Time写的而是可以在运行时临时拼接起来的SQL语句动态SQL可以使用语句来执行内置来执行,也可以使用执行例子汉得公司版权所有CREATEORREPLACEPROCEDUREdelete_all_rows(p_tab_nameINVARCHAR2,p_rows_delOUTNUMBER) cursor_name:=DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(cursor_name,'DELETEFROM'||p_tab_name,DBMS_SQL.NATIVEp_rows_del:=DBMS_SQL.EXECUTE(cursor_name);/内置PLSQL工具执行例子动态SQL实际应用例子执行例子动态SQL实际应用例子:POS基础数据同步并发程缺点汉得公司版权所有CREATEPROCEDUREdel_rows(p_table_nameINVARCHAR2, OUTEXECUTEIMMEDIATE'deletefrom'||p_table_name;p_rows_deld:=SQL%ROWCOUNT;/内置PLSQL工具程序中执行DDL:如果想在程序中执程序中执行DDL:如果想在程序中执行DDL,可使用内置包比如在程序中执行编译命令比如在程序中执行数据收集命令汉得公司版权所有内置PLSQL工具Oracle数据库JOB:定义可以定期执行某个程序应用场景:比如每隔一周对某些表进行数据收集,以确保Oracle数据库JOB:定义可以定期执行某个程序应用场景:比如每隔一周对某些表进行数据收集,以确保CBO正确,又比如在消息处理机制中,每隔5分钟对消息队列进行扫描处理等。Oracle提供内置DBMS_JOB,可完成JOB的定义、提交、更改、停止、移除例子:提交一个每隔1天执行一次例子:更改JOB的执行频率为:每4小时执行一DBMS_JOB.CHANGE(1,NULL,TRUNC(SYSDATE+1)+6/24,汉得公司版权所有DBMS_JOB.SUBMITjob=>jobnowhat=>next_date=>TRUNC(SYSDATE+1),interval=>'TRUNC(SYSDATE+1)'dbms_output.put_line(‘job_no=‘||jobno)内置PLSQL工具如何找到自己提交的JOB如何找到自己提交的JOB号汉得公司版权所有 FROM内置PLSQL工具PLSQL中读写外部文件提供内置包UTL_FILE来读写外PLSQL中读写外部文件提供内置包UTL_FILE来读写外部文件,其一般处理过程为还有更多需要处理我们来看个例子汉得公司版权所有把行写入文关闭文本文打开文本文从文件读取内置PLSQL工具应用举例汉得公司应用举例汉得公司版权所有CREATEORREPLACEPROCEDURE(p_filedirINVARCHAR2,p_filenameINVARCHAR2)CURSORemp_infoISSELECTlast_name,salary,department_idFROMemployeesORDERBYv_newdeptnoemployees.department_id%TYPE;v_olddeptnoemployees.department_id%TYPE:=0;v_filehandle:=UTL_FILE.FOPEN(p_filedir,p_filename,'w');UTL_FILE.PUTF(v_filehandle,'SALARYREPORT:GENERATEDON%s\n',UTL_FILE.NEW_LINEFORv_emp_recINemp_infoLOOPv_newdeptno:=v_emp_rec.department_id;内置PLSQL工具应用举例(续汉得应用举例(续汉得公司版权所有IFv_newdeptno<>v_olddeptnoUTL_FILE.PUTF(v_filehandle,'DEPARTMENT:ENDUTL_FILE.PUTF(v_filehandle,'EMPLOYEE:%searns:%s\n',v_emp_rec.last_name,v_emp_rec.salary);v_olddeptno:=v_newdeptno;ENDLOOP;UTL_FILE.PUT_LINE(v_filehandle,'***ENDOFREPORT***');UTL_FILE.FCLOSE(v_filehandle);WHENUTL_FILE.INVALID_FILEHANDLETHENRAISE_APPLICATION_ERROR(-20001,'InvalidFile.');WHENUTL_FILE.WRITE_ERRORRAISE_APPLICATION_ERROR(-20002,'UnabletowriteEND/内置PLSQL工具LOB概念回顾:大对象类型用于存储非结构LOB概念回顾:大对象类型用于存储非结构化的大数据,比如大文本、图片、电影、音乐“Fourscoreandsevenyearsagoourfathersbroughtforthuponthiscontinent,anewnation,conceivedinLIBERTY,anddedicatedtothepropositionthatallmenarecreatedOracle数据库里面的LOB有四种类型1、:字符大对象,存储在数据库内部2、NCLOB:多字节字符大对象,存储在数据库内部3、BLOB:二进制大对象,存储在数据库内部4、BFILE:二进制文件,存储在数据库外部汉得公司版权所有图文电PLSQL中大对象的操LONGLOB的区Long和Long是9i以前的版本使用的大对象类LONGLOB的区Long和Long是9i以前的版本使用的大对象类型;在9i以后都建议使9i也提供了一系列函数用以从LONG升级到OUT-of-的理解:LOB可以是对象类型的属性,而LONG不行汉得公司版权所有LONGandLONGSingleLONGcolumnperMultipleLOBcolumnsperUpto2Upto4Datastoredin-lineorout-of-SequentialaccesstoRandomaccesstoPLSQL中大对象的操LOB数据的存储方式:LOBValueLocator两LOB数据的存储方式:LOBValueLocator两部分,在我们的数据库表上的LOB字段,肯定会存储LOB的Locator;至于LOB的value,则要看其内外部类型和大小决定存储位置,默认情况下,内部LOB小于LOBLOB表上的LOB内部LOB的一般操作步骤为1、在表中添加LOB类型的2、在程序中声明和初始化LOB的SELECTFORUPDATE锁定目标行,准备更新行上的LOB列(LOB的3、使5、Commit提交更改;这样的PLSQL包,也可以使用OCI,JDBC等汉得公司版权所有PLSQL中大对象的操外部Bfile的操作Bfile是数据库外部外部Bfile的操作Bfile是数据库外部文件,在数据库表上这种类型的字段实际只是存储一个电Bfilee是数据库外部文件,是只读的,所以不参与事务操作;用户必须先创建文件并放到特定的目录下,给予进程以目录和文件的读取权限;在中删除Bfile这样的LOB数据的时候,它并没有实际的去删除对应的操作系统上的文件,实际文的删除是DBA,系统管理员的工作,Bfile的大小限制取决于操作系统,不受Oracle限制汉得公司版权所有PLSQL中大对象的操OracleDirectory:为了便于控制Bfile存储的安全性,Oracle数据库引入了OracleOracleDirectory:为了便于控制Bfile存储的安全性,Oracle数据库引入了OracleDirectory的在Oracle内部创建Directory默认的所有者是sys,并有DBA(或者是另一个拥ANYDIRECTORY权限的用户)创建对象可以像表那样给其他用户赋权使用Bfile的一般步骤3、在Oracle数据库中创建Directory对4、授权读权限给特定的数据库用5、往表中插入数据时使6、在程序中声明和初始化LOB的7、Select指定行上列到8、使DBMS_LOB或者通OCI读取Bfile使用Locator作为文件的一个引用汉得公司版权所有CREATEDIRECTORYdir_nameASos_path;ALTERTABLEemployeesADDemp_videoPLSQL中大对象的操使用Bfile的一般步骤使用Bfile的一般步骤3、在Oracle数据库中创建Directory对4、授权读权限给特定的数据库用5、往表中插入数据时使6、在程序中声明和初始化LOB的7、Select指定行上Bfile列到8、使DBMS_LOB或者通OCI读取Bfile使用Locator作为文件的一个引用汉得公司版权所有UPDATESETemp_video=WHEREemployee_id=FUNCTIONBFILENAME(directory_aliasINfilenameINRETURNGRANTREADONDIRECTORYdir_nameTOCREATEDIRECTORYdir_nameASos_path;ALTERTABLEemployeesADDemp_videoPLSQL中大对象的操举例汉得公司版权所有CREATE举例汉得公司版权所有CREATEORREPLACEPROCEDURE(p_file_locINVARCHAR2) v_filenameVARCHAR2(16);CURSORemp_cursorISSELECTfirst_nameFROMemployeesWHEREdepartment_id=60FORUPDATE;FORemp_recordINemp_cursorv_filename:=emp_record.first_name||'.bmp';v_file:=BFILENAME(p_file_loc,v_filename);UPDATEemployeesSETemp_video=v_fileWHERECURRENTOFemp_cursor;||'SIZE:'||DBMS_LOB.GETLENGTH(v_file));ENDEND/PLSQL中大对象的操使测试文件是否存在使测试文件是否存在汉得公司版权所有CREATEORREPLACEPROCEDUREload_emp_bfile(p_file_locINVARCHAR2) v_file_existsBOOLEAN;CURSORemp_cursorISFORemp_recordINemp_cursorv_filename:=emp_record.first_name||'.bmp';v_file:=BFILENAME(p_file_loc,v_filename);v_file_exists:=(DBMS_LOB.FILEEXISTS(v_file)=1);IFv_file_existsTHENDBMS_LOB.FILEOPEN(v_file);...PLSQL中大对象的操DBMS_LOB主要函数介绍1、更改LOB的值APPENDCOPYDBMS_LOB主要函数介绍1、更改LOB的值APPENDCOPYERASETRIMWRITE2、读取、检查LOB的值:GETLENGTH,INSTR,READ,3、Bfile专用:FILECLOSE,最常用的和Write介绍汉得公司版权所有PROCEDUREWRITElobdstINOUTBLOB|CLOB,amountINOUTBINARY_INTEGER,offsetININTEGER:=bufferINRAW|VARCHAR2)--RAWforPROCEDUREREADlobsrcINBFILE|BLOB|CLOB,amountINOUTBINARY_INTEGER,offsetININTEGER,bufferOUTRAW|VARCHAR2)PLSQL中大对象的操数据库表中LOB列的增删改(下面的例子中数据库表中LOB列的增删改(下面的例子中resume是CLOB类型,Picture是BLOB类型新增更新注意EMPTY_CLOB(),EMPTY_BLOB()跟NULL是不同的概念,ISNULL对这两种情况返回汉得公司版权所有UPDATESETresume='DateofBirth:1June1956'WHEREemployee_id=170;UPDATESETresume='DateofBirth:8February1951',picture=EMPTY_BLOB()WHEREemployee_id=INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary,resume,picture)VALUES(405,'Marvin','Ellis','MELLIS',SYSDATE,'AD_ASST',4000,EMPTY_CLOB(),NULL);PLSQL中大对象的操汉得公司版权所有loblocCLOB; --servesas汉得公司版权所有loblocCLOB; --servesastheLOBlocator VARCHAR2(32767):='Resigned:5August2000';amountNUMBER; --amounttobewrittenoffsetINTEGER; --wheretostartwritingSELECTresumeINTOlobloc WHEREemployee_id=405FORUPDATE;offset:=Damount:= :='Resigned:30September2000';SELECTresumeINTOlobloc WHEREemployee_id=170FORUPDATE;amount:=length(text);DBMS_LOB.WRITEAPPEND(lobloc,amount,DBMS_LOB.WRITE(lobloc,amount,offset,textBMS_LOB.GETLENGTH(lobloc)+PLSQL中大对象的操查询LOB内容截取常用函数汉得查询LOB内容截取常用函数汉得公司版权所有SELECTDBMS_LOB.SUBSTR(resume,5,18),DBMS_LOB.INSTR(resume,'=') WHEREemployee_idIN(170,DBMS_LOB.SUBSTR(lob_column,no_of_chars,starting)DBMS_LOB.INSTR(lob_column,pattern)SELECTemployee_id,last_name,resume--CLOBFROMemployeesWHEREemployee_idIN(405,PLSQL中大对象的操删除当我们删除一行的时候,该删除当我们删除一行的时候,该行上的内部LOB对象也被删除或语句,是LOB列汉得公司版权所有UPDATESETresume=EMPTY_CLOB()WHEREemployee_id=170;FROMWHEREemployee_id=PLSQL中大对象的操数据库触发器Trigger的概念对数据库对数据库触发器Trigger的概念对数据库对象的操作可引发很多事件,比如beforeInsert,beforeupdate等等,但这些事件产生的时候我实际应用场景举例:(从EBS的发运确认产生的生成POS收货确认单发运确TRANSACTIONID到表注意:除非迫不得已,尽量避免使用Trigger,因为这会导致维护困难汉得公司版权所有按规则挑录入销售订数据库触发举例INSERT.…汉得公举例INSERT.…汉得公司版权所有select*fromall_triggerswheretable_name数据库触发创建Trigger:Trigger的定义语创建Trigger:Trigger的定义语句里面涉及到如下关键因素时机:Before或者AfterInstead事件:InsertUpdate对象:表名(或视图名类型:Row或者Statement级;重点注意:Row级:SQL语句影响到的每一行都会引发Statement级:一句SQL语句引发一次,不管它影响多少行(甚至0行汉得公司版权所有数据库触发Trigger的触发顺序DML语Triggering动…BEFORErowtriggerAFTERrowtriggerTrigger的触发顺序DML语Triggering动…BEFORErowtriggerAFTERrowtriggerDML语BEFOREstatementTriggering动BEFORErowAFTERrowBEFORErowAFTERrowAFTERstatement汉得公司版权所有UPDATESETsalary=salary*1.1WHEREdepartment_id=INSERTINTOdepartmentsdepartment_name,location_id)VALUES(400,'CONSULTING',2400);数据库触发创建Statement级别语法举例:单一事件创建Statement级别语法举例:单一事件测试:把数据库服务器日期改成星期天,然后在Insert数据,看有什么效果汉得公司版权所有INSERTINTOemployees(employee_id,last_name,first_name,email,hire_date,VALUES(300,'Smith','Rob','RSMITH',SYSDATE,'IT_PROG',4500,60);CREATEORREPLACETRIGGERsecure_empBEFOREINSERTONemployeesIF(TO_CHAR(SYSDATE,'DY')IN('SAT','SUN'))OR(TO_CHAR(SYSDATE,'HH24:MI')NOTBETWEEN'08:00'AND'18:00')THENRAISE_APPLICATION_ERROR(-20500,'YoumayinsertintoEMPLOYEEStableonlyENDIF;/CREATE[ORREPLACE]TRIGGERtrigger_nameevent1[ORevent2OR数据库触发举例:多事件Trigger,在Body举例:多事件Trigger,在Body中判断具体事汉得公司版权所有CREATEORREPLACETRIGGERBEFOREINSERTORUPDATEORDELETEONemployeesIF(TO_CHAR(SYSDATE,'DY')IN('SAT','SUN'))OR(TO_CHAR(SYSDATE,'HH24')NOTBETWEEN'08'AND'18') DELETINGRAISE_APPLICATION_ERROR(-20502,'Youmaydelete tableonlyduringbusinessELSIFINSERTINGRAISE_APPLICATION_ERROR(-20500,'YoumayinsertintoEMPLOYEEStableonlyduringbusinesshours.'); UPDATING('SALARY')THENRAISE_APPLICATION_ERROR(-20503,'YoumayupdateSALARYonlyduringbusinessRAISE_APPLICATION_ERROR(-20504,'YoumayEMPLOYEEStableonlyduringnormalENDIF;数据库触发创建Row级别语法举例汉创建Row级别语法举例汉得公司版权所有CREATEORREPLACETRIGGERBEFOREINSERTORUPDATEOFsalaryONemployeesFOREACHROWIFNOT(:NEW.job_idIN('AD_PRES','AD_VP'))AND:NEW.salary>15000ENDIF;/CREATE[ORREPLACE]TRIGGERtrigger_nameevent1[ORevent2ORON[REFERENCINGOLDASold|NEWASnew]FOREACHROW数据库触发使用NEW修饰词和汉得使用NEW修饰词和汉得公司版权所有CREATEORREPLACETRIGGERaudit_emp_valuesAFTERDELETEORINSERTORUPDATEONemployeesFOREACHROWINSERTINTOaudit_emp_table(user_name,timestamp,id,old_last_name,new_last_name,old_title,new_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 洗车设备运输合同三篇
- 2025年四川省南充市高考地理一诊试卷
- 2021年云南省昭通市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年安徽省淮南市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2022年广东省潮州市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2022年广西壮族自治区防城港市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2024年吉林省松原市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 陕西省安康市(2024年-2025年小学六年级语文)统编版随堂测试(下学期)试卷及答案
- 2024年给皂液机项目投资申请报告代可行性研究报告
- 2025年中小型电动机项目规划申请报告
- 体育与健康课一年级(水平一)课时教案全册
- SAP-ABAP-实用培训教程
- 配电房施工组织设计方案(土建部分)
- 链条功率选用
- 国家开放大学电大专科《英语教学法》2023-2024期末试题及答案(试卷代号:2145)
- 年产30万吨合成氨脱碳工段工艺设计
- 管桩水平承载力计算
- 塑胶产品成型周期公式及计算
- 事业单位领导班子考核测评表
- LM-10Y液晶系列全自动振动时效使用说明书
- 中国药科大学有机化学期末试卷A
评论
0/150
提交评论