前端之家收集整理的这篇文章主要介绍了
Oracle PL/SQL入门语法点,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
PL_sql:带有分支和循环,面向过程
匿名块:
declare(可选,声明各种变量和游标的地方)
begin(必要的,从此开始执行)
exception(抓取到异常后执行的)
end;
[sql] view plaincopy
set serveroutput on;(默认是关闭)
--最简单的PL/sql语句块
begin
dbms_output.put_line('HelloWorld!');
end;
最简单的语句块
declare
v_name varchar2(20);
begin
v_name := myname';
dbms_output.put_line(v_name);
语句块的组成
number := 0;
2/v_num;
dbms_output.put_line(v_name);
exception
when others then
dbms_output.put_line(error变量声明
1. 变量名不能够使用保留字,如from,select等
2. 第一个字符必须是字母
3. 变量名最多包含30个字符
4. 不要与数据库表或者列同名
5. 每一行只能声明一个变量
常用变量类型
1. binary_integer: 整数,主要用来计数而不是用来表示字段类型,效率高
2. number: 数字类型
3. char: 定长字符串
4. varchar2: 变长字符串
5. date: 日期
6. long: 长字符串,最长2GB
7. boolean: 布尔类型,可以取值为ture、false和null值,一定要给初值,无法打印
变量声明
declare
v_temp number(1);
v_count binary_integer :0;
v_sal 7,2) :4000.00;
v_date date := sysdate;
v_pi constant 3,0)">3.14;
v_valid boolean := false;
v_name 20) not null :MyName';
v_temp value:' || v_count);
变量声明,使用%type属性
/*注释多行*/ 注释一行
declare
v_empno 4);
v_empno2 emp.empno%type;用表内字段类型声明变量类型
v_empno3 v_empno2用变量type属性声明变量类型
Test简单变量赋值
20);
v_sal 2);
v_sal2 2);
v_valid boolean := false;
v_date date;
';
v_sal :23.77;
v_sal2 :23.77;
v_valid := (v_sal = v_sal2);判断是否相等用=
v_date := to_date(1999-08-12 12:23:30',YYYY-MM-DD HH24:MI:SSTable变量类型,表示一个数组
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;首先声明一个类型
v_empnos type_table_emp_empno;再用这个类型声明变量
begin
v_empnos(0) :7369;
v_empnos(7839;
v_empnos(-1) :9999;
dbms_output.put_line(v_empnos(1));-1访问不到,0,2可以访问到
Record类型,表示一个类
declare
type type_record_dept is record
(
deptno dept.deptno%type,dname dept.dname%tpye,loc dept.loc%type
);
v_temp type_record_dept;
begin
v_temp.deptno :50;
v_temp.dname :aaaa';
v_temp.loc :bj';
dbms_output.put_line(v_temp.deptno || ' || v_temp.dname);
使用%rowtype声明record变量
declare
v_temp dept%rowtype;
PL/sql里执行select语句的话,配合into,必须返回并只能返回一条记录
--sql语句的运用
declare
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_ename,v_sal from emp where empno 7369;
dbms_output.put_line(ename || v_sal);
end;
declare
v_emp empselect * into v_emp 7369;
dbms_output.put_line(v_emp.ename);
declare
v_deptno dept.deptno%type :50;
v_dname dept.dname';
v_loc dept.locinsert into dept2 values(v_deptno,v_dname,v_loc);
commit;别忘了!!!
from dept2;
declare
v_deptno emp2.deptno10;
v_count number;
update emp2 set sal = sal/2 where deptno = v_deptno; select deptno into v_deptno from emp2 where empno = 7369;
select count(*) into v_count from emp2;
dbms_output.put_line(sql%rowcount 条记录被影响');//sql,关键字,代表刚刚执行的sql程序
PL/sql执行DDL语句,需要加execute immediate
execute immediate create table T(nnn varchar2(20) default '')if语句
取出7369的薪水,如果<1200,则输出'low',如果<2000则输出'middle',否则输出'high'
declare
v_sal emp.salselect sal into v_sal 7369;
if (v_sal<1200) low');
elsif(v_sal2000) then elsif没e
dbms_output.put_line(midddleelse
dbms_output.put_line(highend if;
循环
declare
i binary_integer :1;
begin
loop
dbms_output.put_line(i);
i := i + exit when (i >= 11);
end loop;
declare
j binary_integer :while j < 11 loop
dbms_output.put_line(j);
j := j for k in 1..10 loop
dbms_output.put_line(k);
end loop;
in reverse 错误处理
4);
select empno into v_temp where deptno 10;
exception
when too_many_rows then
dbms_output.putline(太多记录了2222;
exception
when no_data_found 没有数据end;
sql程序跨数据库平台较好,PL/sql效率高DBA,错误日志
create table errorlog
(
id number primary key,errcode number,errmsg 1024),errdate date
);
create sequence seq_errorlog_id start with 1 increment by 1;
10;
v_errcode number;
v_errmsg 1024);
delete from dept = v_deptno;
commit;
exception
then
rollback;
v_errcode := sqlCODE;
v_errmsg := sqlERRM;
into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
游标cursor,结果集上的指针
declare
cursor c is
from emp;只是声明游标,还未取数据
v_emp c%rowtype
open c;
fetch c into v_emp;
dbms_output.put_line(v_emp.ename);
close c;
from emp;
v_emp c%rowtype;
beigin
open c;
loop
into v_emp;
when (c%notfound);
dbms_output.put_line(v_emp.ename);
带参数的游标
cursor c(v_deptno emp.deptno%type,v_job emp.job%type)
= v_deptno and job = v_job;
for v_temp in c(30,0)">clerk') loop
dbms_output.put_line(v_temp.ename);
可更新的游标
cursor c
from emp2 for update;
in c loop
if(v_temp.sal update emp2 set sal = sal*2 where current of c;
else if (v_temp.sal 5000) 创建存储过程,带有名字的PL/sql块
grant procedure to shijin;
create or replace procedure p
for v_emp if(v_emp.deptno 10) = sal 10 if (v_emp.deptno 20) 20 else
50 begin
p;
end;
或者
exec p;
带参数的存储过程,默认是in
procedure p
(v_a in number,v_b in out number)
is
if (v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
if;
v_temp := v_temp declare
v_a 3;
v_b 4;
v_ret number;
v_temp 5;
begin
p(v_a,v_b,v_ret,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
函数
function sal_tax
(v_sal return number
if(v_sal return 0.10;
elsif(v_sal 2750) 0.15;
0.20;
select sal_tax(sal) from emp;
触发器!!!!牢牢掌握概念
table emp2_log
(
uname 20),action 10),atime date
);
create triger trigger trig
after insert or delete update on emp2 此处可以加上for each row
if inserting into emp2_log values (USER,0)">insert',sysdate);
elsif updating updatedelete30;
drop trigger trig;
on dept
for each row
update emp set deptno = :NEW.deptno = :OLD.deptno;
树状结构数据的存储与显示
table article;
table article
(
id 4000),pid 1),0代表非叶子节点,1代表叶子节点
alevel 2)
)
procedure p (v_pid article.pidfrom article where pid = v_pid;
v_preStr 1024) :'';
for i 1..v_level loop
v_preStr := v_preStr ****for v_article in c loop
dbms_output.put_line(v_preStr || v_article.cont);
if(v_article.isleaf 0) then
p(v_articel.id,v_level 1);
into article values (1,0)">蚂蚁大战大象0,0)">0);
2,0)">大象被打趴下蚂蚁也不好过2);
4,0)">瞎 说5,0)">没 有 瞎 说3);
6,0)">怎 么 可 能怎么没有可能8,0)">可能性很大的9,0)">大象进医院了10,0)">护士是蚂蚁3);
set serverout on;
begin
p(end;
show error;
展示emp的树状结构
原文链接:https://www.f2er.com/oracle/212540.html