oracle的一些问题

8 阅读2分钟

关于tns

TNS 的核心文件:tnsnames.ora

这个“电话簿”是一个具体的文本文件,名字叫 tnsnames.ora

它通常长这个样子(看起来有点吓人,但逻辑很简单):

# 这是别名,你在代码或工具里填的就是这个名字
MY_ORACLE_DB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb1) # 类似 MySQL 的数据库名
    )
  )
  • MY_ORACLE_DB: 别名(Alias)。
  • HOST: 数据库服务器 IP。
  • PORT: 端口(Oracle 默认通常是 1521,MySQL 是 3306)。
  • SERVICE_NAME: 服务名(类似 MySQL 的库名)。

文件的位置

  • 检查文件位置: Oracle 默认去 $ORACLE_HOME/network/admin 目录下找 tnsnames.ora

  • 设置环境变量(推荐): 无论你把文件放在哪(比如放在 D盘),你可以设置一个系统环境变量 TNS_ADMIN,值就是那个文件夹的路径。Oracle 就会去那里找。

常用sql

查看版本

SELECT * FROM v$version;

查看字符集

SELECT parameter, value 
FROM nls_database_parameters 
WHERE parameter LIKE '%CHARACTERSET';

创建索引

建表时创建

-- 单字段唯一索引
CREATE TABLE departments (
    dept_id NUMBER PRIMARY KEY,
    dept_code VARCHAR2(10) UNIQUE,
    dept_name VARCHAR2(50)
);

-- 或使用约束语法
CREATE TABLE departments (
    dept_id NUMBER PRIMARY KEY,
    dept_code VARCHAR2(10),
    dept_name VARCHAR2(50),
    CONSTRAINT uk_dept_code UNIQUE (dept_code)
);

-- 多字段复合唯一索引
CREATE TABLE employee_contacts (
    emp_id NUMBER,
    contact_type VARCHAR2(20),
    contact_value VARCHAR2(100),
    CONSTRAINT uk_emp_contact UNIQUE (emp_id, contact_type)
);

使用alter语句创建

-- 后期添加主键
ALTER TABLE employees ADD CONSTRAINT pk_employees PRIMARY KEY (emp_id);

-- 添加复合主键
ALTER TABLE order_details ADD CONSTRAINT pk_order_details PRIMARY KEY (order_id, product_id);

-- 添加唯一索引
ALTER TABLE employees ADD CONSTRAINT uk_emp_email UNIQUE (email);

-- 添加复合唯一索引
ALTER TABLE employee_contacts ADD CONSTRAINT uk_emp_contact UNIQUE (emp_id, contact_type);

-- 单字段索引
CREATE INDEX idx_emp_name ON employees(emp_name);

-- 复合索引
CREATE INDEX idx_emp_dept_hire ON employees(department_id, hire_date);

-- 函数索引
CREATE INDEX idx_emp_name_upper ON employees(UPPER(emp_name));

-- 降序索引
CREATE INDEX idx_emp_hire_desc ON employees(hire_date DESC);

查看执行计划

--- 这个sql创建执行计划,并存入`PLAN_TABLE`临时表中
explain plan for select *
from employees;

--- 这个sql查看刚才生成的执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);