一、Oracle数据库错误 ORA-65096
表示你尝试在多租户容器数据库(CDB)环境中创建一个公共用户(common user)或角色,但没有使用正确的前缀。在多租户架构中,公共用户的用户名必须以 C##
或 c##
开头。
若想在CDB创建用户,用如下代码:
前提是先登录进sys系统账户中
但是,如果你的意图是在特定的可插拔数据库(PDB)中创建一个局部用户(local user),你不应该使用 C##
或 c##
前缀。你可能直接在CDB环境中而不是在特定的PDB中尝试执行该命令。
为了在PDB中创建一个用户,你需要确保首先连接到了正确的PDB。以下是在PDB中创建用户的步骤:
1.连接到目标PDB: 如果你使用的是 SQL*Plus 或类似的工具,你可以使用以下命令连接到目标PDB:
sqlplus
conn sys/orcl as sysdba;
alter session set container=<pdbname>;
这里的 sys
是你的系统管理员账户,而 pdb_name
是你的可插拔数据库的名字,一般是ORCLPDB。
2.检查当前的容器: 一旦连接,你可以运行以下命令来确认你当前连接的是哪个容器:
SHOW CON_NAME;
如果你还没在PDB中,你需要切换到目标PDB。使用:
ALTER SESSION SET CONTAINER = pdb_name;
替换 pdb_name
为你的目标PDB名称。
3.创建用户: 一旦确定你在正确的PDB中,使用以下命令创建用户,注意不要使用 C##
或 c##
前缀:
CREATE USER fxy IDENTIFIED BY "123456";
在这里,fxy
是新用户的用户名,"123456"
是用户的密码。
授予权限: 创建用户后,你需要给用户授予最起码的权限,比如 CREATE SESSION
,以便用户可以登录:
GRANT CREATE SESSION TO fxy;
二、建表
--员工表
create table emp
(
empno NUMBER(20) not null,
dpetno NUMBER(20),
ename VARCHAR2(20),
user_id NUMBER(20) not null,
birthdate DATE,
gender VARCHAR2(20),
job VARCHAR2(10),
hiredate DATE,
sal NUMBER,
comm NUMBER,
mgr NUMBER(20),
constraint PK_EMP primary key (empno)
);
--部门表create table dept (
dpetno NUMBER(20) NOT NULL,
dname VARCHAR2(20) NOT NULL,
loc VARCHAR2(20)
);
三、Oracle21C创建存储过程、序列、触发器
1. -- 存储过程
--获取部门人数
CREATE OR REPLACE PROCEDURE get_department_employee_count(
department_id IN NUMBER,
employee_count OUT NUMBER
)
IS
BEGIN
-- Initialize the OUT parameter
employee_count := 0;-- Attempt to get the employee count
BEGIN
SELECT COUNT(*) INTO employee_count FROM employee WHERE deptno = department_id;
EXCEPTION
-- Handle the NO_DATA_FOUND exception
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No employees found for the specified department.');
-- Handle other exceptions as needed
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
END;
END;
/
-- 调用
DECLARE
v_employee_count NUMBER;
BEGIN
get_department_employee_count(department_id => 1, employee_count => v_employee_count);
DBMS_OUTPUT.PUT_LINE('Employee Count: ' || v_employee_count);
END;
/
-- 查询主管姓名
SELECT
e.empno,
e.ename,
e.birthdate,
e.gender,
e.position,
e.hiredate,
e.id,
e.sal,
e.comm,
e.deptno,
s.ename AS supervisorName
FROM
employee e
LEFT JOIN
employee s ON e.id = s.empno
2. -- 序列
CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1 NOCACHE;CREATE SEQUENCE dept_seq START WITH 1 INCREMENT BY 1 NOCACHE;
CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1 NOCACHE;
drop sequence emp_seq;
drop sequence dept_seq;
3. -- 触发器
CREATE OR REPLACE TRIGGER delete_department_employees
BEFORE DELETE ON department
FOR EACH ROW
DECLARE
BEGIN
-- 在删除部门之前,将部门中的员工转移到其他部门(例如,部门号为 0)
UPDATE employee SET deptno = 0 WHERE deptno = :OLD.deptno;
END;
/
四、idea如何连接Oracle数据库
yml文件中写入
spring:datasource:type: oracle.ucp.jdbc.PoolDataSourceImpldriver-class-name: oracle.jdbc.driver.OracleDriverurl: jdbc:oracle:thin:@localhost:1521:ORCLusername: 用户名password: 密码