2017-11-22 77 views
5

Tôi gặp sự cố khi thực thi/gọi thủ tục Oracle trong R qua ROracle. Tôi đã thử nhiều cách khác nhau để gọi thủ tục và tôi tiếp tục nhận được các lỗi tương tự. Tôi không gặp vấn đề gì khi thực hiện các truy vấn SELECT nhưng gọi thủ tục đang chứng minh khó khăn. Tôi đã sử dụng cả hai hàm oracleProc và dbSendQuery, nhưng không có kết quả. Không ai trong số họ làm việc. Roracle tài liệu là pathetic cho các ví dụ về thủ tục gọi điện thoại.Thực hiện quy trình oracle được lưu trữ trong R bằng ROracle

Giả sử quy trình Oracle được gọi là MYPROC trong MYSCHEMA. Thủ tục rất đơn giản với NO thông số (nó liên quan đến đọc một vài bảng và viết vào một bảng)

Khi tôi thực hiện các thủ tục trực tiếp trong Oracle Developer, không có vấn đề:

các công trình sau đây trong Oracle Developer (nhưng không phải trong R)

EXEC MYSCHEMA.MYPROC; 

Sau đó, tôi thử gọi thủ tục tương tự từ R (qua ROracle) và cho tôi lỗi. Tôi đã thử nhiều cách khác nhau để gọi thủ tục tôi nhận được cùng một lỗi:

# This didn't work in R 
> require(ROracle) 
> LOAD_query <- oracleProc(con1, "BEGIN EXEC MYSCHEMA.MYPROC; END;") 

Đây là lỗi tôi nhận được:

Lỗi trong .oci.oracleProc (conn, tuyên bố, data = dữ liệu , prefetch = prefetch,:

# Then i tried the following and it still didn't work 
> LOAD_query <- oracleProc(con1, "EXEC MYSCHEMA.MYPROC;") 

Đây là lỗi tôi đã nhận (một chút khác biệt so với một trên):

Lỗi trong .oci.oracleProc (conn, tuyên bố, data = dữ liệu, prefetch = prefetch,: ORA-00.900: câu lệnh SQL không hợp lệ

# so then i tried dbSendQuery which works perfectly fine with any SELECT statements but it didn't work 
> LOAD_query <- dbSendQuery(con1, "BEGIN EXEC MYSCHEMA.MYPROC; END;") 

Đây là lỗi tôi nhận được (giống như cái đầu tiên):

Lỗi trong .oci.SendQuery (conn, tuyên bố, data = dữ liệu, prefetch = prefetch,:

# I even tried the following to exhaust all possibilities. And still no luck. I get the same error as above: 
> LOAD_query <- oracleProc(con1, "BEGIN EXEC MYSCHEMA.MYPROC(); END;") 

Quy trình của tôi không có bất kỳ thông số nào. Như tôi đã đề cập, nó hoạt động tốt khi được gọi trong nhà phát triển Oracle. Tôi đã hết ý tưởng làm thế nào để có được một công việc truy vấn đơn giản như vậy trong R! Tôi chỉ quan tâm đến công việc này thông qua ROracle.

+1

Tôi không biết ROracle nhưng tôi có thể cho bạn biết EXECUTE là lệnh SQL \ * Plus. Lệnh này không hợp lệ trong các cuộc gọi SQL hoặc PL/SQL. Hãy thử 'LOAD_query <- oracleProc (con1," MYSCHEMA.MYPROC ")'. Đoán của tôi là bạn không cần bán dấu hai chấm, nhưng có lẽ bạn làm. – APC

+0

Cảm ơn @APC, điều đó rất hữu ích !! Trong khi đề xuất "MYSCHEMA.MYPROC" của bạn không hoạt động, tôi đã thử các phiên bản chạy khác nhau nó không có EXEC và tôi đã tìm ra giải pháp: "BEGIN MYSCHEMA, MYPROC; END, "Woohoo. PS- bạn sẽ cần, vào cuối cuộc gọi thủ tục, khác với sendQuery, cái mà không nên có; ở cuối. Rất nhiều mâu thuẫn!>; - { PSS- EXEC hoặc EXECUTE cả hai đều làm việc trong PLSQL để thực hiện thủ tục – Ankhnesmerira

Trả lời

1

Bạn đã tạo (biên dịch) quy trình trước chưa? Ví dụ: dbGetQuery (con, "TẠO THỦ TỤC MYPROC ...")

Sau đó cố gắng thực hiện các thủ tục như thế này: oracleProc (con, "BEGIN myproc(); END;")

Bạn nói đúng ROracle rằng :: tài liệu oracleProc là không tốt ví dụ này. đã giúp tôi: https://community.oracle.com/thread/4058424

+0

Tôi chắc chắn không cần phải sử dụng dbGetQuery, thủ tục này đã được tạo và tôi không có quyền tạo các thủ tục trên lược đồ cụ thể. EXEC hoạt động: > LOAD_query <- oracleProc (con1, "BEGIN MYSCHEMA.MYPROC; END;") – Ankhnesmerira

-1

Bạn đã thử sử dụng gói DBI (chứ không phải là gói ROracle)?

driver <- dbDriver("Oracle") 
connection <- dbConnect(driver, ... = <connection_parameters>) 
result <- dbGetQuery(connection, "<QUERY>") 
Các vấn đề liên quan