PL SQL笔记(三)
loop
if credit_rating < 3 then
..
exit;
end if;
end loop;
select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;
select cast(sysdate as timestamp) from dual;
复合类型数据
1.记录:
declare
type
emp_record_type
is record
(
r_name emp.ename%type,
r_job emp.job%type
);
emp_record emp_record_type;
begin
select t.ename, t.job into emp_record from emp t where t.empno = '';
dbms_output.put_line('ename = ' || emp_record.r_name || ', r_job = ' || emp_record.r_job);
end;
/
2.联合数组:
declare
type
emp_table_type
is table of
emp.ename%type
index by binary_integer;
emp_table emp_table_type;
begin
select ename into emp_table(0) from emp where empno = '';
dbms_output.put_line('ename = ' || emp_table(0));
end;
/
3.嵌套表:
嵌套表和联合数组类似,但嵌套表可以作为列的数据类型使用,而联合数组不能。
create or replace type item_type as object
(
t_username varchar2(20),
t_password varchar2(20),
t_age smallint
);
declare
type itemtable is table of item_type;
v_table itemtable := itemtable();
begin
v_table.extend;
v_table(v_table.last) := item_type('dys', 'dys123', 10);
end;
利用嵌套表当表列数据类型:
create or replace type itemtable is table of Item_Type;
create table TestTable
(
address varchar2(100),
phoneNumber varchar2(11),
itemList itemtable
)
nested table itemList store as itemList;
4.变长数组:
变长数组可以作为表列的数据类型或对象类型属性的数据类型,嵌套表长度没有限制,而变长数组长度有限制:
create or replace type idArray_Type as varray(100) of number; create or replace type item_type as object
(
v_itemCode char(10),
v_name varchar2(20)
); create or replace type itemArray as varray(10) of item_type; create table TestT
(
v_id number(8),
items itemArray
)
pl sql 基本结构:
declare
v_id number(8) := 10;
v_username varchar2(20);
begin
delete from A;
insert into A values(v_id, 'ding', 'ding123');
select username into v_username from A where id = v_id;
dbms_output.put_line('v_username = ' || v_username);
exception
when no_data_found then
dbms_output.put_line('no data');
end;
/
常量:
declare
PI constant number(9) := 3.1415926;
begin
commit;
end;
变量:
declare
age number(3) := 26;
begin
commit;
end;
其他类型:
emp.empno%type
emp%rowtype
分支:
if ... then
if sales > 10 then
compute_bonus(empid);
update payroll set pay = pay + bonus where empno = emp_id;
end if;
if .. then ... else
if trans_type = 'CR' then
update accounts set balance = balance + debit where ...
else
update accounts set balance = balance - debit wehre ...
end if;
if trans_type = 'CR' then
update accounts set balance = balance - debit where ...
else
if new_balance >= minimum_balance then
update accounts set balance = balance - debit where ...
else
raise insufficient_funds;
end if;
end if;
if .. then ...elsif
begin
if sales > 50000 then
bonus := 1500;
elsif sales > 35000 then
bonus := 500;
else
bonus := 100;
end if;
insert into payroll values(emp_id, bonus...);
end;
case语句:
case grade
when 'A' then
dbms_output.put_line('A');
when 'B' then
dbms_output.put_line('B');
else
dbms_output_put_line('wrong!');
end case;
搜寻式case语句:
case
when grade = 'A' then
dbms_output.put_line('A');
when grade = 'B' then
dbms_output.put_line('B');
else
dbms_output.put_line(''wrong!);
end case;
loop
loop
....
end loop;
exit(只能入到循环中,如果普通PL SQL 块要退出用return)
loop
if a > 3 then
...
exit;
end if;
end loop;
exit .. when
loop
fetch c1 into ...
exit when c1%notfound;
...
end loop;
close c1;
if == exit ... when
if a > 100 then
exit;
end if; -----------------------------------------------------------
exit when a > 100;
loop label(循环标签)
<<outer>>
loop
...
loop
...
exit outer when ...
end loop;
end loop outer;
while ... loop
while a < 100 loop
...
select sal into salary from emp where x = x;
...
total := total + salary;
end loop;
其他用法:
loop
...
exit when a > 10;
end loop;
--------------------------------------------
do{
} while()
---------------------------------------------
done := false;
while not done loop
....
done := boolean_expression;
end loop;
for ... loop
declare
type datelist is table of date index by binary_integer;
dates datelist;
k constant integer := 5;
begin
for j in 1 .. 3 loop
dates(j * k) := sysdate;
end loop;
end;
select count(empno) into emp_count from emp;
for i in 1 .. emp_count loop
...
end loop;
-----------------------------------------------------------
<<main>>
declare
ctr integer;
begin
...
for ctr in 1 .. 25 loop
...
if main.ctr > 10 then
...
end if;
end loop;
end main;
for exit
for j in 1 .. 10 loop
fetch cl into emp_rec;
exit when cl%notfound;
...
end loop;
-------------------------------------------------
<<outer>>
for i in 1 .. 5 loop
...
for j in 1 .. 10 loop
fetch cl into emp_rec;
exit outer when cl%notfound;
...
end loop;
end loop outer;
goto
declare
done boolean;
for i in 1 .. 10 loop
if done then
goto end_loop;
end if;
...
<<end_loop>>
null;
end loop;
endl;
declare
my_ename char(10);
begin
<<get_name>>
select ename into my_ename from emp wher ...
begin
...
goto get_name;
end;
end;
null
exception
when zero_divide then
rollback;
when value_error then
insert into errors values...
when others then
null;
if rating > 90 then
compute_bonus(emp_id);
else
null
end if;
DCL(数据控制语句)
| 权限 | 说明 |
| create user | 创建其他用户(dba角色) |
| drop user | 删除其他用户 |
| select any table | 查询任何用户表或视图 |
| create any table | 在任何表空间中创建表 |
| drop any table | 删除在任何表空间中所创建的表 |
| create session | 连接数据库 |
| create table | 在用户自己表空间中创建表 |
| create view | 在用户自己表空间中创建视图 |
| create sequence | 在用户自己的表空间中创建序列 |
| create proceudre | 在用业内自己表空间中创建存储过程 |
授权:
grant create any table to scott;
撤销授权:
revoke create any table from scott;
保存点:
savepoint a;
execute dbms_transaction.savepoint('B');
回滚保存点:
rollback to B;
exeucte dbms_transaction.rollback_savepoint('A');
回滚全部事物:
rollback;
execute dbms_transaction.rollback;
PL SQL笔记(三)的更多相关文章
- pl/sql 笔记之基础(上)
由于公司中使用 oracle,而本人对存储过程一直也懵懵懂懂,故一周时间学习了一遍 pl/sql,在此记下笔记!!! 一.前提,pl/sql 是啥? 1.PL/SQL是一种高级数据库程序设计语言,该语 ...
- pl/sql 笔记之存储过程、函数、包、触发器(下)
一.存储过程.存储函数 1.What's This? ①.ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. ②.存储过程.存储函数的唯 ...
- 二十三、oracle pl/sql分类三 包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成.1).我们可以使用create package命令来创建包,如:i.创建一个包sp_packageii.声明该包有一个过程update_sal ...
- PL/SQL第三章 基础查询语句
--查询所有列 select * from tab_name|view_name; SELECT * FROM emp; SELECT * FROM (SELECT * FROM emp); --查询 ...
- PL/SQL笔记(一)
PL/SQL概述 PL/SQL是一种高级的数据库程序设计语言,专门使用与Oracle语言基于数据库的服务器的内部,所以PL/SQL代码可以对数据库进行快速的处理. 1.什么是PL/SQL? PL/SQ ...
- PL/SQL笔记(1)-流程控制,循环,异常,块
流程控制 1.If,then,else,elsif(不是elseif) ' then null; endif; 2.Case 简单case表达式: 搜索型Case表达式: 3.goto语句 begin ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...
- Oracle PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
随机推荐
- MySQL存储过程中的3种循环
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- 【C++】统计代码覆盖率(二)
嗷嗷嗷!!!好激动,我好蠢.不过最后还是解决了.呜呜呜 有些都是东一块西一块查的,如果有侵权欢迎私信我,我注明出处. 一 gcov&CMake 昨天试了下测试代码和被测代码都是c++的情况,直 ...
- UIImageView 点击放大缩小
static CGRect oldframe; -(void)showImage:(UIImageView *)avatarImageView{ UIImage *image=avatarImageV ...
- javascript正则表达式简介
javascript正则表达式 javascript正则表达式 regular expression是一个描述字符模式的对象: ECMAScript中的RegExp类表示正则表达式: String ...
- 千万别把js的正则表达式方法和字符串方法搞混淆了
我们在字符串操作过程中肯定经常用了test() split() replace() match() indexof()等方法,很多人经常把用法写错了,包括我,所以今天细细的整理了下. test()是判 ...
- 免费CDN
什么是CDN? CDN (Content Delivery Network) ,CDN 是包含可分享代码库的服务器网络. CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将 ...
- VS2010安装EntityFramework5.0
EntityFramework 当前最新版本是6.0,2012年10月份发布,不过是alpha1版本,稳定版本是8月份发布的5.0版本,对于初学者来说,还是别在测试版上折腾了,先学习稳定的5.0版本, ...
- Java 操作MySql数据库
Java 项目开发中数据库操作是很重要的一个方面,对于初学者来说,MySql是比较容易熟悉的一种常见数据库,这篇文章记录了如何用Java来操作MySql数据库. 第一章 JDBC的概念 JDBC(Ja ...
- CircleLayout
CircleLayout https://developer.apple.com/library/ios/samplecode/CircleLayout/Introduction/Intro.html ...
- SQL Server文本和图像函数
文本和图像函数 1.查找特定字符串PATINDEX 语法与字符串的patindex一样. 2.获取文本指针TEXTPTR SQLServer在存储文本类型(ntext.text)和图像数据类型(ima ...