2012-01-20 14 views
13

Tôi đang cố gắng cập nhật bản ghi trong nhà phát triển SQL oracle bằng cách sử dụng Tham gia. Sau đây là query- tôiLỗi SQL: ORA-00933: Lệnh SQL không được kết thúc đúng cách

UPDATE system_info set field_value = 'NewValue' 
FROM system_users users 
JOIN system_info info ON users.role_type = info.field_desc 
where users.user_name = 'uname' 

Tuy nhiên, khi tôi đã cố gắng để thực hiện nó, tôi đã sai sót sau

Error report: SQL Error: ORA-00933: SQL command not properly ended 
       00933. 00000 - "SQL command not properly ended" 

Tôi đã cố gắng loại bỏ NỐI

UPDATE system_info info 
SET info.field_value = 'NewValue' 
FROM system_users users 
where users.user_name = 'uname' AND users.role_type = info.field_desc 

nhưng vẫn có cùng một lỗi ai cũng có thể cho tôi biết lý do và giải pháp lỗi

+0

Tôi nghĩ rằng sqlDevelepor của bạn đã thực hiện dòng trước đó.đặt một dấu chấm phẩy trước và sau câu lệnh sql của bạn và thử lại –

+0

Tôi đã thử giải pháp của bạn, nhưng không làm việc cho tôi –

Trả lời

12

Oracle không cho phép nối các bảng trong câu lệnh UPDATE. Bạn cần phải viết lại tuyên bố của bạn với một phụ chọn

Something đồng liên quan như thế này:

UPDATE system_info 
SET field_value = 'NewValue' 
WHERE field_desc IN (SELECT role_type 
        FROM system_users 
        WHERE user_name = 'uname') 

Đối với một mô tả đầy đủ về cú pháp (có giá trị) của câu lệnh UPDATE, vui lòng đọc hướng dẫn:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10008.htm#i2067715

+0

Thấy điều này lần đầu tiên kể từ khi nó được xếp vào Bình luận (vào tháng 11 năm 2016). Điều này không đúng: Oracle cho phép tham gia trong một UPDATE, nhưng có một số hạn chế (những cái hiển nhiên, được yêu cầu bởi logic, không phải bởi Oracle). Trường hợp quan niệm sai lầm rất phổ biến này mà Oracle không cho phép một để cập nhật một tham gia đến từ đâu? Làm thế nào cập nhật với công việc gia nhập được thảo luận ví dụ ở đây: http://stackoverflow.com/questions/37001180/update-with-join-syntax-for-oracle-database – mathguy

+0

@mathguy: Oracle cho phép cập nhật một bảng có nguồn gốc (phụ -query) mà có thể theo các hạn chế nhất định sử dụng một tham gia (chủ yếu là: truy vấn cần phải là một "chìa khóa bảo quản bảng"). Nhưng đó là một cái gì đó khác nhau sau đó chỉ đơn giản là tham gia bảng mục tiêu để bàn khác (trong đó có ít hạn chế trong những DBMS hỗ trợ này) –

+0

Chính xác - đó là không giống như "Oracle không cho phép tham gia bảng trong một tuyên bố UPDATE." Tôi biết điều đó, và rõ ràng bạn cũng biết điều đó; Bây giờ tìm kiếm thông qua SO và xem bao nhiêu lần mọi người đưa ra câu lệnh đó, ngay cả trong (nhiều) trường hợp khi cập nhật thông qua một phép nối sẽ hoạt động hoàn toàn tốt, nếu chỉ có người sử dụng cú pháp thích hợp và họ có ràng buộc duy nhất thích hợp trong bảng nguồn. Tôi vừa tạo một bài viết Tài liệu để thảo luận về điều này, chúng tôi sẽ xem liệu nó có được chấp thuận hay không. – mathguy

1

Truy vấn của bạn sẽ trông như thế

UPDATE table_name 
SET column1=value, column2=value2,... 
WHERE some_column=some_value 

Bạn có thể kiểm tra các câu hỏi dưới đây để được giúp đỡ

+0

Các tham gia ANSI được hỗ trợ bởi Oracle – Sathya

+0

@Sathya: nhưng không phải trong câu lệnh UPDATE. –

+0

@a_horse_with_no_name ah. Cảm ơn. – Sathya

-6

nó rất đúng về oracle cũng như sql là "người sử dụng" là một từ dành riêng chỉ cần thay đổi nó, nó sẽ phục vụ u là tốt nhất nếu u muốn thay đổi nó thành này

UPDATE system_info set field_value = 'NewValue' 

FROM system_users users JOIN system_info info ON users.role_type = info.field_desc where users.user_name = 'uname'

+3

'người dùng' không ** là một từ dành riêng! 'user' tuy nhiên là một từ dành riêng. Nhưng vấn đề thực sự là, Oracle không cho phép FROM hoặc JOIN trong một câu lệnh UPDATE. –

2

Không chính xác các trường hợp bối cảnh thực tế của câu hỏi này, nhưng ngoại lệ này có thể được sao chép bởi các truy vấn tiếp theo:

update users set dismissal_reason='he can't and don't want' where userid=123 

Trích dẫn đơn lẻ bằng các từ can'tdon't đã phá vỡ chuỗi. Trong trường hợp chuỗi chỉ có một trích dẫn bên trong, ví dụ: 'anh ta không muốn' oracle ném liên quan hơn chuỗi trích dẫn không đúng chấm dứt lỗi, nhưng trong trường hợp hai lệnh SQL không đúng cách kết thúc được ném.

Tóm tắt: kiểm tra truy vấn của bạn để biết các dấu nháy kép.

10

Dấu chấm phẩy ; vào cuối lệnh đã gây ra lỗi tương tự đối với tôi.

cmd.CommandText = "INSERT INTO U_USERS_TABLE (USERNAME, PASSWORD, FIRSTNAME, LASTNAME) VALUES (" 
       + "'" + txtUsername.Text + "'," 
       + "'" + txtPassword.Text + "'," 
       + "'" + txtFirstname.Text + "'," 
       + "'" + txtLastname.Text + "');"; <== Semicolon in "" is the cause. 
                 Removing it will be fine. 

Hy vọng điều đó sẽ hữu ích.

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