首页 > 数据库 >Oracle触发器

Oracle触发器

时间:2023-08-23 11:11:54浏览次数:52  
标签:触发器 NAME -- NUMBER TCODE Oracle NEW GIRL

--手办表
DROP TABLE T_GIRL;
CREATE TABLE T_GIRL(
  ID NUMBER,
  NAME VARCHAR2(30),
  PRIMARY KEY(ID),
  AGE NUMBER,
  TCODE NUMBER
);
--数量表
DROP TABLE T_SQL_LOG;
CREATE TABLE T_SQL_LOG(
  TID NUMBER ,
  TNAME VARCHAR2(30),
  TCODE VARCHAR(20),
  TCOUNT NUMBER
);
--手办型号表
DROP TABLE T_T_GIRL;
CREATE TABLE T_T_GIRL(
  TTName varchar2(10),
  TTCODE NUMBER
);

-- 触发器案例1:
--当插入一条新数据,副表添加一条记录,TCOUNT为0,
--添加重复的数据(标识为NAME),不添加记录,Tcount +1
CREATE OR REPLACE TRIGGER TR_GIRL_2
BEFORE INSERT ON T_GIRL
FOR EACH ROW
DECLARE
  v_count NUMBER;
BEGIN
  --查询主表新增手办对应的数量(where tname=:new.name),并赋值给参数v_count(count(*) into v_count)
  SELECT COUNT(*) INTO v_count
  FROM T_SQL_LOG
  WHERE TNAME = :NEW.NAME;
  --判断是否是新增的手办,如果是向T_SQL_LOG(手办数量表)添加一条新手办的数量信息(count=1,tcode=:new.tcode,tname=:new.name)
  --如果不是新增的手办,则对应数量表数量+1(tcount+1)
  IF v_count > 0 THEN
    UPDATE T_SQL_LOG
    SET TCOUNT = TCOUNT + 1
    WHERE TNAME = :NEW.NAME;
  ELSE
    INSERT INTO T_SQL_LOG (TID, TNAME, TCODE, TCOUNT)
    VALUES (:NEW.ID, :NEW.NAME, :NEW.TCODE, 1);
  END IF;
END;

--SELECT 查询出来的字段 INTO 需要被赋值的参数 FROM 查询的表名 where 条件


--触发器:案例二
--添加数据时,如果TCOUNT为空,那就去T_T_GIRL表中找,对应关系是NAME-TTNAME
--如果没有就在T_T_GIRL添加一条数据与之对应,name=:new.name,ttcode=:new.id||1001
CREATE OR REPLACE TRIGGER TR_GIRL_3
BEFORE INSERT ON T_GIRL
FOR EACH ROW
DECLARE
  --V-COUNT NUMBER;
BEGIN
  IF :NEW.TCODE IS NULL THEN
    BEGIN
      -- 查询 T_T_GIRL 表中是否存在与 :NEW.NAME 匹配的 TTName,如果有,则将新数据的TCODE(:NEW.TCODE)替换成查询出来的值
      --SELECT TTCODE INTO V-CODE FROM T_T_GIRL WHERE TTNAME=:NEW.NAME;
      SELECT TTCODE INTO :NEW.TCODE FROM T_T_GIRL WHERE TTNAME=:NEW.NAME;
      --:NEW.TCODE := v_TTCODE;
      -- 如果找不到对应的数据,插入新数据
      EXCEPTION WHEN OTHERS THEN
      INSERT INTO T_T_GIRL (TTName, TTCODE) VALUES (:NEW.NAME, :NEW.ID || 1001);
      --:NEW.TCODE := :NEW.ID || 1001; -- 更新 :NEW.TCODE
      SELECT TTCODE INTO :NEW.TCODE FROM T_T_GIRL WHERE TTNAME=:NEW.NAME;
    END;
  END IF;
END;

 

标签:触发器,NAME,--,NUMBER,TCODE,Oracle,NEW,GIRL
From: https://www.cnblogs.com/Yytan-BK/p/17650674.html

相关文章

  • oracle 实例信息查询
    SQL>descgv$instance;NameNull?TypeINST_IDNUMBERINSTANCE_NUMBERNUMBERINSTANCE_NAMEVARCH......
  • oracle 存储过程
    例子declarev_startnumber:=42113+1*1000+1;run_numnumber:=1000;v_endnumber:=v_start+run_num-1;BEGINforiinv_start..v_endloopINSERTINTOIKAS_ALAM_TEST(PPID,COLUMN1,COLUMN2,CREATE_DATE,UPDATE_DATE)VALUES(i,......
  • Oracle脚本大全(Carlos-sierra)
    https://github.com/carlos-sierra/cscriptsCSScriptsInventorybyType(2023-07-29)LatencyLoadSQLPerformanceSPBL-SQLPlanBaselinesSPRF-SQLProfilesSPCH-SQLPatchesSessionsKillSessionsBlockedSessionsLocksSpaceReportingSpaceMaintena......
  • Oracle script to check the database growth
    1、OraclescripttocheckthedatabasegrowthSETLINESIZE200SETPAGESIZE200COL"DatabaseSize"FORMATa13COL"UsedSpace"FORMATa11COL"Usedin%"FORMATa11COL"Freein%"FORMATa11COL"DatabaseNam......
  • oracle 查询表,索引列等
    1、查找表的所有索引(包括索引名,类型,构成列):selectt.,i.index_typefromuser_ind_columnst,user_indexesiwheret.index_name=i.index_nameandt.table_name=i.table_nameandt.table_name=要查询的表2、查找表的主键(包括名称,构成列):selectcu.fromuser_cons_c......
  • oracle-行转列
    现有由多个诊断组成的字段,诊断个数不定,由英文逗号拼接。现需要将字段分解,每条诊断列为一行。转化前字段如下图:转化后字段如下图:SQL实现方法如下:selecta.id,substr(编码,instr(编码,',',1,levels.lvl)+1,instr(编码,',',1,levels.lvl+1)-(instr(编码,',',1,levels.lvl)+1)......
  • oracle 字符集
    oracle查看字符集select*fromv$nls_parameterswhereparameter='NLS_CHARACTERSET'select*fromv$nls_parameterswhereparameter='NLSNCHARCHARACTERSE'修改字符集步骤shutdownimmediate;startupmount;ALTERSESSIONSETSQL_TRACE=TRUE;ALTE......
  • oracle-体系结构
    18c、19c相当于12c的小版本Oracle服务器是由一个Oracle数据库和一个Oracle实例组成。Oracle实例是一种访问Oracle数据库的基本方式,总是打开一个且只打开一个数据库,由内存结构和进程结构组成。Oracle数据库是作为一个单元对待的数据的集合体,由三种文件类型组成。三类文件如下:......
  • C#和Oracle的交互
    1.安装Oracle,略。2.(非必要,全局用户也可)在sys下创建用户并授权session、createtable,createtablespace,createview,unlimitedtablespace。3.在VisualStudio创建项目,并将Oracle本地目录下的文件Oracle.DataAccess.dll复制到项目的exe所在目录下(bin/Debug/*)。4.......
  • oracle通配符大全
    用于where比较条件的有:等于:=、<、<=、>、>=、<>>,<:大于,小于>=.<=:大于等于,小于等于=:等于!=,<>,^=:不等于包含:in、notinexists、notexists范围:between...and、notbetween....and匹配测试:like、notlikeNull测试:isnull、isnotnull布尔链接:and、or、notOracle通配符:在where......