我想编写一个带有两个IN
参数的函数,其中第一个是 a varchar
,第二个是varchars
. 基于这些,我想返回一个具有不同列数量和类型名称的表varchar
。
据我所知,我必须始终创建一个对象/记录和它的表类型。这意味着我的想法行不通?基本目标是将系统命令输出作为表传递回被调用者。
编辑:更多关于任务。我想发出一个操作系统命令,使用输出并将其作为表返回。OS 命令的输出将是 CSV 格式的数据。在执行时,我不知道要返回的行数,而只知道作为第二个参数传递的列数。我正在考虑使用带有动态STRUCT
和ARRAY
包含它们的Java 。虽然我更喜欢前一种方法。
它应该是这样的:
create function(clob query, list of varchars cols) returns table
begin
execute system command(query, cols);
examine sysout from command;
return tabular data from syscmd as table;
end
Run Code Online (Sandbox Code Playgroud) 我有两个用户 A 和 B。我想授予 B 创建、删除等 A 架构中所有表的权限。据我所知,我可以授予 B 对所有模式的完全访问权限,而不是特定模式。这样对吗?
我今天写了 PL/SQL 的片段:
declare
first_id number;
second_id number;
begin
insert into table (sort_nr, text_id, unit_id) values(...,
table_seq.nextval, table_seq.nextval) returning text_id, unit_id
into first_id, second_id;
dbms_output.put_line(first_id);
dbms_output.put_line(second_id);
end;
Run Code Online (Sandbox Code Playgroud)
并收到了唯一的常量违规。经过进一步检查,我发现了它,first_id
并且second_id
在其中具有相同的价值。
我的问题是:在同一个语句中多次调用同一个序列并接收后续号码是否有任何限制?从我的角度来看,似乎nextval
只在查询范围内调用一次并缓存。
只是附带说明,我无法更改那个糟糕的架构以避免在两列中使用相同的序列。
我目前正在检查我们部门所有数据库用户的 SQL 代码是否没有使用绑定变量。我们确实在一段时间内遇到了 ORA-04031 错误。
现在,我非常清楚在何处使用它们,但我不确定这应该走多远。现在,我是否必须用绑定变量替换所有文字?
例如:
select 1 from t1 ; => select :one from table t;
Run Code Online (Sandbox Code Playgroud)
或者
select c1, c2, from t2 where id = :id and status = 2 =>
select c1, c2, from t2 where id = :id and status = :two
Run Code Online (Sandbox Code Playgroud)
或者
select * from t3 where c3 > :value and exists (select 1 from t4 where <some condition>) =>
select * from t3 where c3 > :value and exists (select :one from …
Run Code Online (Sandbox Code Playgroud) 我们最近遇到了由于临时表空间溢出而导致查询速度大幅下降的情况。特定查询会导致此问题。
被查询的表 ( table3
) 有一个索引 PK、三个带索引的 FK 和三个 FK 上的复合唯一约束。令人反感的查询如下所示:
SELECT ...
FROM table1 t1, table2 t2, table3 t3
WHERE t1.abs_id = ?
AND t3.vgs_id = t1.vgs_id
AND t3.ai_id > ?
AND t2.id = t1.t2_id
AND t2.status = 2
AND t2.felddimension = 0
...
Run Code Online (Sandbox Code Playgroud)
只有实例重启解决了这个问题。即使杀死连接也没有帮助。
经过对FK和索引的进一步调查,结果是t3.ai_id
列上的索引导致性能严重下降。禁用此功能后,独特的约束非常快地为查询提供服务。
有问题的部分是AND t3.ai_id > ?
(范围扫描)。唯一扫描不会造成任何麻烦。
现在的问题是,一个指数怎么会导致这样的放缓,而且,我该如何调查原因?它根本不适合我。
竞争时间:正常 10 秒,减速 > 2 分钟或永不返回。
编辑 1 (2013-06-05):根据 Jack Douglas 和 Chris Saxon 的建议,我已经运行了统计数据,然后执行了解释计划,我已经取得了巨大的飞跃。
我已经计算了带和不带索引的模式统计信息。无论索引是否可用,优化器使用 3-field-composite-unique-index 使查询速度极快。
这是 SQL Developer 的解释计划:
到目前为止一切顺利,现在我在查询中添加了使用 …
假设我创建了这两个帐户:
CREATE USER u1 IDENTIFIED BY "&&u1Password"
DEFAULT TABLESPACE u1tbs
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON u1tbs
QUOTA 256M ON users
QUOTA 0M ON ket;
CREATE USER u2 IDENTIFIED BY "&&u2Password"
DEFAULT TABLESPACE u2tbs
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON u2tbs
QUOTA 256M ON users
QUOTA 0M ON u1tbs;
Run Code Online (Sandbox Code Playgroud)
我已授予 u2 对 u1 架构的完全访问权限。如您所见,u1 中的所有表都在表空间 u1tbs 中。当 u2 向 u1 的模式添加数据时,数据会去哪里?如果是这样,它不会与quota 0M on ...
?
编辑:问题应该在 dba.stack 上...