2009-07-10 28 views
17

Tôi biết chúng tôi hiếm, chúng tôi là người nghèo đang sử dụng iSeries cho DB2/AS400, nhưng tôi hy vọng ai đó có thể trả lời câu hỏi đơn giản này. Có cách nào để trả về giá trị danh tính từ một câu lệnh chèn mà không sử dụng hai dòng SQL không? Tôi đang bị buộc phải sử dụng SQL nội tuyến trong C# để thực hiện một chèn, và sau đó tôi cần phải sử dụng danh tính tạo ra cho chèn cho một cái gì đó sau này. Nói một cách đơn giản, tôi cần tương đương với iSeries DB2 của "RETURNING" của Oracle. I.e.,iSeries DB2 - Có cách nào để chọn giá trị nhận dạng từ một câu lệnh chèn không?

INSERT INTO AwesomeTable (column1, column2, etc.) 
    VALUES (value1, value2, etc.) 
    RETURNING something; 

Bất kỳ ai? Cảm ơn trước.

EDIT: Trừ khi ai đó biết cách tôi có thể thực thi hai dòng SQL trong một IBM.Data.DB2.iSeries.iDB2Command (không phải là một proc được lưu trữ), tôi muốn làm điều này tất cả trong một dòng của SQL

+0

+1 Câu hỏi hay –

+0

Bạn đã giải quyết được vấn đề này chưa? Nếu có, vui lòng gửi câu trả lời của bạn. –

+0

@DamienJoe Tôi không còn sử dụng iSeries nữa và không có quyền truy cập vào bất kỳ hệ thống nào mà tôi có thể sử dụng để kiểm tra các câu trả lời này. Nếu bạn thấy rằng một trong số họ hoạt động, xin vui lòng bình luận ở đây và tôi sẽ đánh dấu câu trả lời là chấp nhận. –

Trả lời

7

Bạn cần sử dụng chức năng vô hướng IDENTITY_VAL_LOCAL. Từ IBM documentation:

IDENTITY_VAL_LOCAL là một chức năng không xác định rằng trả về gần đây nhất là giao giá trị cho một cột sắc.

Ví dụ:

CREATE TABLE EMPLOYEE 
    (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, 
    NAME CHAR(30), 
    SALARY DECIMAL(5,2), 
    DEPT SMALLINT) 

INSERT INTO EMPLOYEE 
    (NAME, SALARY, DEPTNO) 
    VALUES('Rupert', 989.99, 50) 

SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1 
+1

Trong chương trình C#, tôi có lẽ sẽ thêm sau đây như là một lệnh SQL thứ hai: "select identity_val_local() từ sysibm.sysdummy1" thay vì câu lệnh VALUES INTO trong ví dụ trên. –

+0

Cảm ơn, Tracy - gợi ý tốt. Tôi đã cập nhật câu trả lời. –

+0

Điều đó sẽ trả lại trường nhận dạng được chèn vào bởi thao tác mới nhất được thực hiện trên bất kỳ bảng nào và không phải bảng cụ thể đó. Hãy tưởng tượng một môi trường với nhiều người dùng chèn vào nhiều bảng cột nhận dạng? –

13

Tôi không chắc chắn của iSeries, nhưng sau đây làm việc trên db2v8.1:

Xem xét 'ID' là tên của cột danh tính của bạn. Các stmt sau sẽ trả lại id mới được tạo (một trong những tương tự mà được chèn vào bởi các stmt chèn):

SELECT ID FROM FINAL TABLE (
    INSERT INTO AwesomeTable (column1, column2, etc.) 
      VALUES (value1, value2, etc.)  
    ) 

Một số lời giải thích tôi tìm thấy trên các trang web publib: (tôi đã sử dụng nó để tham khảo để kiểm tra truy vấn của tôi trên)

 /* The following SELECT statement references an INSERT statement in its 
      FROM clause. It inserts an employee record from host variables into 
      table company_b. The current employee ID from the cursor is selected 
      into the host variable new_id. The keywords FROM FINAL TABLE 
      determine that the value in new_id is the value of ID after the 
      INSERT statement is complete. 

      Note that the ID column in table company_b is generated and without 
      the SELECT statement an additional query would have to be made in 
      order to retreive the employee's ID number. 
     */ 
     EXEC SQL SELECT ID INTO :new_id 
       FROM FINAL TABLE(INSERT INTO company_b 
       VALUES(default, :name, :department, :job, :years, :salary, 
         :benefits, :id)); 

Hope this helps :)

+1

Có, tôi cũng tìm thấy trang này trên trang web công cộng và không thể làm việc với iSeries. Cảm ơn nhiều vì phản hồi của bạn. –

+1

Bạn có nghĩa là FINAL TABLE không được hỗ trợ bởi iSeries? –

+1

FINAL TABLE được hỗ trợ bắt đầu với phiên bản 6.1. Đó là cách tiếp cận được khuyến nghị để xác định giá trị nhận dạng được sử dụng bởi một câu lệnh chèn. –

0

Dưới đây là một ví dụ:

CREATE TABLE AUTOINC (          
    AUTO91 INTEGER  GENERATED ALWAYS AS IDENTITY,   
    SCDS91 CHAR(35)  NOT NULL DEFAULT '',     
    MCLD91 DECIMAL(3,0) NOT NULL DEFAULT 0,      
    CONSTRAINT PK_AUTOINC PRIMARY KEY(AUTO91)); 

// Chú ý từ khóa mặc định trong đó trường tăng tự động là.

insert into AUTOINC Values(default ,'SYSC' , 0) 

// Và sử dụng hàm trả về giá trị cột nhận dạng cuối cùng.

// Lưu ý: chỉ tìm nạp hàng đầu tiên.

select **IDENTITY_VAL_LOCAL**() from AUTOINC **fetch first row only** 
+0

... Đây thực chất là bản sao của câu trả lời được đăng ở đây ** 2 năm trước **. Điều gì phân biệt câu trả lời của bạn với điều đó? –

Các vấn đề liên quan