在 Oracle 的文档The Query Optimizer 中,在View Merging 下,我找到了以下信息
视图合并优化适用于仅包含选择、投影和连接的视图。也就是说,可合并视图不包含集合运算符、聚合函数、DISTINCT、GROUP BY、CONNECT BY 等。 (强调我的)
然而,我只能猜测这样的投影实际上指的是什么。
不知何故,似乎 SQL*Plus(至少在 Windows 上)在调用 with@@
以及路径以单点或双点开头时无法定位具有相对路径的脚本。
例如,在x:\some\where
I下有以下目录结构:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
Run Code Online (Sandbox Code Playgroud)
即:两个script.sql
但在不同的位置。
script.sql
刚刚下的内容x:\some\where
简直了
prompt SCRIPT root
Run Code Online (Sandbox Code Playgroud)
而另一个script.sql
的内容是
prompt SCRIPT main-dir/main-subdir
Run Code Online (Sandbox Code Playgroud)
call-script.sql
阅读
@@script.sql
@ script.sql
Run Code Online (Sandbox Code Playgroud)
如果我从 SQL*Plus 启动x:\some\where
然后执行
@main-dir/main-sub-dir/call-scripts
Run Code Online (Sandbox Code Playgroud)
输出将是
SCRIPT main-dir/main-subdir
SCRIPT root
Run Code Online (Sandbox Code Playgroud)
这是意料之中的,因为单曲@
应该从 SQL*Plus 的启动位置@@
搜索路径,并且应该从包含脚本的目录中搜索路径。
现在,如果我call-scripts.sql
这样改变:
@@./script.sql
@ ./script.sql
Run Code Online (Sandbox Code Playgroud)
double@@
似乎改变了它的行为,因为它从 SQL*Plus 开始的位置搜索路径,现在输出将是
SCRIPT root
SCRIPT root
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的。
这种行为是否记录在某处,更重要的是,我必须如何更改call-scripts.sql
才能@@../../other-dir/other-sub-dir/script
正确调用相对路径 ( …
曾使用至少两种顶级 DB 产品(例如 Oracle、SQL Server、Informix、Sybase、DB2、Teradata)在 SQL 方面进行可扩展性工作的人是否知道 DB 供应商的 SQL 方言彼此之间有何不同。由于我来自 Oracle 背景,因此我对
start with .. connect by
想到)select x, y from a, b where...
)问题可能归结为这些功能是否以及在多大程度上受 ansi 标准的监管。
实际上,我想知道是否有“经验法则”可以指示我是否(以及如何)采用在一个数据库上运行的 SQL DML 语句并让它在另一个数据库上运行。
我正在寻找(最好)一个 SQL 语句,该语句为任何带有外键的表选择表/和列名到 Sybase 中的给定表。我认为sys...
表格应该以某种方式可能,但对 sybase 来说是全新的,我无法理解它。因此,任何朝着正确方向发展的帮助都受到高度赞赏。
编辑:为了完整起见:SELECT @@VERSION
返回
'Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb 5 05:26:23 2010'
编辑 2 非常
感谢您的建议,尤其是Andrew Bickerton 的评论。这使我能够构建一个基本的 SQL 选择语句,作为更进一步的起点。
如果其他人对它感兴趣,这里是:
select
fko.name "Foreign key name",
par.name "Referenced table name",
fk1.name || ' -> ' || pk1.name "Reference 1",
fk2.name || ' -> ' || pk2.name "Reference 2",
fk3.name || ' -> ' || pk3.name "Reference 3",
fk4.name || ' -> ' || pk4.name "Reference 4"
from …
Run Code Online (Sandbox Code Playgroud) 我想写一个简单的 tail -f
实用程序来“跟踪”数据库中某些数字的进度:
create or replace function tail_f return varchar2_tab pipelined as
n number;
begin
loop
exit when ...
select count(*) into n from ... where ...;
pipe row(sysdate || ' n= ' || n);
dbms_lock.sleep(60);
end loop;
return;
end tail_f;
Run Code Online (Sandbox Code Playgroud)
然后我想select * from table(tail_f)
在 SQL*Plus 中。
为了一一获取行,我SET ARRAYSIZE 1
. 然而,记录(第一个除外)是成对获取的。
对此是否有解释,以及如何在通过管道传输后立即获取记录?
在我看来,应该可以用包sys.diana
和解析现有的 PL/SQL sys.pidl
,但我在互联网上没有找到任何东西,除了一些似乎解开包装包的脚本(这对我的目的来说是无用的) )。
那么,有没有人知道指向正确方向的指针?
sybase isql 中的默认输出(文本)宽度为 80。-w
当在命令行上启动 isql 时,可以使用标志更改它:
isql -w 200 -S... -U... -P...
Run Code Online (Sandbox Code Playgroud)
现在,我想知道当我已经连接时是否有可能更改文本宽度。我会期待类似的东西
1> set columnwidth 200
2> go
Run Code Online (Sandbox Code Playgroud)
或类似的东西。然而,在文档中我无法找到这个方向的东西。那么,这是否意味着这是不可能的,还是我找错了地方?
我有我想重新定义的下表:
create table tq84_redefinition (
id number primary key,
ts1 timestamp not null,
ts2 timestamp
);
Run Code Online (Sandbox Code Playgroud)
请注意not null
对列的约束ts1
。
使用dbms_redefinition
,我专门使用copy_constraints => true
.
create table tq84_redefinition_int (
id number, -- Note: no primary key to prevent «ORA-01408: such column list already indexed»
ts1 date,
ts2 date,
duration_minutes as ((ts2 - ts1) * 24 * 60)
);
begin
dbms_redefinition.start_redef_table(
user, 'tq84_redefinition', 'tq84_redefinition_int',
'id, ' ||
'to_date(to_char(ts1, ''ddmmyyyyhh24miss''), ''ddmmyyyyhh24miss'') ts1, ' ||
'to_date(to_char(ts2, ''ddmmyyyyhh24miss''), ''ddmmyyyyhh24miss'') ts2'); …
Run Code Online (Sandbox Code Playgroud) 我有一张桌子
create table w (
id integer primary key,
--
min_xyz double,
max_xyz double,
min_abc double,
max_abc double
);
Run Code Online (Sandbox Code Playgroud)
与min*
和max*
价值观目前正在null
。
我还有一张桌子
create table n (
id integer primary key,
---
xyz float,
abc float
);
Run Code Online (Sandbox Code Playgroud)
n:n
这些表之间有一个关系:
create table n_in_w (
n_id integer not null references n,
w_id integer not null references w
--- further attributes
);
Run Code Online (Sandbox Code Playgroud)
现在,我想通过连接 via用各自的值填充min*
和max*
属性。以下会做w
n
n_in_w
update w set
min_xyz = (select min(xyz) from …
Run Code Online (Sandbox Code Playgroud) 这是一张桌子
create table tq84_virtual_test_without (
col_1 number,
col_2 number,
col_3 number,
col_4 number,
col_5 number
);
Run Code Online (Sandbox Code Playgroud)
规则col_5
的值是其他四列的总和。
所以表格被相应地填充:
insert into tq84_virtual_test_without values( 1, 2, 3, 4, 10);
insert into tq84_virtual_test_without values( 3, 8, 7, 5, 23);
commit;
Run Code Online (Sandbox Code Playgroud)
现在,假设需要复制一行并仅更改一列的值。这当然可以非常优雅地完成(恕我直言,也就是说)使用rowtype-variable,就像这样
declare
r tq84_virtual_test_without%rowtype;
begin
select * into r from tq84_virtual_test_without where col_2 = 8;
r.col_4 := r.col_4 - 2;
r.col_5 := r.col_5 - 2;
insert into tq84_virtual_test_without values r;
end;
/
Run Code Online (Sandbox Code Playgroud)
这很优雅,因为它不会用insert into …
我相信我偶然发现了 PL/Scope 与关联数组相结合的错误,但也许我忽略了一些东西。
我有以下包裹
create or replace package tq84_pkg_c as
procedure proc_1;
end tq84_pkg_c;
/
Run Code Online (Sandbox Code Playgroud)
用它的身体
create or replace package body tq84_pkg_c as
type num_t is table of number index by varchar2(10);
procedure proc_2 is begin
null;
end proc_2;
procedure proc_1 is
v_num num_t;
begin
if v_num.exists(1) then
proc_2;
end if;
end proc_1;
end tq84_pkg_c;
/
Run Code Online (Sandbox Code Playgroud)
我用“PL/Scope”编译包:
ALTER SESSION SET PLSCOPE_SETTINGS='IDENTIFIERS:ALL';
ALTER PACKAGE TQ84_PKG_C COMPILE;
Run Code Online (Sandbox Code Playgroud)
然后,我查询all_identifiers
:
select
name identifier,
usage,
type,
usage_id,
usage_context_id,
line,
col
from
all_identifiers
where …
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL 代理来安排过程的执行。
第一次执行该过程时,它运行没有问题。第二次执行作业(步骤)时,它不会完成。
以下 SQL 语句的变体告诉我正在运行的语句是create procedure xyz...
(其中xyz
是作业应该运行的过程的名称)。
select
prc.loginame,
prc.program_name,
sql.text sql_text
from
sys.sysprocesses prc cross apply
sys.dm_exec_sql_text(prc.sql_handle) sql
Run Code Online (Sandbox Code Playgroud)
我在程序(或其他方式)中没有执行任何 DDL,并且想知道是什么导致作业尝试创建程序以及作业为何挂起?