Chạy thủ tục lưu trữ trong nhà phát triển SQL?


81

Tôi đang cố gắng chạy một thủ tục được lưu trữ có nhiều tham số vào và ra. Chỉ có thể xem quy trình trong bảng điều khiển Kết nối của tôi bằng cách điều hướng Người dùng khác | | Gói hàng | |

Nếu tôi nhấp chuột phải, các mục menu là "Đặt hàng thành viên theo ..." và "Tạo đơn vị kiểm tra" (chuyển sang màu xám). Khả năng "Chạy" quy trình dường như không khả thi khi nó được người dùng truy cập.

Tôi đã cố gắng tìm một ví dụ về cách tạo một khối ẩn danh để tôi có thể chạy thủ tục dưới dạng tệp SQL, nhưng không tìm thấy bất kỳ thứ gì hoạt động.

Có ai biết cách tôi có thể thực hiện thủ tục này từ SQL Developer không? Tôi đang sử dụng Phiên bản 2.1.1.64.

Cảm ơn trước!

CHỈNH SỬA 1:

Thủ tục tôi muốn gọi có chữ ký này:

user.package.procedure(
   p_1 IN  NUMBER,
   p_2 IN  NUMBER,
   p_3 OUT VARCHAR2,
   p_4 OUT VARCHAR2,
   p_5 OUT VARCHAR2,
   p_6 OUT NUMBER)

Nếu tôi viết khối ẩn danh của mình như thế này:

DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;

Tôi gặp lỗi:

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

Tôi đã thử khởi tạo các biến out *:

   out1 VARCHAR2(100) := '';

nhưng gặp lỗi tương tự:

CHỈNH SỬA 2:

Dựa trên câu trả lời của Alex, tôi đã thử xóa dấu hai chấm ở phía trước các tham số và nhận được điều này:

Error starting at line 1 in command:
DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:

   := . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:


Thử đặt các biến OUT bên trong BEGIN, trước câu lệnh thực thi thủ tục.
OMG Ponies

Bạn không cần execute; trong PL / SQL được hiểu là bắt đầu execute immediate, khác với SQL execute.
Alex Poole

2
@sdoca: bạn đang nhầm lẫn giữa hai cách tiếp cận; với phiên bản chỉnh sửa 2 của bạn chỉ cần loại bỏ từ execute. Cái declarenên có trước cái begin. Ý tôi nghĩ @OMG là bạn có thể khai báo các biến trong SQL Developer trước khối ẩn danh với variabletừ khóa, sau đó sử dụng :out1cú pháp như ban đầu, trong trường hợp đó, bạn không có declarephần nào cả. Nhưng bạn đang trộn lẫn cả hai từ nhận xét cuối cùng của bạn.
Alex Poole

1
Đúng, tôi biết mình đã bối rối, nhưng không chắc ở đâu / như thế nào.
sdoca 22/10/10

Câu trả lời:


75

Với các kiểu tham số đơn giản (tức là không phải con trỏ, v.v.), bạn có thể làm như sau:

SET serveroutput on;
DECLARE
    InParam1 number;
    InParam2 number;
    OutParam1 varchar2(100);
    OutParam2 varchar2(100);
    OutParam3 varchar2(100);
    OutParam4 number;
BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;
/


Đã chỉnh sửa để sử dụng thông số kỹ thuật của OP và với một cách tiếp cận thay thế để sử dụng :varcác biến ràng buộc:

var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 33;
    :InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2,
        :OutParam1, :OutParam2, :OutParam3, :OutParam4);
END;
/

-- Display OUT parameters
print :OutParam1;
print :OutParam2;
print :OutParam3;
print :OutParam4;

1
+1 câu trả lời hay. Vì tò mò, bạn có biết cái nào được ưu tiên không?
Conrad Frix 21/10/10

@Conrad: Tôi tưởng tượng đó là một điều ưu tiên, mặc dù có thể có nhiều bối cảnh hơn khi chuyển :varcách. Tôi sẽ sử dụng declarecách này theo mặc định nếu tôi đang làm bất cứ điều gì với PL / SQL; nhưng tôi có thể sử dụng :varnếu, giả sử, tôi đang sử dụng một chút mã hiện có được sao chép từ Pro * C, mã này đã có cú pháp đó và tôi không muốn chạm vào parms trong cuộc gọi.
Alex Poole,

2
Cảm ơn sự giúp đỡ và câu trả lời chi tiết. Tôi chắc rằng nó cũng sẽ giúp ích cho những người khác. Một điều cần lưu ý là chúng phải được chạy dưới dạng script chứ không phải câu lệnh.
sdoca 22/10/10

1
Khi chạy trong trình phát triển sql, tôi không phải đặt tiền tố tên biến bằng :(trên thực tế, nó không hoạt động với nó).
haridsv

29

Thi công dễ dàng. Nhận được kết quả có thể khó khăn.

Hãy xem câu hỏi này tôi đã hỏi Cách / công cụ tốt nhất để nhận kết quả từ quy trình gói oracle

Bản tóm tắt của nó diễn ra như thế này.

Giả sử bạn có một Gói có tên là mypackage và thủ tục được gọi là getQuestions. Nó trả về một con trỏ chuột và lấy tên người dùng chuỗi.

Tất cả những gì bạn phải làm là tạo Tệp SQL mới (tệp mới). Đặt kết nối và dán vào phần sau và thực thi.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;

3
Tôi đã phải sử dụng từ đầy đủ "thực thi" thay vì "thực thi"
Patrick

21

Đối với những người sử dụng SqlDeveloper 3+, trong trường hợp bạn bỏ lỡ điều đó:

SqlDeveloper có tính năng thực thi trực tiếp proc / chức năng đã lưu trữ và kết quả đầu ra được hiển thị theo cách dễ đọc.

Chỉ cần nhấp chuột phải vào gói / hàm được lưu trữ / hàm được lưu trữ, Nhấp vào Runvà chọn targetlà proc / func bạn muốn thực thi, SqlDeveloper sẽ tạo đoạn mã để thực thi (để bạn có thể đặt các thông số đầu vào của mình). Sau khi thực thi, các tham số đầu ra được hiển thị ở nửa dưới của hộp thoại và thậm chí nó còn có hỗ trợ tích hợp cho con trỏ tham chiếu: kết quả của con trỏ sẽ được hiển thị dưới dạng tab đầu ra riêng biệt.


2
Đây sẽ là câu trả lời được chọn.
EvilTeach

12

Mở thủ tục trong SQL Developer và chạy nó từ đó. SQL Developer hiển thị SQL mà nó chạy.

BEGIN
  PROCEEDURE_NAME_HERE();
END;

6

Sử dụng:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

Thay thế "PACKAGE_NAME", "PROCEDURE_NAME" và "giá trị_thông số" bằng những gì bạn cần. Các tham số OUT sẽ cần phải được khai báo trước.


2

Mặc dù câu hỏi này khá cũ, nhưng tôi vẫn vấp phải kết quả tương tự mà không tìm ra cách dễ dàng để chạy từ nhà phát triển sql. Sau vài lần thử, tôi đã tìm thấy một cách dễ dàng để thực thi thủ tục được lưu trữ từ chính nhà phát triển sql.

  • Trong các gói, chọn gói mong muốn của bạn và nhấp chuột phải vào tên gói (không phải trên tên thủ tục được lưu trữ).

  • Bạn sẽ tìm thấy tùy chọn để chạy. Chọn nó và cung cấp các đối số bắt buộc. Nhấp vào OK và bạn có thể thấy kết quả trong phần biến đầu ra bên dưới

Tôi đang sử dụng phiên bản dành cho nhà phát triển SQL 4.1.3.20


1

Không có câu trả lời nào khác phù hợp với tôi. Đây là những gì tôi phải làm để chạy một thủ tục trong SQL Developer 3.2.20.10:

SET serveroutput on;
DECLARE
  testvar varchar(100);
BEGIN
  testvar := 'dude';
  schema.MY_PROC(testvar);
  dbms_output.enable;
  dbms_output.put_line(testvar);
END;

Và sau đó, bạn sẽ phải kiểm tra bảng xem proc của bạn phải làm gì với biến được truyền vào đó - đầu ra sẽ chỉ xác nhận rằng biến đã nhận giá trị (và về mặt lý thuyết, đã chuyển nó cho proc).

LƯU Ý (sự khác biệt với của tôi so với những người khác):

  • Không có :trước tên biến
  • Không đặt .package.hoặc .packages.giữa tên lược đồ và tên thủ tục
  • Không cần phải đặt &giá trị của biến.
  • Không sử dụng ở printbất cứ đâu
  • Không sử dụng varđể khai báo biến

Tất cả những vấn đề này khiến tôi phải vò đầu bứt tai trong thời gian dài nhất và những câu trả lời có những lỗi nghiêm trọng này sẽ được đưa ra và làm mờ đi và lông chim.


0

Không thể tin được, điều này sẽ không thực thi trong SQL Developer:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

NHƯNG điều này sẽ:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

Rõ ràng là mọi thứ phải nằm trong một dòng ..


2
[SQL * Plus docs cho executelệnh] nêu rõ điều đó. Mặc dù vậy, đây không phải là câu trả lời cho câu hỏi đã được hỏi và đã được đề cập trong các câu trả lời phù hợp hơn cho các câu hỏi khác trước đó.
Alex Poole

Đã có thể sử dụng nó trong SQL Developer. Cảm ơn
Sergejs

0

Sử dụng SQL Developer phiên bản 4.0.2.15 Xây dựng 15.21 các hoạt động sau:

SET SERVEROUTPUT ON
var InParam1 varchar2(100)
var InParam2 varchar2(100)
var InParam3 varchar2(100)
var OutParam1 varchar2(100)

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 'one';
    :InParam2 := 'two';
    :InParam3 := 'three';

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1);
    dbms_output.enable;
    dbms_output.put_line('OutParam1: ' || :OutParam1);
END;
/

Không, xin lỗi - vartrước khi các biến KHÔNG hoạt động - ít nhất là trong SQL Developer 3.2.20.10, và không nên sử dụng dấu hai chấm ở phía trước chúng - không cần thiết, một lần nữa, ít nhất là trong 3.2.20.10 (lý do duy nhất là tôi không không bỏ phiếu hoặc chỉnh sửa nó). Cũng sẽ cần dấu chấm phẩy sau SET SERVEROUTPUT ON.
vapcguy

0

Để chạy thủ tục từ SQL chỉ dành cho nhà phát triển, hãy thực hiện lệnh sau

THỰC HIỆN PROCEDURE_NAME;


-1

Tôi không thể nhận được câu trả lời của @Alex Poole hoạt động. Tuy nhiên, bằng cách dùng thử và gặp lỗi, tôi thấy các hoạt động sau (sử dụng SQL Developer phiên bản 3.0.04). Đăng nó ở đây trong trường hợp nó giúp ích cho người khác:

SET serveroutput on;

DECLARE
    var InParam1 number;
    var InParam2 number;
    var OutParam1 varchar2(100);
    var OutParam2 varchar2(100);
    var OutParam3 varchar2(100);
    var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;

2
Điều đó giống với phiên bản đầu tiên trong câu trả lời của tôi, ngoại trừ bạn đã thêm a varvào mỗi biến trong declarekhối, biến này không hợp lệ. Cố gắng chạy điều này cho kết quả là 'PLS-00103: Đã gặp biểu tượng "NUMBER" khi mong đợi một trong các biến sau ...' và các lỗi tương tự đối với năm biến còn lại.
Alex Poole

Tôi đồng ý với Alex. Bị phản đối vì var, và tôi không cần sử dụng .package.trong cuộc gọi của mình, ít nhất là trong 3.2.20.10, lẽ ra không quá khác biệt, và đã có lỗi khi tôi làm vậy. Lãng phí rất nhiều thời gian với câu trả lời này.
vapcguy

-1
--for setting buffer size needed most of time to avoid `anonymous block completed` message
set serveroutput on size 30000;

-- declaration block in case output need to catch
DECLARE
--declaration for in and out parameter
  V_OUT_1 NUMBER;
  V_OUT_2 VARCHAR2(200);
BEGIN

--your stored procedure name
   schema.package.procedure(
  --declaration for in and out parameter
    V_OUT_1 => V_OUT_1,
    V_OUT_2 => V_OUT_2
  );
  V_OUT_1 := V_OUT_1;
  V_OUT_2 := V_OUT_2;
  -- console output, no need to open DBMS OUTPUT seperatly
  -- also no need to print each output on seperat line 
  DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2);
END;

-2

Việc tạo khối Pl / SQL có thể khó khăn nếu bạn có nhiều thủ tục có nhiều tham số. Có một ứng dụng được viết trên python sẽ làm điều đó cho bạn. Nó phân tích cú pháp tệp với các khai báo thủ tục và tạo ứng dụng web để gọi thủ tục thuận tiện.


-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.