Oracle入门语法

[/size]创建表空间:create tablespace 表空间名 filename '文件名';
创建用户:create user 用户名 identified by 密码;
赋予用户权限:grant connect to 用户名; grant all on 表名 to 用户名;
消除用户权限:revoke


同义词也可以说是表的别名,它提供了另有一种表安全性,同时也简化了SQL语句。
创建私有同义词:create synonym aa for 表名; select * from aa;
这是私有的同义词,它只能被创建它的用户使用。
创建公共同义词:create public synonym bb for 表名;
这是公共的同义词,所有用户都能使用。
删除同义词drop (public) synonym 同义词名;


视图:同样也提供了另一种级别的表安全性,简化了SQL语句,隐藏了表结构。
创建视图:create view v_name as select ename as"xx" from scott.emp;
select * from v_name;
删除视图:drop view v_name;


创建单列索引:create index index_name on 表名(字段名);
创建复合索引:create index index_name on 表名(字段名,字段名);
索引一般是与rowid相关联,它独立于表的物理结构。
我们一般在低基数即重复率较高,以及查询在十万条以上是才创建索引,这样有利于提高查询效率,但由于oracle会自动维护索引导致增删改的效率会降低。



PL/SQL编程
PL/SQL是过程语言(procedural language)与结构化查询语言(SQL)结合而成的编程语言。

块:declare
   变量名 变量类型(长度);
begin
   .......
  end;

例子:declare
v_ename scott.emp.ename%type;
begin
   select e2.ename into v_ename from scott.emp e,scott.emp e2 where e.mgr=e2.empno and e.ename='KING';
   dbms_output.put_line('上司是:'||v_ename);
   exception
     when no_data_found then
     dbms_output.put_line('这人是老大');
     end;

--块可以直接运行



过程:create or replace procedure pro_name[变量 变量类型] is
[变量 变量类型(长度)];
.......
begin
.....
  [exception
   when no_data_found then
......
   ]
end;

例子:  create or replace procedure pro_name(v_empno number) is
     v_ename scott.emp.ename%type;
     v_sal scott.emp.sal%type;
     begin
       select ename,sal into v_ename,v_sal from scott.emp where empno=v_empno;
       dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal);
       end;

调用过程:
exec pro_name[7788];


函数:create or replace Function fun_name(变量 类型) return 返回值类型 is
变量2 变量类型(长度);
begin
......
return 变量2;
end;

例子:create or replace Function fun_name(v_empno number)return varchar is
v_ename scott.emp.ename%type;
begin
  select ename into v_ename from scott.emp where empno=v_empno;
return v_ename;
end;

调用函数:var aaa  varchar2(10);
       call fun_name(7369) into aaa;
--函数我们一般是给过程去调用的;
例子: create or replace Function fun_pro(v_empno number) return varchar is
           v_ename scott.emp.ename%type;
           begin
select ename into v_ename from scott.emp where empno=v_empno;
             return v_ename;
             end;


create or replace procedure pro_p(v_empno number) is
             v_ename scott.emp.ename%type;
             begin
               v_ename:=fun_pro(v_empno);
               dbms_output.put_line('姓名:'||v_ename);
               end;


包:用来给过程和函数分类。
包体:是对包的实现,先要创建包,再能创建包体。 包体的名字必须与包的名字一样。
例子:create or replace package package_name is
procedure pro_name(v_empno number);
Function fun_name(v_empno number) return varchar;
end;

create or replace package body package_name is
  procedure pro_name(v_empno number) is
     v_ename scott.emp.ename%type;
     begin
       select ename into v_ename from scott.emp where empno=v_empno;
       dbms_output.put_line('姓名:'||v_ename);
       end;
       Function fun_name(v_empno number) return varchar is
         v_ename scott.emp.ename%type;
         begin
           select ename into v_ename from scott.emp where empno=v_empno;
           return v_ename;
           end;
           end;

调用包中的过程:exec package_name.pro_name(7369);
调用包中的函数: var bbb varchar2(10); call package_name.fun_name(7369) into bbb;


PL/SQL中的数据类型:
1》标量类型
2》复合类型
3》嵌套表
4》varray


1》标量类型
定义一个变长字符串
xxx varchar2(10);
定义一个小数,范围-9999.99-9999.99
xxx number(6,2);
定义一个小数并给一个初始值8.8;
xxx number(6,2):=8.8;
定义一个日期类型的数据
xxx date;
定义一个布尔变量,不能为空,默认值为true;
xxx boolean not null default true;
定义一个常量只能赋值一次,不可被修改
xxx constant number(5):=99;


2》复合类型
PL/SQL记录:create or replace package package_record is
             type myrecor_type is record(
                    v_ename scott.emp.ename%type,
                    v_sal scott.emp.sal%type,
                    v_deptno scott.emp.deptno%type

);
end;--这里是创建了一个record的变量类型 myrecor_type



create or replace procedure pro_name(v_empno number) is
   v_myrecord   package_record. myrecor_type;--这里是对上面的使用(相当于java中的类与对象)
begin
select ename,sal,deptno into v_myrecord.v_ename,v_myrecord.v_sal,v_myrecord.v_deptno from
  scott.emp where empno=v_empno;
dbms_output.put_line('姓名:'||v_myrecord.v_ename||'工资:'||v_myrecord.v_sal||'部门:'||v_myrecord.v_deptno);
end;


PL/SQL记录2:create or replace procedure pro_name(v_empno number) is
              type v_record is record(
             v_ename scott.emp.ename%type,
                    v_sal scott.emp.sal%type,
                    v_deptno scott.emp.deptno%type

);
myrecord    v_record;
begin
select ename,sal,deptno into myrecord.v_ename,myrecord.v_sal,myrecord.v_deptno from scott.emp where empno=v_empno;
dbms_output.put_line('姓名:'||myrecord.v_ename||'工资:'||myrecord.v_sal||'部门:'||myrecord.v_deptno);
end;


3》参照类型--游标
create or replace package package_name is
type package_cursor is ref cursor;--定义一个游标类型
end;

create or replace procedure pro_name(v_deptno number) is
--type package_cursor is ref cursor;
  mycursor  package_cursor;--定义一个游标类型的‘对象’
v_ename scott.emp.ename%type;
v_sal scott.emp.sal%type;
v_empno scott.emp.empno%type;
begin
open mycursor for select ename,sal,empno from scott.emp where deptno=v_deptno;
Loop
fetch mycursor into v_ename,v_sal,v_empno;
exit when mycursor%notfound;
dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal||'员工编号:'||v_empno);
end Loop;
end;

在过程中调用过程:
例子:create or replace procedure pro_swap(num1 in out number,num2 in  out number) is
tep number(10):=11;
begin
  tep:=num1;
  num1:=num2;
  num2:=tep;
  end;

create or replace procedure pro_1 is
  num1 number(10):=100;
  num2 number(10):=200;
  begin
    pro_swap(num1,num2);
    dbms_output.put_line(num1||' ,'||num2);
    end;

注意:这里pro_swap中的参数 要写 in out;


PL/SQL中的流程控制:
1》if 条件 then 执行语句 end if;
2》if 条件 then 执行语句 else 执行语句 end if;
3》if 条件 then 执行语句 else if 条件 then 执行语句 else 执行语句 end if;end if;

--有几个 if 就要有几个 end if;

--case语句
create or replace procedure pro_if(v_empno number) is
v_job emp.job%type;
v_sal emp.sal%type;
begin
select job,sal into v_job,v_sal from emp where empno=v_empno;
case v_job
    when 'PRESIDENT' then
     v_sal:=v_sal+1000;
    when 'MANAGER' then
     v_sal:=v_sal+500;
    when 'CLERK ' then
     v_sal:=v_sal+300;
    when 'ANALYST ' then
     v_sal:=v_sal+200;
     else
       null;
    end case;
    update emp set sal=v_sal where empno=v_empno;
 
end;

暂时就先写到这了。[size=medium]

猜你喜欢

转载自793882999.iteye.com/blog/2146153
今日推荐