【问题标题】:Variable manipulation in OracleOracle 中的变量操作
【发布时间】:2011-06-12 14:08:40
【问题描述】:

所以我整个下午都在网上寻找答案。我有一个看起来像这样的表:

CREATE TABLE ldap_domains (
    domain varchar(128) NOT NULL,
    name varchar(16) NOT NULL,
    description varchar(32) NOT NULL
)

ALTER TABLE ldap_domains
ADD CONSTRAINT pk_domain PRIMARY KEY (domain);

INSERT INTO ldap_domains VALUES ('test', 'test', 'test');
INSERT INTO ldap_domains VALUES ('test1', 'test', 'test');
INSERT INTO ldap_domains VALUES ('test2', 'test', 'test');
INSERT INTO ldap_domains VALUES ('test3', 'test', 'test');

我需要修改这个表,使一个新列成为主键。作为其中的一部分,我需要在应用约束之前使用唯一值更新新列。看起来像这样:

ALTER TABLE ldap_domains
DROP CONSTRAINT pk_domain;

ALTER TABLE ldap_domains
ADD id int;

DECLARE @key int
SET @key = 0
UPDATE ldap_domains SET @key = id = @key + 1;

ALTER TABLE ldap_domains
ALTER COLUMN id int NOT NULL;

ALTER TABLE ldap_domains
ADD CONSTRAINT pk_id PRIMARY KEY (id);

这在 SQLServer 上可以正常工作,但是,我也需要它来为 Oracle 工作。本质上,Oracle 不喜欢的部分是:

DECLARE @key int
SET @key = 0
UPDATE ldap_domains SET @key = id = @key + 1;

谁能赐教?

【问题讨论】:

    标签: sql sql-server oracle plsql


    【解决方案1】:

    Oracle 的语法不正确。

    你可以试试

    declare
      v_key integer := 0;
    begin
      update ldap_domains 
      set ldap_domains.key = v_key+1;
    end;
    

    我建议你复习一下 PL/SQL 语法,它有点不同。上面的代码示例只是一个起点,您可能还有更多工作要做,如果您想在 sqlplus 脚本中执行但不使用 PL/SQL 块,它看起来会有所不同。

    我也承认我对 SET @key = id = @key + 1; 会做什么感到困惑,所以我不能 100% 确定如何翻译它。这是 SQL-Server 功能吗?这句话的结果是什么?

    【讨论】:

    • 是的,我明白我输入的 SQL 不适用于 Oracle,因为它是为 SQLServer 编写的。到目前为止,我一直在尝试理解 Oracle 语法,但收效甚微。 SET部分的作用是更新key变量以及id列。
    • @AndyF:我不太熟悉您在更新中使用SET 的方式。我猜它确实如此 1)将id 的值分配给@key 2)将@key+1 的结果分配给id,这是正确的吗?
    • @key + 1 的值同时分配给 id 和 @key。
    【解决方案2】:

    看来您最初尝试将每一行设置为具有不同的 ID。在 Oracle 中执行此操作的首选方法是使用序列:

    CREATE SEQUENCE seq_ldap_domains START WITH 0;
    
    UPDATE ldap_domains SET id = seq_ldap_domains.nextval;
    

    这并不能保证插入的值是连续的(尽管在这种情况下,它们很可能是连续的),如果这相关的话。

    由于您不太可能有任何其他进程同时更新该字段,因此如果您真的不想创建序列,那么稍微作弊并使用类似的东西可能是安全的:

    UPDATE ldap_domains SET id = rownum-1;
    

    据我所知,您不能同时在 Oracle 中逐行读取和设置环境变量。

    【讨论】:

    • 太好了,这正是我想要的。简单迁移需要该脚本,所以稍微作弊就完美了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多