Oracle PL/SQL入门语法点
发布时间:2020-12-12 15:57:33 所属栏目:百科 来源:网络整理
导读:PL_SQL:带有分支和循环,面向过程匿名块: declare (可选,声明各种变量和游标的地方) begin (必要的,从此开始执行)exception(抓取到异常后执行的) end ; [ sql ] view plaincopy set serveroutput on ;(默认是关闭) -- 最简单的PL/SQL语句块 begin dbms_ou
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的树状结构 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |