在Oracle中是否有顺畅的方法来获取当前时刻(当我执行调用时)SESSIONTIMEZONE和DBTIMEZONE之间的数字差异?
例如:
SELECT SESSIONTIMEZONE, DBTIMEZONE FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
返回:
+04:00 +07:00
Run Code Online (Sandbox Code Playgroud)
所以,我需要某种功能,通过调用给定参数,我得到这两个值之间的差异.
对于上面的例子:
SELECT get_numeric_offset(SESSIONTIMEZONE, DBTIMEZONE) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
将返回-3(标志是至关重要的).
当然,我可以自己编写这个函数,通过使用字符串并解析它们然后进行一些算术运算或做类似的事情(我仍然不认为这是一个非常流畅的解决方案:
SELECT (
CAST(SYSTIMESTAMP AT TIME ZONE SESSIONTIMEZONE AS DATE) -
CAST(SYSTIMESTAMP AT TIME ZONE DBTIMEZONE AS DATE)
)*24
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
也许我错过了一些东西,Oracle实际上提供了一种计算两个给定时区之间差异的方法?
在Oracle数据库中有一个叫做伪列的伪列ora_rowscn.如果它被检索,它会显示该行的最新更改的SCN(正如文档中所述).
也有一个选项rowdependencies的CREATE TABLE该接通SCN的存储对于每一行,而不是一个整体数据块(这是默认值).
所以,我正在使用此列的值来指示哪些行已更新并需要上载到另一个数据库.
让我们考虑这个例子:
T1架构中有一个表,S1其中包含数百万条记录(对于常规查询,表格上的完整扫描无法承受).
CREATE TABLE T1 {
A INTEGER PRIMARY KEY,
B VARCHAR2(100),
C DATE
}
/
Run Code Online (Sandbox Code Playgroud)有模式S2, S3, S4, S5..,每个都有表格T2.
CREATE TABLE T2 {
A INTEGER
}
/
Run Code Online (Sandbox Code Playgroud)只有一行T2,但T2.A在不同的模式中,值可能不同.
所以,我需要在每个模式中检索(S2, S3, S4...)所有S1.T1值都ora_rowscn大于的行S*.T2.A(然后我使用这个数据块).在获取这些行之后,我S*.T2.A用当前系统SCN(dbms_flashback.get_system_change_number)重写了值.
以下是任何架构的查询都在这里:
查询1:
SELECT * FROM S1.T1 WHERE ora_rowscn > (SELECT A FROM T2);
Run Code Online (Sandbox Code Playgroud)
查询2(当我完成上一个查询返回的数据集的工作时执行): …
我需要使用Oracle Application Express框架完成此任务.
假设我们有这样一个问题:
select
col1,
col2,
val1,
val2,
val3,
val4,
val5,
val6,
val7,
val8,
val9,
val10,
val11
from table(mega_function(city => ?, format => ?, percent => ?, days => ?));
Run Code Online (Sandbox Code Playgroud)
此查询返回类似这样的内容(以CSV格式显示):
col1;col2;val1;val2;val3;val4;val5;val6;val7;val8;val9;val10;val11
S2;C1;32000;120;"15:38:28";1450;120;1500;1200;31000;120;32600;300
S1;C1;28700;120;"15:35:01";150;120;1500;1800;2700;60;28900;120
S1;C2;27000;240;"14:44:23";0;1500;240;1200;25500;60;null;null
Run Code Online (Sandbox Code Playgroud)
简单来说,查询基于流水线函数,该函数接受一些参数并返回前两列不同值对的一些值集col1;col2.
我需要实现的是矩阵报告,其中值col1用作报告的行和值的col2列.在交叉点上有一些单元格,其中包含一对值的集合,并应用了一些格式和样式.还需要的是 - 按行排序(应按列"val1"的值对列进行排序).
所以问题是 - 使用一些交互和自定义样式实现这样的矩阵报告的最佳实践是什么?
我已经尝试过研究:
Use Generic Column Names集的属性中Yes(为了仅在运行时解析查询),对于报告的标题,我使用了另一个PL/SQL函数,以格式生成字符串heading1:headning2:...:headingN.该解决方案有效(你可以在这里查看 - https://apex.oracle.com/pls/apex/f?p=132832:2),但是我需要每次动态刷新报告,比方说,5秒,它会在性能方面很糟糕(如果我们谈论执行计划,动态SQL总是很糟糕而且不可管理).此解决方案也不合适,因为标题与数据不一致(实际上我order by …在我的系统中,永久数据与一些临时数据(如日志)分开.这是通过将日志表(用户定义的程序日志,不与系统日志混淆)存储在与主服务器不同的表空间中来完成的.
所以有两个表空间MAIN和LOG.每个表空间都有一个数据文件.两个数据文件maxsize都设置为4GB,初始大小为8MB,并且它们在接下来的8MB上自动扩展.
由于我使用oracle的快递版,我需要它们总和不超过4GB.
当我需要减小LOG数据文件的大小以释放一些空间以获取必要的数据时,有时会发生这种情况.
现在我这样做:
truncate table schema_name.log_table;
alter database datafile '/path/to/the/log/datafile/log1.dbf' resize 128M;
Run Code Online (Sandbox Code Playgroud)
它的工作原理,因为truncate摆脱了数据文件中的所有信息.
但是如果我遇到需要从MAIN中释放一些LOG表空间大小的情况怎么办呢.我在那里截断了几个表(或者我知道数据文件中有很多可用空间,它已经分配但没有被数据占用,之前用于某些操作),现在需要对MAIN表空间的数据文件进行碎片整理以减小它的大小.没有碎片整理我得到一个例外:
ORA-03297: file contains used data beyond requested RESIZE value
Run Code Online (Sandbox Code Playgroud)
所以我能以某种方式对数据文件执行碎片整理操作吗?