2012-02-27 21 views
6

Lấy lỗi trên khi thực hiện ngay lập tức được gọi là trong một vòng lặpORA-01.747: không hợp lệ user.table.column, table.column, hoặc cột đặc điểm kỹ thuật

Update CustomersPriceGroups set 1AO00=:disc Where cuno=:cuno 
    Parameters: disc=66 cuno=000974 
Update CustomersPriceGroups set 1AP00=:disc Where cuno=:cuno 
    Parameters: disc=70.5 cuno=000974 
Update CustomersPriceGroups set 1AQ00=:disc Where cuno=:cuno 
    Parameters: disc=66 cuno=000974 
Update CustomersPriceGroups set 1ZA00=:disc Where cuno=:cuno 
    Parameters: disc=60 cuno=000974 

này có ý nghĩa gì?

Dưới đây là đoạn mã

c:=PriceWorx.frcPriceListCustomers('020','221'); 
LOOP 
    fetch c into comno,cuno,nama,cpls; 
    exit when c%notfound; 
    dbms_output.put_Line(cuno); 
    g:=priceWorx.frcPriceListItemGroups('020','221'); 
    d:=priceworx.frcCustomerDiscounts('020','221',cuno); 
    loop 
    fetch g into comno,cpgs,n; 
    fetch d into comno,cpls,cuno,cpgs,stdt,tdat,qanp,disc,src; 
    --dbms_output.put(chr(9)||cpgs); 
    sQ:='Update saap.CustomersPriceGroups set "'|| trim(cpgs)||'"=:disc ' 
     || ' Where cuno=:cuno'; 
    execute immediate sQ using disc,cuno; 
    commit; 
    dbms_output.put_line(sQ); 
    dbms_output.put_line(chr(9)||'Parameters: disc='|| disc||' cuno='||cuno); 
    exit when g%notfound; 
    end loop; 
    close g; 
    close d; 
end loop; 

Trả lời

4

Số nhận dạng không được bỏ phiếu phải bắt đầu bằng ký tự chữ cái (xem rule 6 here). Bạn đang cố gắng chỉ định giá trị cho một cột có tên bắt đầu bằng một số 1AO00, 1AP00 v.v.

Nếu không thấy định nghĩa bảng cho CustomersPriceGroups, chúng tôi không biết có cột nào có tên đó hay không. Nếu có thì chúng phải được tạo ra như là định danh được trích dẫn. Nếu vậy, bạn sẽ phải đề cập đến chúng (ở khắp mọi nơi) với dấu ngoặc kép, điều này không lý tưởng - làm cho mã khó đọc hơn, giúp bạn dễ dàng mắc lỗi như thế này và khó có thể nhận ra điều gì sai. Ngay cả Oracle nói, trên cùng một trang:

Lưu ý: Oracle không khuyên bạn sử dụng số nhận dạng được trích dẫn cho cơ sở dữ liệu tên đối tượng. Các số nhận dạng được trích dẫn này được SQL * Plus chấp nhận, nhưng chúng có thể không hợp lệ khi sử dụng các công cụ khác quản lý cơ sở dữ liệu đối tượng.

Trong mã bạn, bạn dường như đang sử dụng dấu ngoặc kép khi gán sQ, nhưng kết quả bạn hiển thị không; nhưng nó cũng không có định danh lược đồ saap.. Đó có thể là do bạn không chạy phiên bản mã mà bạn nghĩ, nhưng có thể chỉ bị mất nếu bạn nhập lại dữ liệu thay vì dán nó - bạn cũng không hiển thị đầu ra trước đó là c.cuno. Nhưng nó cũng có thể bạn có, nói, trường hợp của tên cột sai.

Nếu execute đang ném lỗi, bạn sẽ không thấy lệnh đang được thực hiện vào khoảng thời gian xung quanh vòng lặp - vì bạn thấy các giá trị thành công, không phải là giá trị phá vỡ. Bạn cần phải kiểm tra tất cả các giá trị được trả về bởi các hàm; Tôi nghi ngờ rằng g đang trả lại giá trị cho cpgs thực sự không phải là tên cột hợp lệ.

Khi @ninesided cho biết, hiển thị thêm thông tin, đặc biệt là thông báo ngoại lệ đầy đủ, sẽ giúp xác định điều gì sai.

6

Nó có nghĩa là phân tích cú pháp Oracle cho rằng một trong các cột của bạn không hợp lệ. Điều này có thể là do bạn đã tham chiếu không chính xác một cột, tên cột là từ dành riêng, hoặc vì bạn có lỗi cú pháp trong câu lệnh UPDATE khiến Oracle nghĩ rằng cái gì đó không phải là một cột, là một cột. Nó sẽ thực sự giúp đỡ để xem các tuyên bố đầy đủ đang được thực hiện, định nghĩa của bảng CustomersPriceGroups và toàn văn của ngoại lệ được nâng lên, vì nó thường sẽ cho biết cột là có lỗi.

+1

Trong trường hợp của tôi, tôi có một dấu phẩy theo sau ',' trong câu lệnh 'insert'. –

+1

Trong trường hợp tên cột của tôi là từ dành riêng. – Chirag

+0

Tuyệt vời như thế nào tất cả những vấn đề khá khác nhau tạo ra thông báo lỗi tương tự. Nó không phải là nếu các phân tích cú pháp không biết những gì đã đi sai (mà nếu-check-chi nhánh), các kỹ sư đã được chỉ là quá lười biếng để làm cho thông báo lỗi cụ thể hơn. – masterxilo

17

kiểm tra truy vấn của bạn cho dấu phẩy kép.

insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3); 

(có thêm dấu phẩy sau COLUMN2).


Cập nhật: thời gian gần đây (một số người có tài năng đặc biệt) i thành công để có được cùng một ngoại lệ với cách tiếp cận mới:

update TABLE_NAME set COLUMN1=7, set COLUMN2=8 

(SET thứ hai là không cần thiết)

+0

giải thích câu trả lời của bạn với ít nhất hai hoặc nhiều dòng . để hiểu rõ hơn. – Hamad

+0

Cảm ơn. Tôi đã đặt thêm dấu phẩy trước dấu ngoặc đóng đầu tiên). Oracle dường như không bận tâm khi đưa ra các thông báo lỗi tốt. – masterxilo

1

Ngoài lý do trích dẫn trong các câu trả lời khác ở đây, bạn cũng có thể cần phải kiểm tra xem không có tên cột bảng nào của bạn có tên được coi là từ đặc biệt/được dành riêng trong cơ sở dữ liệu oracle.

Trong trường hợp của tôi, tôi có tên cột bảng uid. uid là một từ dành riêng trong oracle và do đó tôi đã nhận được lỗi này.

May mắn thay, bảng của tôi là một bảng mới và tôi không có dữ liệu trong đó. Tôi đã có thể sử dụng lệnh bảng DROP oracle để xóa bảng và tạo một bảng mới với tên đã sửa đổi cho cột vấn đề.

Tôi cũng gặp sự cố khi đổi tên cột vấn đề là oracle sẽ không cho phép tôi và tiếp tục ném lỗi.

0

nếu bạn thêm một thêm "" ở phần cuối của báo cáo kết quả thiết lập thay vì một lỗi cú pháp, bạn sẽ nhận được ORA-01.747, mà là rất rất kỳ quặc từ Oracle ví dụ

update table1 
    set col1 = 'Y', --this odd 1 
    where col2 = 123 
    and col3 = 456 
0

Nguyên nhân cũng có thể là khi bạn nhóm theo một tập hợp các cột khác nhau trong lựa chọn ví dụ:

select tab.a, tab.b, count(*) 
from ... 
where... 
group by tab.a, tab.c; 
0

Và tôi đã viết truy vấn như thế nào. Tôi phải xóa []

UPDATE SN.TableName 
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR, 
WHERE [USER_ID] ='12345' 

Gần đây, chúng tôi đã chuyển từ SQL Server sang Oracle.

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