小编ber*_*d_k的帖子

如何将使用临时表或表变量的 SQL Server 存储过程迁移到 Oracle?

受管理层鼓励编写 SQL Server 存储过程的 C# 开发人员经常会产生这样的过程

create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Run Code Online (Sandbox Code Playgroud)

单个语句相当简单,这种方法使它们产生正确的结果。

我的任务通常是将这些过程迁移到 Oracle。

让我们面对以下事实。

  • SQL Server 中不同的临时表是完全独立的,可以有任何临时结构。
  • Oracle 全局公用表是全局对象,所有用途都共享相同的表结构。修改此结构是不可能的,但它可以在任何地方使用。

我从 Oracle dba 那里学到的一件事是尽可能避免使用临时表。甚至 SQL 服务器上的性能也受益于此类修改。

用联合替换单个刀片

在最简单的情况下,上面的可以转换成类似

select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 oracle migration stored-procedures

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

如何删除当前正在使用和处于单用户模式的 SQL Server 数据库

我在 SQL Server 2008 上有一个数据库,我想删除它。目前它处于单用户模式并且正在使用中。

select * from sys.sysprocesses
Run Code Online (Sandbox Code Playgroud)

返回

Msg 924, Level 14, State 1, Line 1
Database 'G_MAIN_DE' is already open and can only have one user at a time.
Run Code Online (Sandbox Code Playgroud)

我不知道如何识别我必须杀死的会话。

尝试将其设置为离线

ALTER DATABASE G_MAIN_DE SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

产量

Msg 5064, Level 16, State 1, Line 1
Changes to the state or options of database 'G_MAIN_DE' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it. …
Run Code Online (Sandbox Code Playgroud)

sql-server

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

这是 Oracle Where exists (Select NULL FROM...) 中的一种新的常见模式吗?

多年前,写

where exists (Select * from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)

去年我注意到许多 t-sql 脚本切换到使用数字 1 而不是星号

where exists (Select 1 from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)

就在所以我看到了这个 Oracle 示例

WHERE EXISTS (SELECT NULL FROM ...
Run Code Online (Sandbox Code Playgroud)

这是 Oracle 的常见模式吗?哪些是使用这样的东西的性能参数。

oracle sql-server style

8
推荐指数
2
解决办法
1117
查看次数

用分号或下一行的斜杠终止Oracle sql语句有什么区别?

在 sql*plus 中执行时,以下两个查询似乎是等效的:

1.

select * from user_tables;
Run Code Online (Sandbox Code Playgroud)

2.

select * from user_tables
/
Run Code Online (Sandbox Code Playgroud)

两个版本有什么区别吗?

oracle

8
推荐指数
2
解决办法
4529
查看次数

ORA-01502: 此类索引的索引或分区处于可用状态问题

我的 Oracle 数据库中有一个表,其中

select pkcol, count(*) from myTable group by pkcol having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

产量

  PKCOL   COUNT(*)
------- ----------
      1          2
      2          2
Run Code Online (Sandbox Code Playgroud)

试图删除重复的行

delete myTable where pkcol = 1;
Run Code Online (Sandbox Code Playgroud)

产量:

ORA-01502: 索引“MYTABLE.PK_MT”或此类索引的分区处于可用状态。

我正在使用 Oracle.DataAccess.Client.OracleBulkCopy 来填充表格。

据我了解,必须检查Oracle PRIMARY KEY 约束的文档。

显然它们没有被检查,正如我通过连续两次执行相同的批量复制而发现的,这些批量复制以所有行中的重复结束。

现在我只在删除所有行后才使用它,并且我正在使用一个具有类似主键的表作为源。因此,我预计不会有任何问题。

但是深深嵌入到我的 MS Build 脚本中,我最终在 2210 行中只有 2 个重复。

我想首先忽略主键是一个明显的错误。不允许批量复制忽略主键约束。

编辑:

同时我发现,在调用bulkcopy之前,通常由某个脚本插入的2个冲突行。问题归结为我的已知问题,bulkcopy 不会在这里检查主键。

oracle-11g bulkcopy

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

如何将大量表的主键转换为聚集主键,以保持引用标识

发现后,我最好将主键从非集群更改为集群。比照有关标识列的聚集索引这个问题,下一步就是如何在prcatical的方式做到这一点。

我很惊讶我没有在 SO 上找到这个问题。

在我的表之间有参考引用,我不能简单地做

if object_id('MyChild') > 0 drop table MyChild
if object_id('Mytable') > 0 drop table Mytable
create table Mytable(
    id int Not NULL
)
go
create table MyChild(
    id int Not NULL,
    masterid int NULL
)
go
alter table Mytable add constraint PK_Mytable primary key  (id)
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
-- Now I want to change the primary key into a clustered primary key
-- this throws …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 clustered-primary-key

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

尝试从 SQL Developer 运行 SQL Tuning Advisor 时出现 ORA-13605

尝试使用 SQL Developer 的 SQL Tuning Advisor 时,出现此错误。

几天前调优顾问正在工作。

在此处输入图片说明

oracle database-tuning oracle-sql-developer

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

如何处理多个 Oracle 主目录?

在我的桌面上,我在不同的家中安装了 Oracle 客户端和 Oracle ODAC。我需要 ODAC,因为客户端安装中的 ADO 组件无法正确处理 CLOB 数据。

我想我不能没有客户端安装,因为我需要一些 odbc 组件。

现在我必须维护 tnsnames.ora 文件的副本。我知道要做的事情是小心地保持两个 tnsnames.ora 同步。

对于这样的场景有更好的解决方案吗?

oracle

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

Microsoft 兼容级别的含义是什么?

在 SQL-Server 2005 上将 cmptlevel 设置为 80 会禁止使用 PIVOT 和 APPLY,但不会影响分析函数的使用。这背后有什么道理吗?

sql-server compatibility-level

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

如何在 Oracle 上查询给定的赠款?

在数据库上,我必须执行以下两条语句:

GRANT CREATE ANY TABLE TO MyUSER;
GRANT DROP ANY TABLE TO MyUSER;
Run Code Online (Sandbox Code Playgroud)

我想念的是告诉我这些赠款已提供的查询。我没有看到他们

select * from USER_TAB_PRIVS ORDER BY 2 ;
select * from USER_ROLE_PRIVS ORDER BY 1, 2;
Run Code Online (Sandbox Code Playgroud)

oracle

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