小编Ren*_*ger的帖子

术语“投影”在 SQL 查询(或视图定义)中指的是什么

在 Oracle 的文档The Query Optimizer 中,在View Merging 下,我找到了以下信息

视图合并优化适用于仅包含选择、投影和连接的视图。也就是说,可合并视图不包含集合运算符、聚合函数、DISTINCT、GROUP BY、CONNECT BY 等。 (强调我的)

然而,我只能猜测这样的投影实际上指的是什么。

oracle select

15
推荐指数
2
解决办法
3万
查看次数

SQL*Plus、@ 和相对路径

不知何故,似乎 SQL*Plus(至少在 Windows 上)在调用 with@@以及路径以单点或双点开头时无法定位具有相对路径的脚本。

例如,在x:\some\whereI下有以下目录结构:

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正确调用相对路径 ( …

oracle sqlplus scripting

9
推荐指数
1
解决办法
2万
查看次数

顶级数据库供应商的 SQL (DML-) 方言彼此之间有何不同?

曾使用至少两种顶级 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 语句并让它在另一个数据库上运行。

feature-comparison dml sql-standard

7
推荐指数
2
解决办法
4872
查看次数

如何识别具有指向 Sybase 中特定表的外键的表?

我正在寻找(最好)一个 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)

sybase referential-integrity

7
推荐指数
1
解决办法
2万
查看次数

如果我在 SQL*Plus 中设置 ARRAYSIZE 1,记录仍然是成对提取的。为什么?

我想写一个简单的 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. 然而,记录(第一个除外)是成对获取的。

对此是否有解释,以及如何在通过管道传输后立即获取记录?

oracle sqlplus

7
推荐指数
2
解决办法
1774
查看次数

使用 sys.diana 和 sys.pidl 解析 PL/SQL

在我看来,应该可以用包sys.diana和解析现有的 PL/SQL sys.pidl,但我在互联网上没有找到任何东西,除了一些似乎解开包装包的脚本(这对我的目的来说是无用的) )。

那么,有没有人知道指向正确方向的指针?

oracle plsql parse

6
推荐指数
1
解决办法
1835
查看次数

已经连接时,isql 是否有 -w 等效项?

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)

或类似的东西。然而,在文档中我无法找到这个方向的东西。那么,这是否意味着这是不可能的,还是我找错了地方?

sybase isql

5
推荐指数
1
解决办法
2010
查看次数

为什么在使用 dbms_redefinition 后 SQL*Plus 的 desc 表没有显示非空约束

我有我想重新定义的下表:

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)

oracle sqlplus dbms-redefinition

5
推荐指数
1
解决办法
3469
查看次数

如何使用相关表的聚合值(最小值、最大值)快速更新表?

我有一张桌子

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*属性。以下会做wnn_in_w

update w set 
  min_xyz = (select min(xyz) from …
Run Code Online (Sandbox Code Playgroud)

mysql

4
推荐指数
1
解决办法
9050
查看次数

如果 <table> 具有虚拟列,是否(以及如何)在 Oracle 中“插入到 <table> 值 <rowtype-variable>”

这是一张桌子

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 …

oracle oracle-11g-r2 insert virtual-columns

4
推荐指数
1
解决办法
1万
查看次数

PL/Scope 与关联数组结合使用是否存在错误?

我相信我偶然发现了 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)

oracle oracle-11g-r2 plsql

4
推荐指数
1
解决办法
564
查看次数

为什么 SQL Server 代理作业尝试创建过程

我正在使用 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,并且想知道是什么导致作业尝试创建程序以及作业为何挂起?

sql-server sql-server-agent

0
推荐指数
1
解决办法
95
查看次数