PL/SQL

  1. SQL plus是与Oracle进行交互的客户端工具

基本命令:

    host:从SQL plus环境切换到系统环境,一边执行操作系统命令

    disconnect/connect:disconnect断开与Oracle的连接,connect  name/password  取得与数据库的连接

    save filename    把当前缓冲区中的内容存放到存入文件当中

    get  filename    把文件中的内容放入缓冲区中

    edit:对当前的输入内容进行编辑

    /    run  和r重新运行上一次运行的SQL语句

    desc/describe  :可以查看对象的结构

    col:主要格式化列的显示形式

    clear screen:清屏

2.PL/SQL:

    变量:

        variable_name [constant] datatype    [:=default expression]

    赋值:

        X:=200;    Y=Y+(X*20);

        或者通过select into或fetch into 来赋值

        select sum(salary) into totalSalary from emplory where dept=10;

    数据类型:

数据类型
binary_integer:整数 主要用来计数而不是用来表示字段类型
number  数字
varchar2 可变字符
char 定长字符
date 日期 v_date date := to_date(sysdate,'yyyy-mm-dd hh24:mi:ss')
long 长字符串 最长2g
boolean true/false/null 可以为null 所以 一定要给个初始值 不然就为空值,而不是false
赋值-格式 :=
v_number number(10):=0; 
v_varchar2 varchar2 :='douban';

基本数据类型:
number,character,date/time,Boolean
数字数据类型:binary_integer    number
字符数据类型:char,long,raw,longraw,varchar2
日期和布尔类型:Boolean/date
LOB数据类型:BFILE/BLOB/CLOB/NCLOB

    块结构:

declare
    v_empname varchar(50);
    v_sal number(10,2);
     
begin
    select ename,sal into v_empname,v_sal from emp where empno=7369;
    dbms_output.put_line(v_empname||'---'||v_sal);
    exception when others then
    dbms_output.put_line('error');
end;

函数和存储过程:

-存储过程
create sequence emp_empno_sq start with 8000;
 
create or replace procedure addemp(ename varchar2,job varchar2,sal number) is
    begin
    insert into emp  values (emp_empno_sq.nextval,ename,job,sal,'23-1月 -82',10000,100,10);
end;
 
显示错误:show error
调用过程:两种方式
1-exec  addemp 过程名(参数)
1-call  addemp 过程名(参数)
调用存贮过程
exec addemp('java','javaee',1000);
 
java 调用存储过程 实例
****************************************************************
    class.forname("oracle.jdbc.oracledriver").newinstance();
     string url = "jdbc:oracle:thin:@192.168.6.19:1531:orcl";
     string user = "atf_ygj";
     string password = "mas123";
     conn = drivermanager.getconnection(url, user, password);
     conn.setautocommit(false);
     cstmt = conn.preparecall("{ call prc_1(?,?) }");
     cstmt.setstring(1, "100");
     cstmt.setstring(2, "testone");
     cstmt.execute();
     conn.commit();
**********************************************
 
--函数
返回值类型+is+返回变量名+类型
create or replace function getsalary(empname varchar2) return number is empsal%emp;
 begin
 select sal into empsal from emp where ename=empname;
 return empsal;
 end;
 
 var s number;
 call getsalary('scott') into:s;
 
函数的调用及限制
1.函数的调用(其具体调用方法参照上面的演示)
    a.使用全局变量接收函数的返回值
    b.使用本地变量接受函数的返回值
    c.在sql语句中直接调用函数
    d.使用dbms_output调用函数
    注:函数在调用的时候需要按位置指定参数,没有存储过程参数传递灵活
    必须具有execute 函数的权限
    var s number;
    exec:s:=getsalary('scott')
    select getsalary('scott') from dual
    
复杂的数据类型:
1.record:
TYPE <记录类型名> IS RECORD(
<数据项1> <数据类型> 【NOT NULL【:=<表达式>】】;
<数据项2> <数据类型> 【NOT NULL【:=<表达式>】】;)
<记录变量名> <记录类型名>
例:
declare
type emp_record_type is record      定义一个记录类型,名称为 emp_record_type
(v_ename emp.ename%type,        格式“字段名 表名.表中的字段名%type”
v_job emp.job%type,
v_sal emp.sal%type);
emp_rec emp_record_type;       记录变量名:emp_rec(别名)   emp_record_type记录类型
begin
select ename,job,sal into emp_rec  格式“select 字段 into 记录变量名 from 表名 where…”
from emp where empno=&eno;
dbms_output.put_line(emp_rec.v_ename||':'
emp_rec.v_job||';'||emp_rec.v_sal);
end;
/

2.table
TYPE <表类型名> IS TABLE OF <数据类型> INDEX BY BINARY_INTEGER
<表变量名> <表类型名>
说明:
表类型名:用户定义的
数据类型:表中元素的数据类型
例子:
declare
TYPE ename_table_type IS TABLE OF
emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Ename_table ename_table_type;
begin
select ename INTO ename_table(1) from emp   注意了:这里别忘了有个1哦。。。。指定元素的数目
where empno=7902;
dbms_output.put_line('员工名:'||ename_table(1));
end;
/

3.数组类型
与表类型的区别就是声明了一个数组就确定了数组中的元素的数目
特点:元素的次序是固定而且连续的,并且索引变量从1开始一直到其定义的最大值为止
语法:
TYPE <数组类型名> IS VARRAY(<MAX_SIZE>) OF <数据类型>;
<表变量名> <表类型名>
说明:
数组类型名:用户定义的
数据类型:数组中元素的数据类型
MAX_SIZE:指明数组元素个数的最大值
过程的基本结构:
控制结构:if  condition then        eg:    if (a>b)and(c>d) then
            statement ;
        else if
            statement;
        else
            statement;
循环控制:loop....end loop(二者之间可以无限循环,因此必须有条件时期exit)

  while condition loop
          statement;
      endloop;
  for condition loop
          statement;
      endloop;

    参考文章:

http://my.oschina.net/abian/blog/131822

http://blog.sina.com.cn/s/blog_64c236b10100nwzy.html

你可能感兴趣的:(plsql)