2008-11-20 27 views
15

Excuting dòng của SQL:Oracle lỗi: ORA-00.905: từ khóa Thiếu

SELECT * 
    INTO assignment_20081120 
    FROM assignment ; 

chống lại một cơ sở dữ liệu trong oracle để sao lưu một bảng gọi là nhiệm vụ mang lại cho tôi những lỗi ORACLE sau: ORA-00.905: Thiếu từ khóa

+0

Đối với những người tìm kiếm điều này từ tìm kiếm của Google như tôi đã làm, mặc dù không phải lý do duy nhất ở trên không thành công, tôi nhận được lỗi này khi tôi khai báo biến mà không chỉ định loại của nó. – vapcguy

Trả lời

18

Trừ khi có một hàng trong bảng ASSIGNMENTASSIGNMENT_20081120 là biến PL/SQL cục bộ loại ASSIGNMENT%ROWTYPE, đây không phải là điều bạn muốn.

Giả sử bạn đang cố gắng để tạo ra một bảng mới và sao chép dữ liệu hiện có để mà bảng mới

CREATE TABLE assignment_20081120 
AS 
SELECT * 
    FROM assignment 
3

Trước tiên, tôi nghĩ:

"...In Microsoft SQL Server the SELECT...INTO automatically creates the new table whereas Oracle seems to require you to manually create it before executing the SELECT...INTO statement..."

Nhưng sau khi tự tạo ra một bảng, nó vẫn không hoạt động, vẫn hiển thị lỗi "từ khóa bị thiếu".

Vì vậy, tôi đã từ bỏ thời gian này và giải quyết nó bằng cách trước hết bằng tay tạo bảng, sau đó sử dụng "cổ điển" SELECT tuyên bố:

INSERT INTO assignment_20081120 SELECT * FROM assignment; 

nào làm việc như mong đợi. Nếu có ai đó đưa ra một giải thích về cách sử dụng SELECT...INTO một cách chính xác, tôi sẽ hạnh phúc!

+4

Giải thích đơn giản là 'SELECT..INTO' là * PL/SQL * cú pháp, không phải SQL - nó mong đợi một biến PL/SQL để chấp nhận kết quả của truy vấn. –

3

Bạn có thể sử dụng lựa chọn bên trong khối PLSQL như dưới đây.

Declare 
    l_variable assignment%rowtype 
begin 
    select * 
    into l_variable 
    from assignment; 
exception 
    when no_data_found then 
    dbms_output.put_line('No record avialable') 
    when too_many_rows then 
    dbms_output.put_line('Too many rows') 
end; 

Mã này sẽ chỉ hoạt động khi có chính xác 1 hàng khi chuyển nhượng. Thông thường, bạn sẽ sử dụng loại mã này để chọn một hàng cụ thể được xác định bằng một số khóa.

Declare 
    l_variable assignment%rowtype 
begin 
    select * 
    into l_variable 
    from assignment 
    where ID=<my id number>; 
exception 
    when no_data_found then 
    dbms_output.put_line('No record avialable') 
    when too_many_rows then 
    dbms_output.put_line('Too many rows') 
end; 
0

Trả lời muộn, nhưng tôi vừa mới có trong danh sách này ngay hôm nay!

TẠO TABLE assignment_20101120 AS SELECT * FROM assignment;

Làm tương tự.

+7

Đó là những gì Justin Cave đã nói gần hai năm trước ... –

0

Mặc dù điều này không liên quan trực tiếp đến câu hỏi chính xác của OP nhưng tôi chỉ phát hiện ra rằng sử dụng từ dành riêng cho Oracle trong truy vấn của bạn (trong trường hợp của tôi là bí danh IN) có thể gây ra lỗi tương tự.

Ví dụ:

SELECT * FROM TBL_INDEPENTS IN 
JOIN TBL_VOTERS VO on IN.VOTERID = VO.VOTERID 

Hoặc nếu nó trong truy vấn chính nó như là một tên trường

SELECT ..., ...., IN, ..., .... FROM SOMETABLE 

Đó cũng sẽ ném lỗi đó. Tôi hi vọng điêu nay se giup được ai đo.

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