ORACLE 初学笔记
SqlPlus 连接数据
Enter user-name: [email protected]"localhost:1522/xepdb1"
Enter password:
Last Successful login time: Sun Nov 20 2022 13:46:16 +08:00
Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
select 1+1 from dual; DUAL 是oracle 自带的虚拟空表。
使用DBMS_SQL.return_result来显示游标(只支持sys_refcursor)的内容(只支持储存过程输出的ref游标)
declare
REP_CURSOR SYS_REFCURSOR;
BEGIN
"INVENTORY_PERIOD"(REP_CURSOR, '3300', TO_DATE ('11-11-2022 10:51:57', 'DD-MM-YYYY HH24:MI:SS'), TO_DATE ('12-11-2022 10:52:01', 'DD-MM-YYYY HH24:MI:SS'), '9');
DBMS_SQL.return_result(rep_cursor);
END;
也可以使用print rep_cursor 来显示游标的内容,但是pl sql 单个脚本只支持一个匿名块,可以用只包含/ 的行来告诉客户端把脚本分多次提交,也可以在一个大的匿名块里包含多个匿名块。
begin
declare
REP_CURSOR SYS_REFCURSOR;
BEGIN
"INVENTORY_PERIOD"(REP_CURSOR, '3300', TO_DATE ('11-11-2022 10:51:57', 'DD-MM-YYYY HH24:MI:SS'), TO_DATE ('12-11-2022 10:52:01', 'DD-MM-YYYY HH24:MI:SS'), '9');
END;
begin
select 1+1 from dual;
end;
end;
trunc(sysdate, ‘DD’) 取系统当前日期,只保留到天, sysdate => now()
select * from logs where rownum < 5; 告诉数据库只返回前5行
timestamp ‘2022-10-10 08:00:00.000’ 等价于 { ts ‘2022-10-10 08:00:00.000’}
(Date ‘2022-10-01’) + 1/3 的意思2022年10月1号上午8点。 Date 类型的默认单位为天,1/3 即8小时。
查看用户的全部表
select * from user_tables;
查看所有表空间及表空间大小:
select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name;
查看所有表空间对应的数据文件大小:
select tablespace_name,file_name from dba_data_files; 列出当前用户可以访问的全部表
列出系统用户
SELECT * FROM all_users;
SELECT * FROM dba_users;
SELECT * FROM user_users;
接手一个老项目时,往往没有健全的文档可以参考,使用 pl/sql developer 导出user objects 到 sql 脚本,然后在sql 脚本里查找表的引用情况。
在只使用标准sql语句的情况下,处理树形数据结构需要一定技巧。https://www.cnblogs.com/youxin/p/3614726.html
oracle 提供的connect by 可以方便地处理树型数据结构。 使用connect by 来生成等差序列
SELECT
(DATE '2022-10-01')- 1 + 1 / 3 + level prod_date
FROM DUAL
CONNECT BY DATE '2022-10-01' + level <= DATE '2022-10-30'
pivot, 可以把行转为列。假设表T有A,B,C 三列,A列的取值集合为{1,2,3},需要转为表A1,A2,A3,B,C。
select * from t pivot (sum(B),sum(C) for A in (1,2,3))