DB2 12 - Selecting values while inserting data


Volta a página anterior

Volta ao Menu Principal


Desenvolvido por DORNELLES, Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

DB2 12 - Selecionando valores ao inserir dados - Selecting values while inserting data

Ao inserir linhas em uma tabela, você pode selecionar valores dessas linhas ao mesmo tempo.
When you insert rows into a table, you can select values from those rows at the same time.

Sobre esta tarefa - About this task

Você pode selecionar valores de linhas que estão sendo inseridas, especificando a instrução INSERT na cláusula FROM da instrução SELECT.
Ao inserir uma ou mais novas linhas em uma tabela, você pode recuperar:
You can select values from rows that are being inserted by specifying the INSERT statement in the FROM clause of the SELECT statement.
When you insert one or more new rows into a table, you can retrieve:

  • O valor de uma coluna gerada automaticamente, como um ROWID ou coluna de identidade
    The value of an automatically generated column such as a ROWID or identity column

  • Quaisquer valores padrão para colunas
    Any default values for columns

  • Todos os valores de uma linha inserida, sem especificar nomes de colunas individuais
    All values for an inserted row, without specifying individual column names

  • Todos os valores inseridos por uma operação INSERT de várias linhas
    All values that are inserted by a multiple-row INSERT operation

  • Valores que são alterados por um gatilho BEFORE INSERT
    Values that are changed by a BEFORE INSERT trigger

Exemplo: - Example:

Além dos exemplos que usam as tabelas de amostra do Db2, os exemplos neste tópico usam uma tabela EMPSAMP que tem a seguinte definição:
In addition to examples that use the Db2 sample tables, the examples in this topic use an EMPSAMP table that has the following definition:

   CREATE TABLE EMPSAMP
     (EMPNO     INTEGER GENERATED ALWAYS AS IDENTITY,
      NAME      CHAR(30),
      SALARY    DECIMAL(10,2),
      DEPTNO    SMALLINT,
      LEVEL     CHAR(30),
      HIRETYPE  VARCHAR(30) NOT NULL WITH DEFAULT 'New Hire',
      HIREDATE  DATE NOT NULL WITH DEFAULT);

Suponha que você precise inserir uma linha para um novo funcionário na tabela EMPSAMP.
Para descobrir os valores das colunas EMPNO, HIRETYPE e HIREDATE geradas, use a seguinte instrução SELECT FROM INSERT:
Assume that you need to insert a row for a new employee into the EMPSAMP table.
To find out the values for the generated EMPNO, HIRETYPE, and HIREDATE columns, use the following SELECT FROM INSERT statement:

   SELECT EMPNO
   ,      HIRETYPE
   ,      HIREDATE
   FROM   FINAL TABLE 
         (INSERT INTO EMPSAMP 
                (NAME
          ,      SALARY
          ,      DEPTNO
          ,      LEVEL)
                 VALUES
                ('Mary Smith'
          ,      35000.00
          ,      11
          ,      'Associate'));

A instrução SELECT retorna o valor de identidade gerado pelo Db2 para a coluna EMPNO, o valor padrão 'Nova contratação' para a coluna HIRETYPE e o valor do registro especial CURRENT DATE para a coluna HIREDATE.
The SELECT statement returns the Db2-generated identity value for the EMPNO column, the default value 'New Hire' for the HIRETYPE column, and the value of the CURRENT DATE special register for the HIREDATE column.

Recomendação: - Recommendation:

Use a instrução SELECT FROM INSERT para inserir uma linha em uma tabela pai e recuperar o valor de uma chave primária que foi gerada pelo Db2 (um ROWID ou coluna de identidade).
Em outra instrução INSERT, especifique este valor gerado como um valor para uma chave estrangeira em uma tabela dependente.
Use the SELECT FROM INSERT statement to insert a row into a parent table and retrieve the value of a primary key that was generated by Db2 (a ROWID or identity column).
In another INSERT statement, specify this generated value as a value for a foreign key in a dependent table.

Tabela de resultados da operação INSERT: - Result table of the INSERT operation:

As linhas que são inseridas na tabela de destino produzem uma tabela de resultados cujas colunas podem ser referenciadas na lista SELECT da consulta.
As colunas da tabela de resultados são afetadas pelas colunas, restrições e gatilhos definidos para a tabela de destino:
The rows that are inserted into the target table produce a result table whose columns can be referenced in the SELECT list of the query.
The columns of the result table are affected by the columns, constraints, and triggers that are defined for the target table:

  • A tabela de resultados inclui valores gerados pelo Db2 para colunas de identidade, colunas ROWID ou colunas de carimbo de data / hora de alteração de linha.
    The result table includes Db2-generated values for identity columns, ROWID columns, or row change timestamp columns.

  • Antes de o Db2 gerar a tabela de resultados, ele impõe quaisquer restrições que afetem a operação de inserção (ou seja, restrições de verificação, restrições de índice exclusivo e restrições de integridade referencial).
    Before Db2 generates the result table, it enforces any constraints that affect the insert operation (that is, check constraints, unique index constraints, and referential integrity constraints).

  • A tabela de resultados inclui todas as alterações resultantes de um gatilho BEFORE que é ativado pela operação de inserção.
    Um gatilho AFTER não afeta os valores na tabela de resultados.
    The result table includes any changes that result from a BEFORE trigger that is activated by the insert operation.
    An AFTER trigger does not affect the values in the result table.

Exemplo: - Example:

Suponha que um gatilho BEFORE INSERT seja criado na tabela EMPSAMP para dar a todos os novos funcionários no nível de Associado um aumento de $ 5.000 no salário.
O gatilho tem a seguinte definição:
Suppose that a BEFORE INSERT trigger is created on table EMPSAMP to give all new employees at the Associate level a $5000 increase in salary.
The trigger has the following definition:

   CREATE TRIGGER NEW_ASSOC
     NO CASCADE BEFORE INSERT ON EMPSAMP
     REFERENCING NEW AS NEWSALARY
     FOR EACH ROW MODE DB2SQL
       WHEN (NEWSALARY.LEVEL = 'ASSOCIATE')
       BEGIN ATOMIC
         SET NEWSALARY.SALARY = NEWSALARY.SALARY + 5000.00;
       END;

A instrução INSERT na cláusula FROM da seguinte instrução SELECT insere um novo funcionário na tabela EMPSAMP:
The INSERT statement in the FROM clause of the following SELECT statement inserts a new employee into the EMPSAMP table:

   SELECT NAME, SALARY
   FROM   FINAL TABLE 
         (INSERT INTO EMPSAMP 
                     (NAME
          ,           SALARY
          ,           LEVEL)
               VALUES
                     ('Mary Smith'
          ,           35000.00
          ,           'Associate'));

A instrução SELECT retorna um salário de 40.000,00 para Mary Smith em vez do salário inicial de 35.000,00 que foi especificado explicitamente na instrução INSERT.
The SELECT statement returns a salary of 40000.00 for Mary Smith instead of the initial salary of 35000.00 that was explicitly specified in the INSERT statement.

Selecionando valores ao inserir uma única linha: - Selecting values when you insert a single row:

Ao inserir uma nova linha em uma tabela, você pode recuperar qualquer coluna na tabela de resultados da instrução SELECT FROM INSERT.
Ao incorporar essa instrução em um aplicativo, você recupera a linha nas variáveis ??do host usando a forma SELECT ... INTO da instrução.
When you insert a new row into a table, you can retrieve any column in the result table of the SELECT FROM INSERT statement.
When you embed this statement in an application, you retrieve the row into host variables by using the SELECT ... INTO form of the statement.

Exemplo: - Example:

Você pode recuperar todos os valores de uma linha inserida em uma estrutura:
You can retrieve all the values for a row that is inserted into a structure:

   EXEC SQL 
        SELECT * 
        INTO  :empstruct
        FROM   FINAL TABLE 
              (INSERT INTO EMPSAMP 
                      (NAME
               ,       SALARY
               ,       DEPTNO
               ,       LEVEL)
                    VALUES
                      ('Mary Smith'
               ,       35000.00
               ,       11
               ,       'Associate'));

Para este exemplo,: empstruct é uma estrutura de variável do host que é declarada com variáveis ??para cada uma das colunas na tabela EMPSAMP.
For this example, :empstruct is a host variable structure that is declared with variables for each of the columns in the EMPSAMP table.

Selecionando valores ao inserir dados em uma visualização: - Selecting values when you insert data into a view:

Se a instrução INSERT fizer referência a uma visão definida com uma condição de pesquisa, essa visão deverá ser definida com a opção WITH CASCADED CHECK OPTION.
Quando você insere dados na visualização, a tabela de resultados da instrução SELECT FROM INSERT inclui apenas as linhas que satisfazem a definição da visualização.
If the INSERT statement references a view that is defined with a search condition, that view must be defined with the WITH CASCADED CHECK OPTION option.
When you insert data into the view, the result table of the SELECT FROM INSERT statement includes only rows that satisfy the view definition.

Exemplo: - Example:

Como a visualização V1 é definida com a opção WITH CASCADED CHECK OPTION, você pode fazer referência a V1 na instrução INSERT:
Because view V1 is defined with the WITH CASCADED CHECK OPTION option, you can reference V1 in the INSERT statement:

   CREATE VIEW V1 AS
          SELECT C1
          ,      I1 
          FROM   T1 
          WHERE  I1 > 10
          WITH CASCADED CHECK OPTION;

   SELECT C1 
   FROM   FINAL TABLE 
        (INSERT INTO V1 (I1) VALUES(12));

O valor 12 satisfaz a condição de pesquisa da definição da visualização e a tabela de resultados consiste no valor de C1 na linha inserida.
The value 12 satisfies the search condition of the view definition, and the result table consists of the value for C1 in the inserted row.

Se você usar um valor que não satisfaça a condição de pesquisa da definição da visualização, a operação de inserção falhará e o Db2 retornará um erro.
If you use a value that does not satisfy the search condition of the view definition, the insert operation fails, and Db2 returns an error.

Seleção de valores ao inserir várias linhas: - Selecting values when you insert multiple rows:

Em um programa de aplicativo, para recuperar valores da inserção de várias linhas, declare um cursor de forma que a instrução INSERT esteja na cláusula FROM da instrução SELECT do cursor.
In an application program, to retrieve values from the insertion of multiple rows, declare a cursor so that the INSERT statement is in the FROM clause of the SELECT statement of the cursor.

Exemplo: - Example:

Inserindo linhas com valores ROWID: para ver os valores das colunas ROWID que são inseridas na foto do funcionário e na tabela de currículo, você pode declarar o seguinte cursor:
Inserting rows with ROWID values: To see the values of the ROWID columns that are inserted into the employee photo and resume table, you can declare the following cursor:

   EXEC SQL DECLARE CS1 CURSOR FOR
        SELECT EMP_ROWID
        FROM   FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                    SELECT EMPNO FROM DSN8C10.EMP);

Exemplo: - Example:

Usando a cláusula FETCH FIRST: para ver apenas as cinco primeiras linhas que são inseridas na foto do funcionário e na tabela de currículo, use a cláusula FETCH FIRST:
Using the FETCH FIRST clause: To see only the first five rows that are inserted into the employee photo and resume table, use the FETCH FIRST clause:

   EXEC SQL DECLARE CS2 CURSOR FOR
        SELECT EMP_ROWID
        FROM FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                    SELECT EMPNO FROM DSN8C10.EMP)
        FETCH FIRST 5 ROWS ONLY;

Exemplo: - Example:

Usando a cláusula INPUT SEQUENCE: para recuperar as linhas na ordem em que foram inseridas, use a cláusula INPUT SEQUENCE:
Using the INPUT SEQUENCE clause: To retrieve rows in the order in which they are inserted, use the INPUT SEQUENCE clause:

   EXEC SQL DECLARE CS3 CURSOR FOR
        SELECT EMP_ROWID
        FROM FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                    VALUES(:hva_empno)
                    FOR 5 ROWS)
        ORDER BY INPUT SEQUENCE;

A cláusula INPUT SEQUENCE pode ser especificada apenas se uma instrução INSERT estiver na cláusula FROM da instrução SELECT.
Neste exemplo, as linhas são inseridas a partir de uma matriz de números de funcionários.
The INPUT SEQUENCE clause can be specified only if an INSERT statement is in the FROM clause of the SELECT statement.
In this example, the rows are inserted from an array of employee numbers.

Exemplo: - Example:

Inserindo linhas com vários CCSIDs de codificação:
Suponha que você deseja preencher uma tabela ASCII com valores de uma tabela EBCDIC e, em seguida, ver os valores selecionados da tabela ASCII.
Você pode usar o seguinte cursor para selecionar as colunas EBCDIC, preencher a tabela ASCII e, em seguida, recuperar os valores ASCII:

Inserting rows with multiple encoding CCSIDs:
Suppose that you want to populate an ASCII table with values from an EBCDIC table and then see selected values from the ASCII table.
You can use the following cursor to select the EBCDIC columns, populate the ASCII table, and then retrieve the ASCII values:

   EXEC SQL DECLARE CS4 CURSOR FOR
        SELECT C1, C2
        FROM   FINAL TABLE (INSERT INTO ASCII_TABLE
                     SELECT * FROM EBCDIC_TABLE);

Selecionando uma coluna adicional ao inserir dados: - Selecting an additional column when you insert data:

Você pode usar a cláusula INCLUDE para apresentar uma nova coluna à tabela de resultados, mas não adicionar uma coluna à tabela de destino.
You can use the INCLUDE clause to introduce a new column to the result table but not add a column to the target table.

Exemplo: - Example:

Suponha que você precise inserir os dados do número do departamento na tabela do projeto.
Suponha também que você deseja recuperar o número do departamento e o número do gerente correspondente para cada departamento.
Como MGRNO não é uma coluna na tabela do projeto, você pode usar a cláusula INCLUDE para incluir o número do gerenciador em seu resultado, mas não na operação de inserção.
A seguinte instrução SELECT FROM INSERT executa a operação de inserção e recupera os dados.

Suppose that you need to insert department number data into the project table.
Suppose also, that you want to retrieve the department number and the corresponding manager number for each department.
Because MGRNO is not a column in the project table, you can use the INCLUDE clause to include the manager number in your result but not in the insert operation.
The following SELECT FROM INSERT statement performs the insert operation and retrieves the data.

DECLARE CS1 CURSOR FOR
 SELECT manager_num, projname FROM FINAL TABLE
   (INSERT INTO PROJ (DEPTNO) INCLUDE(manager_num CHAR(6))
      SELECT DEPTNO, MGRNO FROM DEPT);

Tabela de resultados do cursor ao inserir várias linhas: - Result table of the cursor when you insert multiple rows:

Em um programa de aplicação, ao inserir várias linhas em uma tabela, você declara um cursor de forma que a instrução INSERT esteja na cláusula FROM da instrução SELECT do cursor.
A tabela de resultados do cursor é determinada durante o processamento do cursor OPEN.
A tabela de resultados pode ou não ser afetada por outros processos em seu aplicativo.

In an application program, when you insert multiple rows into a table, you declare a cursor so that the INSERT statement is in the FROM clause of the SELECT statement of the cursor.
The result table of the cursor is determined during OPEN cursor processing.
The result table may or may not be affected by other processes in your application.

Efeito na sensibilidade do cursor: - Effect on cursor sensitivity:

Quando você declara um cursor rolável, o cursor deve ser declarado com a palavra-chave INSENSITIVE se uma instrução INSERT estiver na cláusula FROM da especificação do cursor.
A tabela de resultados é gerada durante o processamento do cursor OPEN e não reflete quaisquer alterações futuras.
Você não pode declarar o cursor com as palavras-chave SENSITIVE DYNAMIC ou SENSITIVE STATIC.

When you declare a scrollable cursor, the cursor must be declared with the INSENSITIVE keyword if an INSERT statement is in the FROM clause of the cursor specification.
The result table is generated during OPEN cursor processing and does not reflect any future changes.
You cannot declare the cursor with the SENSITIVE DYNAMIC or SENSITIVE STATIC keywords.

Efeito das atualizações e exclusões pesquisadas: - Effect of searched updates and deletes:

Quando você declara um cursor não rolável, quaisquer atualizações ou exclusões pesquisadas não afetam a tabela de resultados do cursor.
As linhas da tabela de resultados são determinadas durante o processamento do cursor OPEN.
When you declare a non-scrollable cursor, any searched updates or deletes do not affect the result table of the cursor.
The rows of the result table are determined during OPEN cursor processing.

Exemplo: - Example:

Suponha que seu aplicativo declare um cursor, abra o cursor, execute uma busca, atualize a tabela e, em seguida, busque linhas adicionais:
Assume that your application declares a cursor, opens the cursor, performs a fetch, updates the table, and then fetches additional rows:

EXEC SQL DECLARE CS1 CURSOR FOR
  SELECT SALARY
  FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY, LEVEL)
                    SELECT NAME, INCOME, BAND FROM OLD_EMPLOYEE);

EXEC SQL OPEN CS1;
EXEC SQL FETCH CS1 INTO :hv_salary;
/* print fetch result */
...
EXEC SQL UPDATE EMPSAMP SET SALARY = SALARY + 500;
while (SQLCODE == 0) {
  EXEC SQL FETCH CS1 INTO :hv_salary;
  /* print fetch result */
  ...
}

As buscas que ocorrem após as atualizações retornam as linhas que foram geradas quando o cursor foi aberto.
Se você usar um SELECT simples (sem nenhuma instrução INSERT na cláusula FROM), as buscas podem retornar os valores atualizados, dependendo do caminho de acesso que o Db2 usa.

The fetches that occur after the updates return the rows that were generated when the cursor was opened.
If you use a simple SELECT (with no INSERT statement in the FROM clause), the fetches might return the updated values, depending on the access path that Db2 uses.

Efeito de WITH HOLD: - Effect of WITH HOLD:

Quando você declara um cursor com a opção WITH HOLD e abre o cursor, todas as linhas são inseridas na tabela de destino.
A opção WITH HOLD não tem efeito na instrução SELECT FROM INSERT da definição do cursor.
Depois que seu aplicativo executa uma confirmação, você pode continuar a recuperar todas as linhas inseridas.

When you declare a cursor with the WITH HOLD option and open the cursor, all of the rows are inserted into the target table.
The WITH HOLD option has no effect on the SELECT FROM INSERT statement of the cursor definition.
After your application performs a commit, you can continue to retrieve all of the inserted rows.

Exemplo: - Example:

Suponha que a tabela de funcionários no aplicativo de amostra Db2 tenha cinco linhas. Seu aplicativo declara um cursor WITH HOLD, abre o cursor, busca duas linhas, executa uma confirmação e, em seguida, busca a terceira linha com sucesso:
Assume that the employee table in the Db2 sample application has five rows.
Your application declares a WITH HOLD cursor, opens the cursor, fetches two rows, performs a commit, and then fetches the third row successfully:

EXEC SQL DECLARE CS2 CURSOR WITH HOLD FOR
  SELECT EMP_ROWID
  FROM FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                    SELECT EMPNO FROM DSN8C10.EMP);
EXEC SQL OPEN CS2;                                /* Inserts 5 rows */
EXEC SQL FETCH CS2 INTO :hv_rowid;   /* Retrieves ROWID for 1st row */
EXEC SQL FETCH CS2 INTO :hv_rowid;   /* Retrieves ROWID for 2nd row */
EXEC SQL COMMIT;                                  /* Commits 5 rows */
EXEC SQL FETCH CS2 INTO :hv_rowid;   /* Retrieves ROWID for 3rd row */

Efeito de SAVEPOINT e ROLLBACK: - Effect of SAVEPOINT and ROLLBACK:

Um ponto de salvamento é um ponto no tempo dentro de uma unidade de recuperação para o qual as alterações do banco de dados relacional podem ser revertidas.
Você pode definir um ponto de salvamento com a instrução SAVEPOINT.
A savepoint is a point in time within a unit of recovery to which relational database changes can be rolled back.
You can set a savepoint with the SAVEPOINT statement.

Quando você define um ponto de salvamento antes de abrir o cursor e depois volta para esse ponto de salvamento, todas as inserções são desfeitas
When you set a savepoint prior to opening the cursor and then roll back to that savepoint, all of the insertions are undone.

Exemplo:- Example:

Suponha que seu aplicativo declare um cursor, defina um ponto de salvamento, abra o cursor, defina outro ponto de salvamento, reverta para o segundo ponto de salvamento e, em seguida, reverta para o primeiro ponto de salvamento:
Assume that your application declares a cursor, sets a savepoint, opens the cursor, sets another savepoint, rolls back to the second savepoint, and then rolls back to the first savepoint:

EXEC SQL DECLARE CS3 CURSOR FOR
  SELECT EMP_ROWID
  FROM FINAL TABLE (INSERT INTO DSN8C10.EMP_PHOTO_RESUME (EMPNO)
                    SELECT EMPNO FROM DSN8C10.EMP);
EXEC SQL SAVEPOINT A ON ROLLBACK RETAIN CURSORS;       /* Sets 1st savepoint */ 
EXEC SQL OPEN CS3;
EXEC SQL SAVEPOINT B ON ROLLBACK RETAIN CURSORS;       /* Sets 2nd savepoint */
...
EXEC SQL ROLLBACK TO SAVEPOINT B;  /* Rows still in DSN8C10.EMP_PHOTO_RESUME */ 
...
EXEC SQL ROLLBACK TO SAVEPOINT A;            /* All inserted rows are undone */

O que acontece se ocorrer um erro: - What happens if an error occurs:

Em um programa de aplicativo, quando você insere uma ou mais linhas em uma tabela usando a instrução SELECT FROM INSERT, a tabela de resultados da operação de inserção pode ou não ser afetada, dependendo de onde o erro ocorreu no processamento do aplicativo.
In an application program, when you insert one or more rows into a table by using the SELECT FROM INSERT statement, the result table of the insert operation may or may not be affected, depending on where the error occurred in the application processing.

Durante o processamento de SELECT INTO: - During SELECT INTO processing:

Se o processamento de inserção ou seleção falhar durante uma instrução SELECT INTO, nenhuma linha será inserida na tabela de destino e nenhuma linha será retornada da tabela de resultados da operação de inserção.
If the insert processing or the select processing fails during a SELECT INTO statement, no rows are inserted into the target table, and no rows are returned from the result table of the insert operation.

Exemplo: - Example:

Suponha que a tabela de funcionários do aplicativo de amostra Db2 tenha uma linha e que a coluna SALARY tenha um valor de 9999000,00.
Assume that the employee table of the Db2 sample application has one row, and that the SALARY column has a value of 9999000.00.

EXEC SQL SELECT EMPNO INTO :hv_empno
  FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY)
                    SELECT FIRSTNAME || MIDINIT || LASTNAME,
                           SALARY + 10000.00 
                    FROM DSN8C10.EMP)

A adição de 10000,00 faz com que ocorra um estouro decimal e nenhuma linha é inserida na tabela EMPSAMP.
The addition of 10000.00 causes a decimal overflow to occur, and no rows are inserted into the EMPSAMP table.

Durante o processamento do cursor OPEN: - During OPEN cursor processing:

Se a inserção de qualquer linha falhar durante o processamento do cursor OPEN, todas as inserções anteriormente bem-sucedidas serão desfeitas.
A tabela de resultados da inserção está vazia.
If the insertion of any row fails during the OPEN cursor processing, all previously successful insertions are undone.
The result table of the insert is empty.

Durante o processamento FETCH: - During FETCH processing:

Se a instrução FETCH falhar ao recuperar linhas da tabela de resultados da operação de inserção, um SQLCODE negativo será retornado ao aplicativo, mas a tabela de resultados ainda conterá o número original de linhas que foi determinado durante o processamento do cursor OPEN.
Neste ponto, você pode desfazer todas as inserções.

If the FETCH statement fails while retrieving rows from the result table of the insert operation, a negative SQLCODE is returned to the application, but the result table still contains the original number of rows that was determined during the OPEN cursor processing.
At this point, you can undo all of the inserts.

Exemplo: - Example:

Suponha que a tabela de resultados contenha 100 linhas e a 90ª linha que está sendo buscada do cursor retorne um SQLCODE negativo:
Assume that the result table contains 100 rows and the 90th row that is being fetched from the cursor returns a negative SQLCODE:

EXEC SQL DECLARE CS1 CURSOR FOR
  SELECT EMPNO
  FROM FINAL TABLE (INSERT INTO EMPSAMP (NAME, SALARY)
                    SELECT FIRSTNAME || MIDINIT || LASTNAME, SALARY + 10000.00 
                      FROM DSN8C10.EMP);
EXEC SQL OPEN CS1;                                 /* Inserts 100 rows */
while (SQLCODE == 0) 
  EXEC SQL FETCH CS1 INTO :hv_empno;
if (SQLCODE == -904)           /* If SQLCODE is -904, undo all inserts */
  EXEC SQL ROLLBACK;
else                                           /* Else, commit inserts */
  EXEC SQL COMMIT;
  • Preserving the order of a derived table
    Ao especificar SELECT FROM INSERT, SELECT FROM UPDATE, SELECT FROM DELETE ou SELECT FROM MERGE, você pode preservar a ordem da tabela derivada.
    Esta ação garante que as linhas de resultados de uma seleção completa sigam a mesma ordem que a tabela de resultados de uma subconsulta na seleção completa.

    When you specify SELECT FROM INSERT, SELECT FROM UPDATE, SELECT FROM DELETE, or SELECT FROM MERGE, you can preserve the order of the derived table.
    This action ensures that the result rows of a fullselect follow the same order as the result table of a subquery within the fullselect.

Tópico pai: Inserting data into tables



© Copyright IBM Corp.