oracledatabase11g,plsql编程实战笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Chap1DML语句是select、insert、update、delete和mergeDDL语句是create、alter、drop、rename、truncate、commentDCL语句是grant、revokeTCL语句是commit、rollback和savepointsql16个基本命令——参考书《OCA认证考试指南(IZ0-051)》清华大学出版社《oracledatabasesqllanguagereference11g》有非遵循格式字符串依赖于格式掩码chap22.1.3关于语句中有多个单引号时处理:1、select'It''sabird,noplancan''tbe'aspharsefromdual;此处两个单引号即为一个单引号2、只能用q再加’(语句)’selectq'(It'sabird,noplancan'tbe)'aspharsefromdual;均输出PHARSE----------------------------It'sabird,noplancan'tbe2.1.4定义变量与申明变量的区别:定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化)替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’declarelv_whomvarchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/beginlv_whom:='&a';end;或者declarelv_whomvarchar2(20);beginlv_whom:=&a;end;但是要在输入框中字符加两个单引号替代变量用define申明,且定义时不可以指定类型,默认为char型①Definex=emp;Select*from&x;/*调用要用&,此处不加单引号,解析后即为emp表*/②definex=adasd;select'&x'zfromdual;/*此处解析后变为select'adasd'zfromdual,此处必须要有单引号,使adasd作为直接变量,否则出错*/所以替代变量是否加单引号要根据解析的值来确定注意:避免在声明块中将任何实参赋给局部变量(constant变量除外),且替代变量与绑定变量都不应该在声明块中赋值定义为constant的变量,必须在申明块中申明,这意味着常量必须先定义,再给他赋一个不变的值绑定变量(bind)用var或variable申明使用冒号(:)作为前缀varanumberbegin:a:=22;end;上面也可以输出结果,下面也可以输出结果,但二者不能同时放一块printa;/*此处a前面不能加冒号,print可用来输出所有类型的变量*/另外也可通过exec直接给绑定变量赋值:SQLvarxnumber/*必须要先定义再赋值,而替代变量定义时不需指定类型,直接赋值即可*/SQLvarynumberSQLexec:x:=1;:y:=2;/*exec等价于begin…end*/PL/SQLproceduresuccessfullycompletedx---------1y---------2也可以先定义好绑定变量,再将其赋给其他变量:varanumberbegin:a:=22;end;现将其运行再declarelv_anumber;beginlv_a:=:a;dbms_output.put_line('hello,'||lv_a||'.');end;结果:hello,22.将上面的代码放入到d:\q.sql中用@d:\q.sql;调用即可,但是里面的代码要正确2.1.5命名块1、过程块createorreplaceprocedureabc(aavarchar2)isbegindbms_output.put_line('sdhl'||aa);end;execabc('dkjdhhdj');可能出现错误一:【ORA-00955:名称已由现有对象使用】这个错误说的不仅仅是有可能你有存储过程使用了【abc】,还有可能是你有表名叫【abc】或者其他oracle对象叫【abc】。说明:其实由于你已经使用了【createorrepalaceprocedure】即使有存储过程叫【abc】也会被覆盖掉,你用下面的命令查询一下,有什么对象叫【abc】,删掉它或者换一个存储过程名字。【SELECTOBJECT_NAME,OBJECT_TYPEFROMUSER_OBJECTSWHEREOBJECT_NAME='STUDENT2';】错误二:过程中的参数不能指定具体长度2、函数块错误一:函数里面要有return,不是dbms_output.put_line(但实验之后二者均可以成功创建函数,但是调用时只有return的能没有错误的执行)createorreplacefunctionabc(aavarchar2)returnvarchar2isbegindbms_output.put_line('sdhl'||aa);end;改为createorreplacefunctionabc(aavarchar2)returnvarchar2isbeginreturn'sdhl'||aa;end;但函数不能像过程一样来执行,因为execute命令不允许管理函数返回值。必须要用call或begindbms...end命令将返回值放入一个绑定变量(要先定义)中,在输出。(必须要先执行函数,在执行下面语句,不能一起运行)variableresultvarchar2(20);callabc('akdhak')into:result;--call后面只能用绑定变量?或者:SQLbegin2dbms_output.put_line(abc('du'));3end;4/sdhldu此处若用print则绑定变量不能加冒号只能为printresult;但可以查询select:resultfromdual;(exec是sqlplus的命令,只能在sqlplus中使用。call是sql命令,任何工具都可以使用)2.1.6嵌套块命名块还可以嵌套在其他命名块或匿名块中,但嵌套命名块并不是已经发布的,这意味着在调用一个命名块时,被调用的命名块可能还没有定义declareprocedureaisbegindbms_output.put_line(b||'hello!');/*此处b为被调用函数,但之前没有被解析,所以运行会出错*/enda;functionbreturnvarchar2isbeginreturn'hello!';endb;begina;end;注:所有匿名块都会在程序都会在实际执行前进行分析,分析是一个编译过程。分析过程将会识别标识符(保留字)、预定义标识符、引用标识符、用户定义变量、子例程或UDT。命名块也是标识符,PL/SQL按照自顶向下的次序,将标识符读取到内存中。上例中函数b因为在过程a的下面还没被解析,所以会出错。使用“前向引用”可以修正这个问题,函数或过程的前向引用只需要函数或过程的署名,不需要同时包括署名和实现,这些署名在PL/SQL中叫做“占位程序(stub)”。占位程序允许编译过程在实现命名块之前接受其标识符名称。更正:declareprocedurea;functionbreturnvarchar2;procedureaisbegindbms_output.put_line(b||'hello!');enda;functionbreturnvarchar2isbeginreturn'hello!';endb;begina;end;2.2变量:类型、赋值和运算符2.2.1文本数据类型用伪列来隐式地定义数据类型。伪列如%typeChar(20)为一个定长的类型,不管其中变量的长度有没有达到20,最后显示长度均为20字符Varchar2(20)则要根据实际情况来确定其长度Clob(characterlargeobject字符大对象)同varchar22.2.2日期和时间戳类型1、日期有两种字符串字面值赋值支持到date类型的隐式转换Lv_datedate:=’22-mon-75’;或者Lv_datedate:=’22-mon-1975’;除了上面两种,任何其他字符串字面值都要求使用to_date内置SQL函数来覆盖格式掩码如lv_date_1date:=to_date(‘19750430’,’YYYYMMDD’);2、间隔间隔子类型允许将天的间隔表示秒,将年的间隔表示月份数Intervaldaytosecond数据类型的默认值在两个date相减时能起作用,只要在执行减法之前将其转化为timestamp,因为to_timestamp函数保留了date的精度,而该精度低于timestamp将天的间隔转换为秒的数据类型为intervalday/day(4或其他数)toseconddeclarelv_intervalintervaldaytosecond;lv_end_daydate:=sysdate;---sysdate与date对应lv_start_daydate:='18-4月-2012';beginlv_interval:=to_timestamp(lv_end_day)-to_timestamp(lv_start_day);dbms_output.put_line(lv_interval);end;结果-2014:56:54.000000PL/SQLproceduresuccessfullycompletedDate数据类型默认支持2位数字表示的天,timestamp的精度要求使用9位数字表示的天或者declarelv_intervalintervalday(9)tosecond;lv_end_daytimestamp:=systimestamp;---systimestamp与timestamp对应lv_start_daytimestamp:='18-4月-2012';beginlv_interval:=lv_end_day-lv_start_day;dbms_output.put_line(lv_interval);end;结果-00000294302:52:41.860000PL/SQLproceduresuccessfullycompleted将年的间隔转化为月份数的数据类型为intervalyeartomonth从一个日期中提取年用to_char(extract(yearfromlv_end_day))完整代码:declarelv_adate:='20-4月-2009';avarchar2(12);begina:=to_char(extract(yearfromlv_a));dbms_output.put_line(a);end;结果为:20093、时间戳(timestamp)Timestamp数据类型精度要比date数据类型精度高2.2.3数值类型可以将number数据类型隐性转化为intger类型,可能会丢失一些小数点Binary_float32位浮点数Binary_double是一个64位浮点数2.2.4复合变量类型SQLUDT用于保存一个数据结构2.3控制结构1、If语句,ifelsifelse2、case语句分为简单的case语句case…when…then…else…endcase(break隐式存在)与搜索型的case语句casewhen…then…else…endcase简单case语句可使用char、nchar、varchar2数据类型,而搜索case语句可以使用任意布尔表达式,搜索case语句不局限于等值匹配2.3.3、循环结构Loop循环退出要借助exit或exitwhen语句Forloop循环:分为范围循环和游标循环插入:关于游标(见E:\sas\sql\各类知识要点\游标)A、范围循环即foriin1..4loopB、游标循环1、隐式foriin(select语句)loop2、显式foriincu

1 / 114
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功