Переменные в Oracle - PullRequest
       10

Переменные в Oracle

1 голос
/ 20 января 2011

Так что я весь день копался в сети, чтобы найти ответ на этот вопрос.У меня есть таблица, которая выглядит так:

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;

Может кто-нибудь просветить меня?

Ответы [ 2 ]

3 голосов
/ 20 января 2011

Похоже, что вы пытаетесь изначально установить для каждой строки свой 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.

3 голосов
/ 20 января 2011

Ситнакс не подходит для 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-сервера?Каков будет результат этого заявления?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...