zoukankan      html  css  js  c++  java
  • oracle基本操作


    DDL(数据定义语言):
    create创建
    创建表:
    create table <table_name(
    column datatype [not null] [primary key],
    column2 datatype [not null],
    ……
    )
    复制表:
    create table <table_name> as <select 语句>
    创建索引:
    create [unique] index <index_name> on <table_name>(字段[asc|desc]);
    create index i_1 on emp(empno asc);
    创建同义词:
    create synonym <synonym_name> for <tableename/viewname>
    create synonym mm for emp;
    alter修改
    alter table:
    添加字段:
    alter table <table_name> add (字段 类型 [not null]);
    修改字段:
    alter table <table_name> modify (字段 类型);
    删除字段:
    alter table <table_name> drop 字段;
    修改表名:
    alter table <table_name> to <new_table_name>;
    添加约束:
    alter table <table_name> add constraint <constraint_name> 约束类型 (针对的字段名);
    alter table emp add constraint pk primary key (empno);
    约束禁用:
    alter table <table_name> disable constraint <constraint_name>;
    约束重启:
    alter table <table_name> enable constraint <constraint_name>;
    删除约束:
    alter table <table_name> drop constraint <constraint_name>;
    drop删除:
    drop table 删除表:
    drop table <table_name>;
    drop table emp;
    drop index 删除索引:
    drop index <index_name>;
    drop synonym 删除同义词:
    drop [public/private] synonym <synonym_name>;

    DML(数据操纵语言)
    insert into (插入记录)
    insert into table_name(column1,column2,……) values (column1,column2,……);
    insert into table_name (select 语句);
    create table a as select * from emp where 1=2;
    insert into a select * from emp where sal>2000;
    select 查询记录
    select [distinct] <column1 as[new name],column2……>
    from <table_name>
    where <条件>
    [group by <column_list]
    [having <条件>]
    [order by <column_list <asc|desc];
    DISTINCT --表示隐藏重复的行
    WHERE --按照一定的条件查找记录
    GROUP BY --分组查找(需要汇总时使用)
    HAVING --分组的条件
    ORDER BY --对查询结果排序
    AVG --求平均值
    MAX --求最大值
    MIN --求最小值
    COUNT --求个数
    update (更新数据)
    update table_name set column1 =new value,column2=new value,…… where <条件>;
    update emp set sal=1000,empno=8888 where ename='SCOTT';
    delete (删除数据)
    delete table_name where <条件>;
    delete from emp where empno='7788';

    DCL(数据控制语言)
    授权
    grant <权限列表> to <user_name>;
    收回权限
    revoke <权限列表> from <user_name>;
    connect 连接
    resource 资源
    unlimited tablespace 无限表空间
    dba 管理员
    session 会话

    TCL(事务控制语言)
    commit;
    rollback to savepoint 回滚;
    savepoint <savepoint> 保存位置;

    oracle其他对象
    视图:
    create or replace view <view_name> as <select 语句>;
    drop view <view_name>

    序列:
    create sequence <sequence_name>
    increment by n
    start with n
    [maxvalue n][minvalue n]
    [cycle|nocycle]
    [cache n|nocache]
    INCREMENT BY n --表示序列每次增长的幅度;默认值为1.
    START WITH n --表示序列开始时的序列号。默认值为1.
    MAXVALUE n --表示序列可以生成的最大值(升序).
    MINVALUE n --表示序列可以生成的最小值(降序).
    CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。
    CACHE --允许更快的生成序列.
    create sequence se_1
    increment by 1
    start with 100
    maxvalue 999999
    cycle;

    alter sequence <sequence_name>
    increment by n
    start with n
    maxvalue n minvalue n
    cycle|nocycle
    cache n|nocache

    drop sequence <sequence_name>

    select <sequence_name>.netxval from dual;
    select <sequence_name>.currval from dual;

    用户:
    create user <user_name> [profile "DEFAULT"]
    identified by "<password>" [default tablespace "USERS"]
    DROP user <user_name> cascade;

    角色:
    create role <role_name>
    identified by "<password>"

    drop role <role_name>;

    PL/SQL
    基本结构:
    declare
    声明语句
    begin
    执行语句
    exception
    执行语句
    end;
    条件控制语句:
    IF《条件1》THEN
    语句
    elsif <条件2> THEN
    语句
    ……
    elsif <条件n> THEN
    语句
    else
    语句
    end if;

    循环控制语句
    1. LOOP
    语句
    exit when<条件>
    end loop;
    2.while loop
    while <条件>
    loop
    语句
    end loop;
    3.FOR
    for <循环变量> in 下限 .. 上限
    LOOP
    语句
    END LOOP;
    NULL语句
    null;
    表示没有操作;
    注释使用
    单行注释:--
    多行注释:/*.........
    ..................*/
    异常处理
    EXCEPTION
    when <异常类型> THEN
    语句
    WHEN OTHERS THEN
    语句;
    END;

    游标:
    显示游标
    定义:CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
    [FOR UPDATE | FOR UPDATE OF 字段] --给游标加锁,既是在程序中有"UPDATE","INSERT","DELETE"语句对数据库操作时。
    游标自动给指定的表或者字段加锁,防止同时有别的程序对指定的表或字段进行"UPDATE","INSERT","DELETE"操作.
    在使用"DELETE","UPDATE"后还可以在程序中使用CURRENT OF <游标名> 子句引用当前行.
    操作:OPEN<游标名>
    FETCH<游标名> INTO 变量1,变量2,……变量n;
    或者
    fetch <游标名> INTO 行对象;
    CLOSE <游标名>
    属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
    %FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
    %ROWCOUNT --返回游标当前行的行数;
    %ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
    使用:
    LOOP循环
    DECLARE
    cursor c_1 select * from emp;
    r c_1%rowtype;
    begin
    if c_1%isopen then
    close c_1;
    end if;
    open c_1;
    dbms_output.put_line('行号 姓名 薪水');
    LOOP
    FETCH c_1 into r;
    exit when c_1%notfound;
    dbms_output.put_line(c_1%rowcount||' '||r.ename||' '||r.sal);
    end loop;
    end;
    for循环使用游标是在循环开始前自动打开游标,并且自动取值到循环结束后,自动关闭游标.
    游标加锁实例
    declare
    cursor c_1 is select ename,sal from emp for update of sal;
    begin
    dbms_output.put_line(行号 姓名 薪水);
    for i in c_1
    loop
    update emp set sal=sal + 1000 where curent of c_1;
    end loop;
    for i in c_1
    loop
    dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal):
    end loop;
    end;
    代参数的游标
    定义:CURSOR <游标名>(参数列表) IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
    示例:
    DECLARE
    cursor c_1(name emp.ename%type) is select ename,sal from emp where ename=name; --定义游标
    BEGIN
    dbms_output.put_line('行号 姓名 薪水');
    FOR i IN c_1('&name') --for循环中的循环变量i为c_1%rowtype类型;
    LOOP
    dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal); --输出结果,需要 set serverout on 才能显示.
    END LOOP;
    END;

    PL/SQL表

    PL/SQL记录类型:

    REF游标:

    过程:
    定义:create or replace procedure《过程名》[(参数列表)] is
    局部变量声明
    begin
    可执行语句
    exception
    异常处理语句
    end 过程名;
    变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
    操作以有的过程:在PL/SQL块中直接使用过程名;在程序外使用execute <过程名>[(参数列表)]
    create or replece procedure p_1(n in out number) is
    r emp%rowtype;
    begin
    dbms_output.put_line('姓名 薪水');
    select * into r from emp where empno =n;
    dbms_output.put_line(r.ename||' '||r.sal);
    n:=r.sal;
    end;
    declare
    n number;
    begin
    n:=&请输入员工号:
    p_1(n);
    dbms_output.put_line('n的值为 ’||n);
    end;
    删除过程:
    drop procedure <过程名>;
    函数:
    create or replace function <过程名>[参数列表] return 数据类型 is
    局部变量声明
    begin
    可执行语句
    exception
    异常处理语句
    end <过程名>;
    变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
    create or replace function f_1 (n number) return number is
    r emp%rowtype;
    begin
    dbms_output.put_line('姓名 薪水');
    select * into r from emp where empno =n;
    dbms_output.put_line(r.ename||' '||r.sal);
    return r.sal;
    end;
    declare
    n number;
    m number;
    begin
    n:=&请输入员工号:
    m:=f_1(n);
    dbms_output.put_line('m的值为'||m);
    end;

    drop function <函数名>;

    数据包:
    create or replace package <数据包名> AS
    ----公共类型和对象声明
    ----子进程说明
    end;
    定义包的主体
    create or replace package body <数据包名> as
    ----公共类型和对象声明
    ----子进程说明
    begin
    --初始化语句
    end;
    创建数据包规范:
    create or replace package p_1 as
    n number;
    procedure p_1;
    function f_1 return number;
    end;
    创建数据包主体:
    create or replace package body pack_1 as
    procedure p_1 is
    r emp%rowtype;
    begin
    select * into r from emp where empno =7788;
    dbms_output.put_line(r.empno||' '||r.ename||' '||r.sal);
    end;
    function f_1 return number is
    r emp%rowtype;
    begin
    select * into r from where empno=7788;
    return r.sal;
    end;
    end;
    使用包:
    declare
    n number;
    begin
    n:=&请输入员工号:
    pack_1.n:= n;
    pack_1.p_1;
    n:=pack_1.f_1;
    dbms_output.put_line('薪水为'||n);
    end;

    create or replace package body pack_2 as
    type c_type is ref cursor;
    procedure p_1(c_1 in out c_type);
    end;

    create or replace package body pack_2 as
    procedure p_1(c_1 in out c_type) is
    begin
    open c1 for select * from emp;
    end;
    end;
    var c_1 refcursor;
    set autoprint on;
    execute pack_2.p_1(:c_1);
    drop package <包名>;

    触发器:
    创建触发器:
    create or replace trigger <触发器名>
    before|after|insert|delete|update of [列名] on 《表名》
    for each row;
    where <条件>
    <PL/SQL块>
    alter trigger <触发器名> disable;
    alter trigger <触发器名> enable;
    alter trigger <触发器名> disable add triggers;
    alter trigger <触发器名> enable all triggers;
    删除触发器
    drop trigger <触发器名>;

    自定义对象:
    create or replace type <对象名> as object(
    属性1 类型
    属性2 类型


    )
    其他:
    1.在PL/SQL中使用DDL
    将sql语句赋给一个varchar2变量,在用execute immediate 这个varchar2变量即可;
    declare
    str varchar2(200);
    begin
    str:='create table test(id number,name,varchar2(20))';
    execute immediate str;
    str:='insert into test values(3,"c")';
    execute immediate str;
    end;

    2.判断表是否存在;
    declare
    n tab.tname%type;
    begin
    select tname into n from tab where tname='&请输入表名';
    dbms_output.put_line('此表已存在');
    exception
    when no_data_found then
    dbms_output.put_line('还没有此表');
    end;
    2.查看以有的过程;
    select object_name,object_type status from user_objects where object_name="PROCEDURE";

    附录:
    oracle 的数据类型:
    数据类型 描述
    VARCHAR2(size) 可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size;
    NVARCHAR2(size) 可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每个字符所需的字节数,其上限为4000;你必须指定一个NVARCHAR2的size;
    NUMBER(p,s) 精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从-84到127;
    例如:NUMBER(5,2) 表示整数部分最大3位,小数部分为2位;
    NUMBER(5,-2) 表示数的整数部分最大为7其中对整数的倒数2位为0,前面的取整。
    NUMBER 表示使用默认值,即等同于NUMBER(5);
    LONG 可变长度的字符数据,其长度可达2G个字节;
    DATE 有效日期范围从公元前4712年1月1日到公元后4712年12月31日
    RAW(size) 长度为size字节的原始二进制数据,size的最大值为2000字节;你必须为RAW指定一个size;
    LONG RAW 可变长度的原始二进制数据,其最长可达2G字节;
    CHAR(size) 固定长度的字符数据,其长度为size个字节;size的最大值是2000字节,而最小值和默认值是1;
    NCHAR(size) 也是固定长度。根据Unicode标准定义
    CLOB 一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节
    NCLOB 一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节;储存国家字符集
    BLOB 一个二进制大型对象;最大4G字节
    BFILE 包含一个大型二进制文件的定位器,其储存在数据库的外面;使得可以以字符流I/O访问存在数据库服务器上的外部LOB;最大大小为4G字节.

    函数:
    字符函数:
    concat(字符串1,字符串2)
    select concat(job,ename) from emp;
    lpad(字段,总的大小,填充字符);
    rpad(字段,总的大小,填充字符);
    lower();
    upper();
    initcap();首字母大写,其余小写
    length();
    substr(字符串,开始位置,长度);
    instr(字符串,字符);
    trim(字符 from 字符串);
    to_char();
    replace(字符串,字符串1,字符串2);
    translate();
    ascii(char);

    数学函数:
    nlssort(字符串);
    abs(数字);
    cell(数字);
    floor(数字);
    mod(被除数,除数);
    round(数字,从第几位开始取);
    sign(数字);
    sqrt(数字);
    power(m,n);
    trunc(数字,从第几位开始);
    greatest(数字列表);
    sin(n);
    cos(n);
    tan(n);
    acos(n);
    atan(n);
    exp(n):
    ln(n);
    log(m,n);

    日期函数:
    add_months(日期,数字);
    last_day(日期);
    months_between(日期1,日期2);
    new_time(时间,时区,'gmt');
    next_day(d,char);

    其它函数:
    vsize(类型);
    nvl(字符串,替换字符);

    常用命令:
    desc 表名;
    set serverout on|off
    set pagesize 大小
    set linesize 大小
    set autoprint on|off
    select sysdate from dual;
    alter session set nls_date_format='格式';
    select * from tab;
    show user;
    help topic;
    save file_name
    run file_name
    get file_name
    list
    ed
    del 行数
    del 开始行 结束行
    input 字符串
    append 字符串1
    C/以前的字符串/替换的字符串
    connect
    disconnect
    quit
    exp
    imp


    异常类型:
    CURSOR_ALREADY_OPEN 试图"OPEN"一个已经打开的游标
    DUP_VAL_ON_INDEX 试图向有"UNIQUE"中插入重复的值
    INVALID_CURSOR 试图对以关闭的游标进行操作
    INVALID_NUMBER 在SQL语句中将字符转换成数字失败
    LOGIN_DENIED 使用无效用户登陆
    NO_DATA_FOUND 没有找到数据时
    NOT_LOGIN_ON 没有登陆Oracle就发出命令时
    PROGRAM_ERROR PL/SQL存在诸如某个函数没有"RETURN"语句等内部问题
    STORAGE_ERROR PL/SQL耗尽内存或内存严重不足
    TIMEOUT_ON_RESOURCE Oracle等待资源期间发生超时
    TOO_MANY_ROWS "SELECT INTO"返回多行时
    VALUE_ERROR 当出现赋值错误
    ZERO_DIVIDE 除数为零

  • 相关阅读:
    不规则的组合方向键或功能键
    jQuery总结
    jQuery 学习
    jquery
    Ubuntu 11.10 (Oneiric)上编译带utrace补丁的内核 转
    linux 内核升级 网址参考
    SSDT&Shadow Hook的实现,完整代码。可编译
    linux信号机制
    linux 内核资料
    PostgreSQL SystemTap on Linux 转
  • 原文地址:https://www.cnblogs.com/zszitman/p/6640076.html
Copyright © 2011-2022 走看看