PLSQL Developer 16 (64 bit) 新建自增主键表、 存储过程、定时任务、 添加新数据库链接、 创建普通用户 、导出导入数据库表、 修改查询出的表数据

--在oracal里没有commit的语句是不会落地的,所以从navicat查不出来
INSERT INTO "C##TESTDB"."JY_TABLE_BASE" ( "TIME", "PROCESS", "PRODUCTION_LINE", "CLASSIFY_ONE", "CLASSIFY_TWO", "CLASSIFY_THREE", "CLASSIFY_FOUR", "DAY_BENCHMARK_PRICE", "DAY_BENCHMARK_CONSUMPTION", "DAY_COST_PRICE", "DAY_COST_CONSUME") VALUES ( TO_DATE('2026-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'), '炼铁厂', '2#高炉', '1. 主要原材料', '1. 入炉净矿', '02. 自产球团矿', NULL, '', '', '', '');
COMMIT;

--执行存储过程

  begin
    --执行存储过程(无参)
    C##TESTDB.JY_INSERT_MOUDLE;
    --执行存储过程(有参)
    --C##TESTDB.JY_INSERT_MOUDLE(参数1,参数2,....);
  end;

 

-----------------------------------------------------------新建存储过程:--------------------------------------------------------------------------------------------------------------

1.

image

 2.需要先保存文件

image

 3.保存后,再重新执行编译,会报错,如下,因为在存储过程里,我们什么都没写

image

 4.我们添加了一句打印,还是保存,看起来还是不满足要求

image

 5. 

错误写法:end C##TESTDB.JY_INSERT_MOUDLE;(包含了模式名前缀)

正确写法:END JY_INSERT_MOUDLE;(只需过程名)

image

 6。编译成功的样子

image

 7.此时在文件夹下刷新,就会出来新增的存储过程了

image

8.可执行的存储过程 进行嵌套调用,公共参数统一由外部传入

注意:当修改存储过程的时候,要先进行保存,再执行编译,之后再调用查看结果。注意如果结果不如预期,可按此步骤操作

JY_INSERT_MAIN 

create or replace procedure c##testdb.JY_INSERT_MAIN is
  --获取当前日期(去掉时间部分)
  v_today DATE := TRUNC(SYSDATE);
begin
  --调用子存储过程
  jy_insert_moudle(v_today);
  
end JY_INSERT_MAIN;

JY_INSERT_MOUDLE

create or replace procedure c##testdb.JY_INSERT_MOUDLE(v_today DATE) is
 -- 定义VARRAY类型(最大5个元素)
  TYPE line_array IS VARRAY(5) OF VARCHAR2(20); 
  -- 声明并初始化数组变量
  v_line line_array := line_array('1#高炉', '2#高炉', '3#高炉');

begin
  DBMS_OUTPUT.PUT_LINE('开始数据插入:');

  
  FOR i IN 1..v_line.COUNT LOOP
    --DBMS_OUTPUT.PUT_LINE('颜色' || i || ': ' || v_line(i));
    INSERT INTO "C##TESTDB"."JY_TABLE_BASE" ( "TIME", "PROCESS", "PRODUCTION_LINE", "CLASSIFY_ONE", "CLASSIFY_TWO", "CLASSIFY_THREE", "CLASSIFY_FOUR", "DAY_BENCHMARK_PRICE", "DAY_BENCHMARK_CONSUMPTION", "DAY_COST_PRICE", "DAY_COST_CONSUME") 
                                     VALUES ( v_today, '炼铁厂', v_line(i), '1. 主要原材料', '1. 入炉净矿', '02. 自产球团矿', NULL, NULL, NULL, NULL, NULL);
  
  END LOOP;
  
  
  
  COMMIT;--提交当前事务
    DBMS_OUTPUT.PUT_LINE('成功插入数据: ');
  EXCEPTION
    WHEN OTHERS THEN --抛出异常
      DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
end JY_INSERT_MOUDLE;

 

-------------------------------------------------------------------------------添加其他Oracle库的监听配置-----------------------------------------------------------------------------

修改配置文件   配置文件找不到了看后面补充的图片

listener.ora 

# listener.ora Network Configuration File: D:\WINDOWS.X64_193000_db_home\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = D:\WINDOWS.X64_193000_db_home)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:D:\WINDOWS.X64_193000_db_home\bin\oraclr19.dll")
    )
   --以下新添加部分不是必须 (SID_DESC
= (SID_NAME = ORCLPDB) (ORACLE_HOME = D:\WINDOWS.X64_193000_db_home) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:D:\WINDOWS.X64_193000_db_home\bin\oraclr19.dll") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )

 tnsnames.ora

 

# tnsnames.ora Network Configuration File: D:\WINDOWS.X64_193000_db_home\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))

ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
  
# 新增使用 xxx.xxx.xxx.xxx 的连接配置 新增链接只需要添加如下模块,改变地址就行了。其他不用动
ORCL_43 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

2.重启服务命令 

lsnrctl status   
lsnrctl start
lsnrctl stop

3.服务需要全部为启动状态,否则连不上本地的Oracle,我的就是,可以手动重启所有服务。正确的样子如下:

image

 

--------------------------------------------------------新建自增主键表----------------------------------------------------

一:老式写法:手动序列+触发器:需要手动创建触发器,12c之前的旧写法,步骤繁琐

1.建表 

image

image

image

 2.建序列

image

 3.建触发器

image

 

这是旧方式修复自增Id的方式,需要知道序列名SEQ_JY_TABLE_BASE
-- 1. 查当前最大ID
SELECT MAX(ID) FROM fr_db.JY_TABLE_BASE;
-- 记住结果,比如是 1000

-- 2. 重置序列(假设序列名是 SEQ_JY_TABLE_BASE,Oracle 12c+)
ALTER SEQUENCE fr_db.SEQ_JY_TABLE_BASE RESTART START WITH 1001; 

 

二:Oracle 12c+ 原生 IDENTITY:不需要触发器,原生支持,数据库自动维护,简单可靠 (推荐)

CREATE TABLE FR_DB.JY_TABLE_BASE (
  ID NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 这就完事了! 红色部分是自增的关键语句
  TIME DATE,
  PROCESS VARCHAR2(100),
  PRODUCTION_LINE VARCHAR2(100)
);
-- 不用写ID,Oracle自动生成,完全不用触发器
INSERT INTO FR_DB.JY_TABLE_BASE (TIME, PROCESS, PRODUCTION_LINE) VALUES (DATE'2026-04-06', '测试工序', 'A线');


--找到IDENTITY对应的隐藏序列
SELECT * FROM all_tab_identity_cols WHERE table_name = 'JY_TABLE_BASE';
-- 当前用户查询,肯定能出结果
SELECT * FROM user_tab_identity_cols;


image

 

--自增Id自动修复 不需要知道序列名

--GENERATED ALWAYS AS IDENTITY:这是 Oracle 的自增ID定义,表示ID始终由数据库自动生成

--START WITH LIMIT VALUE:关键:让自增序列的起始值自动设为当前表中ID的最大值 + 1
ALTER TABLE FR_DB.JY_TABLE_BASE MODIFY ID GENERATED ALWAYS AS IDENTITY ( START WITH LIMIT VALUE );

 

可视化操作,只需要建表时配置自增就行了。如下图,不必指定最大值最小值

image

 

 

 

 

 -----------------------------------------------------------定时触发存储过程----------------------------------------------------

存储过程按如下配置即可

image

 注意:Action 项添加调用的存储过程时,后面要添加 “;” 分号

 

----------------------------创建用户---------------------

 

image

image

 

 

image

关于创建账户需要c##开头的问题,看下面CDB和PDB的概念部分,有详细说明

-------------------------------------创建用户-----其实和界面可视化创建是一样的,此处是代码创建过程-------------------------------------------------------------
--1. 创建用户ZB_DB 指定密码为‘你的密码’ 指定默认表空间 为'USERS' 临时表空间为'TEMP'
create user ZB_DB identified by "你的密码"
default tablespace USERS
temporary tablespace TEMP;
-- 2.必须给配额,否则建表报无法分配空间!
alter user ZB_DB quota unlimited on USERS;
--3.授予基础业务角色
-- `CONNECT`:允许登录数据库
-- `RESOURCE`:允许建表、增删改业务对象
grant connect,resource to ZB_DB;


----------------以下是检查创建用户报错时的检查步骤,----------------------------------------
select user from dual;
--查询表的OWNER
SELECT owner,table_name,tablespace_name FROM dba_tables WHERE table_name='ZB_TABLE_ORDER';

/*# 
  第一步:SYS as sysdba 登录,排查账号状态
  执行:
  ### 常见 3 种登录失败状态

  1. **ACCOUNT_STATUS = LOCKED**:账号被锁定(密码输错多次锁定)
  2. **ACCOUNT_STATUS = EXPIRED**:密码过期
  3. **ACCOUNT_STATUS = OPEN**:账号正常,只是密码不对
*/
SELECT username,account_status,lock_date,expiry_date FROM dba_users WHERE username='ZB_DB';
--解锁 + 重置密码(SYS 执行)
ALTER USER ZB_DB ACCOUNT UNLOCK;
ALTER USER ZB_DB IDENTIFIED BY "Afxm2024";

/*
 *第二步:给 zb_db 分配表空间配额
*/
ALTER USER ZB_DB QUOTA UNLIMITED ON USERS;
--校验配额 MAX_BYTES 为 -1就是无限配额
SELECT username,tablespace_name,max_bytes FROM dba_ts_quotas WHERE username='ZB_DB';

/*
 *第三步:授予基础业务角色
 *- `CONNECT`:允许登录数据库
 *- `RESOURCE`:允许建表、增删改业务对象
*/
grant connect,resource to zb_db;

 

 

 

 ---------------------------数据库表的导入导出----------------------

image

 Export User Objects  导出用户下的所有表和触发器等

image

 

Export Tables 只导出表格

image

 导入:

File->Command Window   执行导入文件

SQL> @"D:\管理系统sql脚本\jy_table\精益帆软测试.sql"   注意:指定路径要用引号

 

---------------------------------------修改查询出的表数据----------------

 

image

 要用如下格式查询,才可以修改

select rowid, t.* from tableName t; --rowid是关键字,不是列名
select * from tableName for update 

 ----------------------------------------汉化plsql-----------------------

1c6320a0-86fd-4fba-8538-f907224c989b

 ------------------配置文件找不到了------------------

修改完保存,重启 PL/SQL Developer,登录界面数据库下拉框就会出现别名。

image

 ----------以下是ORACAL CDB 和 PDB 相关概念和操作语句----------

--1 判断当前数据库是不是CDB多租户
--输出:YES 
--      NO代表数据库不是 CDB 架构,没有 PDB,没有 c## 这一说。
select cdb from v$database; 
/*
* 查询数据库版本
* 1. 如果版本 >=12c,并且 `cdb=YES`:就会遇到 c##、PDB 切换这套逻辑。
* 2. 如果版本 >=12c,但`cdb=NO`:安装的时候选了非 CDB,**完全没有 PDB,建用户不用 c##**
*/
select * from v$version;

--2 查询当前在哪个容器
select sys_context('USERENV','CON_NAME') as con_name from dual; --输出:`CDB$ROOT` = 根容器,建用户必须 c##,需要切换 pdb


--3 列出全部PDB以及打开状态
select con_id, name, open_mode from v$pdbs;
       /*
        * PDB 有几种关键状态:
        *          1. **`MOUNTED`**:已挂载,**关闭状态**。PDB 的数据文件已经关联,但是不对外提供服务。
        *             - ❌不能连接这个 PDB
        *             - ❌不能在里面建用户、建表、执行业务 SQL
        *             - ❌应用程序连不上
        *          2. **`READ WRITE`**:读写打开,**正常工作状态**。✅业务读写、建用户全部正常。
        *          3. `READ ONLY`:只读模式,只能查询,不能修改数据(系统模板`PDB$SEED`就是这个状态)。
        *
       */
       --打开pdb  ORCLPDB是我本地 MOUNTED 状态的pdb的name.  使用system 账号登录时,角色选择 SYSDBA,否则执行语句报‘ORA‑01031: insufficient privileges’ 权限不足
       alter pluggable database ORCLPDB open;
       -- 设置重启自动打开
       alter pluggable database ORCLPDB save state;
       --操作                                                          作用                                           实例重启之后效果
      alter pluggable database xxx open;                     --当前 PDB 打开读写                           不改变持久化记录,重启看 save state
      alter pluggable database xxx close immediate;           --当前 PDB 关闭 MOUNTED                       不改变持久化记录,重启看 save state
      alter pluggable database ORCLPDB save state;           --把 PDB此刻 open_mode记录下来                实例重启恢复为记录的状态
      alter pluggable database xxx discard state;             --删除持久化记录                              实例重启 PDB 默认 MOUNTED


--4 切换PDB,把下面 ORCLPDB1替换上面查询出来的name值
alter session set container = ORCLPDB1;

--5 确认切换完成
select sys_context('USERENV','CON_NAME') as cur_con from dual;

 

posted @ 2026-01-11 10:29  花开如梦  阅读(135)  评论(0)    收藏  举报