数据库小技能:PL/SQL中书写定义sql

简介: 触发器由数据库管理系统负责调用和执行,通过触发触发器所监听的事物来实现触发器的调用。表级别的触发器(对于整个数据库表做监听)行级别的触发器(对于表中的每一行做监听)

I 书写定义sql

1.1 DQL语言

  1. 必须写into关键字
  2. 查询语句只能有一条返回值
异常示例:

没有值 no_data_found;

值过多 too_many_rows

1.2 DML(insert/update/delete)

执行DML语句要处理事务

&+变量来实现动态传参
--执行DML语句
declare
begin
    --普通DML语句
    delete from emp where empno=&xx;
    --事务处理
    commit;
end;

1.3 DDL(create/drop/alter/truncate)

execute immediate('DDL')

        declare
          v_count number(3);
        begin
          select count(*) into v_count from user_tables where table_name='T_TEST';
          if v_count=1 then
          --DDL语句执行时execute immediate()
          execute immediate('drop table t_test');
          dbms_output.put_line('drop table success');
          end if;
          
          execute immediate('create table  t_test(id number(10),name varchar2(20))');
          dbms_output.put_line('create table success');
        end;

II 游标(cursor)

sql语句执行时会在内存中开辟一个区域,用来存放执行的sql语句以及返回的数据,我们把这个内存区域叫做上下文环境(context);游标就是指向这个上下文环境的指针

2.1 游标分类

  • 隐式游标:由数据库管理系统创建执行
  • 显示游标:有程序员负责创建执行和关闭的游标

2.2 游标的属性

%rowcount 存储的是游标执行时所影响的记录条数

2.3 操作属性

  • 显示游标:自定义游标名称%rowcount
  • 隐式游标:sql%rowcount
  • %found 判断当前数据有没有下一条 true/fase
  • %notfound 判断当前数据有没有下一条 true/fase
  • %isopen 判断游标是否开启
            declare
                   v_count binary_integer;
            begin
                   update emp set job='baobiao' where empno=1111;
                   --操作隐式游标的属性获得影响的记录数
                   v_count := sql%rowcount;
                   commit;
                   
                   dbms_output.put_line(v_count||' rows updated');
            end;

2.4 显示游标

  1. 创建游标

cursor 游标名称 is 查询语句

  1. 开启游标

open 游标名称

  1. 获取数据

fetch 游标名称 into 变量

  1. 关闭游标

close 游标名称

            declare
                   v_name varchar2(20);
                   v_job varchar2(20);
                   --定义游标
                   cursor my_cursor is select ename,job from emp;
            begin
                   --开启游标,执行sql语句,将结果存储在指定内存区域
                   open my_cursor;
                   
                   loop
                   --获取数据,给变量赋值
                   fetch my_cursor into  v_name,v_job;
                   dbms_output.put_line(v_name||'-----'||v_job);
                   
                   exit when my_cursor%notfound;
                   
                   end loop;
                   --关闭游标
                   close my_cursor;
            end;

循环游标

            --for循环
            declare
                   cursor my_cursor is select * from emp;
            begin
                   for v_c in my_cursor loop
                dbms_output.put_line(v_c.ename||'---'||v_c.job);
                   end loop;
            end;

定义游标时传递参数

            --定义含有参数的游标
            declare
                   v_emp_record emp%rowtype;
                   --定义含有参数的游标
                   cursor my_cursor(p_id number) is select * from emp where empno=p_id;
            begin
                   --通过动态方式传递参数
                   open my_cursor(&no);
                   loop
                   fetch my_cursor into v_emp_record;
                   exit when my_cursor%notfound;
                   dbms_output.put_line(v_emp_record.ename||v_emp_record.empno);
                   end loop;
                   close  my_cursor;
            end;

注意:

  1. 设置形参时不要写参数的长度,实参是在开启游标的时候传递。
  2. 游标不能重复开启和关闭

2.5 定义游标类型的变量

  1. 定义游标类型: type 游标类型名称 is ref cursor return 返回结果类型
  2. 定义游标类型的变量: 变量名称 游标类型名称
declare
                   --定义游标类型
                   type cursor_type is  ref cursor return emp%rowtype;
                   --定义游标类型变量
                   my_cursor cursor_type;
                   my_record emp%rowtype;
            begin
                   --在开启游标的时候动态绑定sql
                   open my_cursor for select * from emp;
                   loop
                   --循环游标变量,把结果存放在记录类型的变量中
                   fetch my_cursor into my_record;
                   exit when my_cursor%notfound;
                   dbms_output.put_line(my_record.ename||my_record.empno);
                   end loop;
            end;

III 过程和函数

https://blog.csdn.net/z929118967/article/details/128313118

IV 触发器 (trigger)

类似java中的Listener
触发器由数据库管理系统负责调用和执行,通过触发触发器所监听的事物来实现触发器的调用。

  • 表级别的触发器(对于整个数据库表做监听)
  • 行级别的触发器(对于表中的每一行做监听)
/*表级触发器*/
create or replace trigger table_emp_trigger
before  delete or update or insert on emp 
begin
       if to_char(sysdate,'dy') in('星期二','星期三')then
          
          dbms_standard.raise_application_error(-20000,'u cant modify this table');
       end if;
 
end;
 
 
/*行级的触发器*/
create or replace trigger update_sal_emp_trigger
before update on emp for each row
begin
       --:old.字段  获取更新之前的旧值
       --:呢w.字段  获取更新之后的新值
       if :old.job not in('MANAGER','PRESIDENT') and :new.sal>10000 then
          dbms_standard.raise_application_error(-20001,'u have too many money');
       end if;
end;
 
 
/*同步my_emp和emp表的插入*/
 
 
 
create or replace trigger insert_emp_trigger
after insert on emp for each row
begin
       --:old.字段  获取更新之前的旧值
       --:new.字段  获取更新之后的新值
       insert into my_emp(empno) values(:new.empno);
         
end;
 
update emp set sal=10001 where empno=7389;
select * from my_emp;
drop trigger table_emp_trigger;
insert into emp(empno,ename) values(1119,'xx');
commit;

4.1 触发器的执行顺序

有表级别的触发器,行级别的触发器作用于同一个表

  1. before表级别触发器
  2. before 行级别触发器
  3. after 行级别触发器
  4. after 表级别触发器

4.2 系统触发器

DBA用来调试系统on database

注:触发器不带参数,没有放回值,不作事务处理。

V 预备知识

5.1 使用SQL*PLUS登陆远程数据库的配置

  • 手工编辑:$ORACLE_HOME/network/admin/tnsnames.ora文件
  • 工具编辑: 通过Net Configuration AssistantNet Manager进行本地网络服务名配置
DEV =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 12.11.11.11)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ios逆向11on11)
    )
  )

5.2 建立数据库

CREATE DATABASE database;

5.3 建立顺序号

CREATE SEQUENCE CINOSEQ MINVALUE 1 MAXVALUE 4000000000 START WITH 41 INCREMENT BY 1 NOCYCLE;

5.4 创建索引

CREATE [ UNIQUE ] INDEX index
ON table "("
     column [ ASC | DESC]
  [, column [ ASC | DESC]]... ")" ;

5.5 修改表

  • 在表的后面增加一个字段
ALTER TABLE 表名 ADD 字段名 字段名描述   [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];
  • 修改表里字段的定义描述
ALTER TABLE 表名 MODIFY 字段名1 字段名1描述  [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];
  • 删除表里的某个字段
ALTER TABLE 表名 DROP 字段名;
  • 给表里的字段加上/禁止/启用约束条件
ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 PRIMARY KEY (字段名1[,字段名2 ……]);
ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 UNIQUE (字段名1[,字段名2 ……]);
  • 删除表里的约束条件
ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE];
--会把约束相关的索引一起删除,CASCADE能同时删去外键的约束条件。
  • 删除索引
DROP INDEX 索引名;
  • 删除顺序号
DROP SEQUENCE 顺序名;
  • 删除数据库表
DROP TABLE 表名 [{CASCADE | CASCADE CONSTRAINTS | RESTRICT}] ;

5.6 查询

https://blog.csdn.net/z929118967/article/details/128456644

5.7 插入数据 insert

使用INSERT语句一次只能插入一行数据。

INSERT INTO { table | view } ["("column [, column]...")"]{ VALUES "(" expression[, expression]...")" | subquery };

5.8 update

在修改表中数据时,不能破环表的完整性约束。如果修改的数据与完整性约束有冲突,那么这种修改操作不能成功。

UPDATE { table | view } [ alias ] SET column = { expression | subquery } [, column = { expr | subquery }]...[WHERE condition] ;

5.9 delete

就像修改数据一样,删除数据时也不能破坏数据库的完整性约束。

DELETE FROM { table | view }[WHERE condition] ;

5.10 事务

https://blog.csdn.net/z929118967/article/details/128387690

事务是一个逻辑上的单元。要么全部成功,要么全部失败。
在下面的情况下系统自动地结束一个事务:

  • COMMIT或ROLLBACK命令;
  • DDL,如CREATE TABLE语句;
  • 系统失败。

    • 退出SQL*PLUS;

COMMIT [WORK] ;
ROLLBACK [{ WORK | TO savepoint_name }] ;
SAVEPOINT savepoint_name ;
REMOVE SAVEPOINT <savepoint_name>;

5.11 数据导入和导出

  1. 导出
--将数据库TEST完全导出,用户名system 密码manager 导出到`daochu.dmp`中
exp system/manager@TEST file=d:daochu.dmp full=y
--将数据库中的表inner_notify、notify_staff_relat导出
exp aichannel/aichannel@TESTDB2 file= datanewsmgnt.dmp tables= (inner_notify,notify_staff_relat)
  1. 导入
--将`daochu.dmp` 中的数据导入 TEST数据库中
imp system/manager@TEST file=daochu.dmp
--将daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:daochu.dmp tables=(table1)
目录
相关文章
|
18天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
1天前
|
SQL 数据库
SQL主体内容一致,但是对于不同的数据库,对于SQL就可能有一些细节的拓展
SQL主体内容一致,但是对于不同的数据库,对于SQL就可能有一些细节的拓展
11 1
|
2天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
4 0
|
2天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
4天前
|
SQL 数据库
SQL数据库基础语法-查询语句
SQL数据库基础语法-查询语句
|
4天前
|
SQL 存储 数据库
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
SQL数据库基础语法-增删改
|
4天前
|
SQL 存储 数据库
SQL数据库查询优化技巧
【5月更文挑战第6天】本文介绍了7个SQL数据库查询优化技巧,包括选择合适索引、避免`SELECT *`、使用JOIN代替子查询、优化WHERE子句、使用LIMIT、分析查询计划和定期维护数据库。通过这些方法,开发者可以提升查询效率,改善系统性能。
|
6天前
|
SQL 数据库 Windows
sql数据库安装过程,SQL数据库的安装过
本文概述了安装SQL Server数据库的步骤:准备硬件和软件环境,运行安装程序,选择安装类型,接受许可协议,设定安装路径和组件,配置实例和服务账户,选择身份验证模式,配置其他设置,然后安装并完成。安装后需检查验证SQL Server是否正常工作。确保遵循步骤以顺利完成安装。
42 3
|
10天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
11天前
|
SQL 关系型数据库 数据库
【MySQL】:DDL数据库定义与操作
【MySQL】:DDL数据库定义与操作
13 0