Вот полное решение с обработкой исключений / ошибок для автоматического приращения, это решение обратно совместимо и будет работать на 11g & amp; 12c, в частности, если заявка находится в производстве.
Пожалуйста, замените 'TABLE_NAME' на соответствующее имя таблицы
--checking if table already exisits
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
EXCEPTION WHEN OTHERS THEN NULL;
END;
/
--creating table
CREATE TABLE TABLE_NAME (
ID NUMBER(10) PRIMARY KEY NOT NULL,
.
.
.
);
--checking if sequence already exists
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE TABLE_NAME_SEQ';
EXCEPTION WHEN OTHERS THEN NULL;
END;
--creating sequence
/
CREATE SEQUENCE TABLE_NAME_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;
--granting rights as per required user group
/
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE_NAME TO USER_GROUP;
-- creating trigger
/
CREATE OR REPLACE TRIGGER TABLE_NAME_TS BEFORE INSERT OR UPDATE ON TABLE_NAME FOR EACH ROW
BEGIN
-- auto increment column
SELECT TABLE_NAME_SEQ.NextVal INTO :New.ID FROM dual;
-- You can also put some other required default data as per need of your columns, for example
SELECT SYS_CONTEXT('USERENV', 'SESSIONID') INTO :New.SessionID FROM dual;
SELECT SYS_CONTEXT('USERENV','SERVER_HOST') INTO :New.HostName FROM dual;
SELECT SYS_CONTEXT('USERENV','OS_USER') INTO :New.LoginID FROM dual;
.
.
.
END;
/
. Да, StreamReader
, StreamWriter
, BinaryReader
и BinaryWriter
все закрывают / удаляют свои базовые потоки когда вы вызываете для них Dispose
. Они не удаляют поток, если считывающее / записывающее устройство является просто сборщиком мусора - вы всегда должны избавляться от считывающего / записывающего устройства, предпочтительно с помощью оператора using
. (На самом деле ни у одного из этих классов нет финализаторов, да и не должно быть.)
Лично я предпочитаю также иметь оператор using для потока. Вы можете легко вложить с помощью операторов
без фигурных скобок:
поток, удаляемый либо с помощью ключевого слова using, либо явным вызовом dispose
Yes, it does. You can verify this by looking at the implementation with Reflector.
protected override void Dispose(bool disposing)
{
try
{
if ((this.Closable && disposing) && (this.stream != null))
{
this.stream.Close();
}
}
finally
{
if (this.Closable && (this.stream != null))
{
this.stream = null;
this.encoding = null;
this.decoder = null;
this.byteBuffer = null;
this.charBuffer = null;
this.charPos = 0;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
Yes. Calling Dispose() on and IDisposable (which "using" does) should make an object clean up all of its resources. This includes streams flushing and closing their file descriptors.
If, in your case, you want to pass it in to other methods, then you need to make sure that those methods do not do their reading/writing in a using block.