之前一直没有学习过PL SQL的开发,后看了一段讲解的视频稍有了点了解。
使用PL SQL DEVELOPER进行开发,编写pl sql主要使用test窗口。
--test窗口
begin
DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
end;
--进行打印
sqlplus 默认不打印
set serveroutput on; --开启打印
--普通变量
DECLARE
V_NAME VARCHAR2(20) := '张三';
v_sal number;
v_addr varchar2(2000);
begin
v_sal := 20000;
select 'china' into v_addr from dual;
DBMS_OUTPUT.PUT_LINE('name:'||v_name||' sal:'||v_sal||', addr:'||v_addr);
end;
--引用型变量
DECLARE
V_NAME emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_name,v_sal from emp fetch first 1 rows only;
DBMS_OUTPUT.PUT_LINE('name:'||v_name||' sal:'||v_sal);
end;
--记录型变量,引用表中一整行的内容
DECLARE
v_emp emp%rowtype;
begin
select * into v_emp from emp fetch first 1 rows only;
DBMS_OUTPUT.PUT_LINE('name:'||v_emp.ename||' sal:'||v_emp.sal);
end;
--判断分支
DECLARE
v_sal emp.sal%type;
begin
select sal into v_name,v_sal from emp where ename ='张三';
if sal > 10000 then
DBMS_OUTPUT.PUT_LINE(v_sal||' 蛮多的');
elsif sal > 5000 then
DBMS_OUTPUT.PUT_LINE(v_sal||' 还凑合');
else
DBMS_OUTPUT.PUT_LINE(v_sal||' 唉');
end if;
end;
--loop 循环
DECLARE
v_num number := 1;
begin
loop
exit when v_num > 10; --退出条件
DBMS_OUTPUT.PUT_LINE(v_num);
v_num := v_num+1;
end loop;
end;
--游标:cursor 声明 打开 读取 关闭
--cursor 游标名(参数列表) is subquery;
--open 游标名;
--fetch 游标名 into 变量列表;
--close 有标名;
--属性
--rowcount --获取fetch语句返回的行数
--found --有数据为真
--notfound --与found相反;
--isopen --打开为真
declare
cursor v_cursor is select ename,sal from emp;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open v_cursor;
loop
exit when v_cursor%notfound;
fetch v_cursor into v_name ,v_sal;
DBMS_OUTPUT.PUT_LINE('name:'||v_emp.ename||' sal:'||v_emp.sal);
end loop;
close v_cursor;
end;
--带参游标
declare
v_cursor(v_deptno emp.deptno%type) cursor is select ename,sal from emp where deptno = v_deptno;
v_name emp.ename%type;
v_sal emp.sal%type;
begin
open v_cursor(10);
loop
--fetch 语句放在判断结束条件之前
fetch v_cursor into v_name ,v_sal;
DBMS_OUTPUT.PUT_LINE('name:'||v_emp.ename||' sal:'||v_emp.sal);
exit when v_cursor%notfound;
end loop;
close v_cursor;
end;
--存储过程
create or replace procedure name is
begin
end name;
--无参存储过程
--plsql > program window > procedure
create or replace procedure p_hello as
begin
DBMS_OUTPUT.PUT_LINE('hello world');
end p_hello;
--test window 调用
begin
--存储过程名
p_hello;
end;
--sqlplus 调用
set serveroutput on; --开启打印
exec p_hello;
--有参存储过程
create or replace procedure p_print(in_empno in emp.empno%type) as
v_name emp.ename%type;
v_sal emp.sal%type;
begin
select ename,sal into v_name,v_sal from emp where empno = in_empno;
DBMS_OUTPUT.PUT_LINE('name:'||v_name||' sal:'||v_sal);
end p_print;
create or replace procedure p_outname(in_empno in emp.empno%type,out_ename out emp.ename%type) as
begin
select ename into out_ename from emp where empno = in_empno;
end p_outname;
--调用
--test window
declare
v_name emp.ename%type;
begin
p_outname(7566,v_name);
DBMS_OUTPUT.PUT_LINE(v_name);
end;
--