数据库小技能: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)
目录
相关文章
|
3月前
|
SQL 机器学习/深度学习 人工智能
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
284 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
125 6
|
3月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
333 8
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
231 5
|
3月前
|
存储 人工智能 数据库
视图是什么?为什么要用视图呢?数据库视图:定义、特点与应用
本文三桥君深入探讨数据库视图的概念与应用,从定义特点到实际价值全面解析。视图作为虚拟表具备动态更新、简化查询、数据安全等优势,能实现多角度数据展示并保持数据库重构的灵活性。产品专家三桥君还分析了视图与基表关系、创建维护要点及性能影响,强调视图是提升数据库管理效率的重要工具。三桥君通过系统讲解,帮助读者掌握这一常被忽视却功能强大的数据库特性。
733 0
|
4月前
|
SQL 缓存 监控
SqlRest让SQL秒变Http API,还支持20+数据库(含国产数据库)
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
4月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
820 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
388 0
|
6月前
|
SQL 人工智能 数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库
406 0
SQL Server 2025 - 从本地到云端的 AI 就绪企业数据库