В Oracle не существует такого понятия, как столбцы «auto_increment» или «identity», как в Oracle 11g . Однако вы можете легко смоделировать его с помощью последовательности и триггера:
Определение таблицы:
CREATE TABLE departments (
ID NUMBER(10) NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL);
ALTER TABLE departments ADD (
CONSTRAINT dept_pk PRIMARY KEY (ID));
CREATE SEQUENCE dept_seq START WITH 1;
Определение триггера:
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END;
/
IDENTITY
столбец теперь доступен в Oracle 12c:
create table t1 (
c1 NUMBER GENERATED by default on null as IDENTITY,
c2 VARCHAR2(10)
);
или укажите начальные значения и значения приращения, также предотвращая любую вставку в столбец идентификаторов (GENERATED ALWAYS
) (снова , Только Oracle 12c +)
create table t1 (
c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
c2 VARCHAR2(10)
);
Кроме того, Oracle 12 также позволяет использовать последовательность в качестве значения по умолчанию:
CREATE SEQUENCE dept_seq START WITH 1;
CREATE TABLE departments (
ID NUMBER(10) DEFAULT dept_seq.nextval NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL);
ALTER TABLE departments ADD (
CONSTRAINT dept_pk PRIMARY KEY (ID));
Невозможно обойтись без публикации всей страницы с помощью UpdatePanels. Вместо редизайна приложения вот несколько вещей, которые я бы попробовал:
#each
возвращает коллекцию, в которой вы выполняли итерацию. Тем не менее, следующий код вернет значение line.scan (regexp).
line.scan(regex).each do |matched|
output << matched.join("|") << "\n"
end
Если вы хотите вернуть результат выполнения, вы можете использовать карту
, которая работает как каждый
, но возвращает измененную коллекцию.
class LineMatcher
class << self
def match(line, regex)
line.scan(regex).map do |matched|
matched.join("|")
end.join("\n") # remember the final join
end
end
end
Есть несколько полезных методов, которые вы можете использовать в зависимости от вашего очень конкретного случая. В этом случае вы можете использовать inject
, если только количество результатов, возвращаемых сканированием
, не велико (работа с массивами и их слияние более эффективно, чем работа с отдельной строкой).
class LineMatcher
class << self
def match(line, regex)
line.scan(regex).inject("") do |output, matched|
output << matched.join("|") << "\n"
end
end
end
end
В ruby возвращаемое значение метода - это значение, возвращаемое последним оператором. Вы также можете выбрать явный возврат.
В вашем примере первый фрагмент возвращает строку output
. Второй фрагмент, однако, возвращает значение, возвращаемое методом each
(который теперь является последним stmt), который оказывается массивом совпадений.
irb(main):014:0> "StackOverflow Meta".scan(/[aeiou]\w/).each do |match|
irb(main):015:1* s << match
irb(main):016:1> end
=> ["ac", "er", "ow", "et"]
Обновление: Однако это все еще не объясняет вашу вывод в одной строке. Думаю это ошибка форматирования, он должен выводить каждое совпадение в отдельной строке, потому что так put
печатает массив. Небольшой код может объяснить это лучше, чем я ..
irb(main):003:0> one_to_three = (1..3).to_a
=> [1, 2, 3]
irb(main):004:0> puts one_to_three
1
2
3
=> nil
Лично я считаю ваш метод с явным возвратом более читабельным (в данном случае)