[oracle] SQL Developer에서 저장 프로 시저 실행?



5 Answers

쉬운 실행. 결과를 얻는 것은 어려울 수 있습니다.

오라클 패키지 프로 시저의 결과를 얻으려면 가장 좋은 방법 / 도구를 물어 본이 질문을 살펴보십시오.

그것의 요약은 이렇게 간다.

mypackage라는 패키지와 getQuestions라는 프로 시저가 있다고 가정합니다. refcursor를 반환하고 문자열 사용자 이름을 사용합니다.

새 SQL 파일 (새 파일)을 작성하기 만하면됩니다. 연결을 설정하고 다음에 붙여 넣기하십시오.

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

나는 여러 개의 매개 변수가있는 저장 프로 시저를 실행하려고합니다. 프로 시저는 내 Connections 패널에서만 다른 사용자 | | 패키지 | |

마우스 오른쪽 버튼을 클릭하면 메뉴 항목이 "주문 회원 ..."및 "단위 테스트 만들기"(회색으로 표시됨)입니다. 프로 시저를 "실행"하는 기능은 사용자가 액세스 할 때 가능하지 않습니다.

SQL 파일로 프로 시저를 실행할 수 있도록 익명 블록을 만드는 방법에 대한 예제를 찾으려고 노력했지만 작동하는 것은 찾지 못했습니다.

누구든지 SQL Developer에서이 절차를 어떻게 실행할 수 있는지 알고 있습니까? 버전 2.1.1.64를 사용 중입니다.

미리 감사드립니다!

편집 1 :

호출하려는 프로 시저에는 다음 시그니처가 있습니다.

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)

다음과 같이 익명 블록을 작성하면

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;

오류가 발생했습니다.

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

out * 변수 초기화를 시도했습니다.

   out1 VARCHAR2(100) := '';

하지만 같은 오류가 발생합니다 :

편집 2 :

Alex의 대답에 따라 필자는 params 앞에서 콜론을 제거하고 다음과 같이 시도했습니다.

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:



이 다른 대답들 중 어느 것도 나를 위해 일하지 않았다. 다음은 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;

그리고 나서 프로 시저가 전달 된 변수로 무엇을해야하는지 테이블을 확인해야합니다. 출력은 변수가 값을 받았음을 확인하고 (이론적으로는 프로 시저에 전달했습니다) 확인할 것입니다.

참고 (광산과 다른 점)

  • 아니요 : 변수 이름 이전
  • .package. 하지 .package. 또는. .packages. 스키마 이름과 프로 시저 이름 사이
  • 변수의 값에 & 를 넣을 필요가 없습니다.
  • 어디서나 print 사용 안함
  • 변수를 선언 할 때 var 를 사용하지 않습니다.

이 모든 문제로 인해 가장 오랫동안 내 머리를 긁적이게되었고, 이러한 심각한 오류가 나왔고 타르와 깃털이 들게되었습니다.




SQL Developer 버전 4.0.2.15 Build 15.21을 사용하면 다음과 같은 작업이 가능합니다.

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;
/



var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;



@Alex Poole이 응답을 얻지 못했습니다. 그러나 시행 착오를 통해 SQL Developer 버전 3.0.04를 사용하여 다음 작업을 발견했습니다. 다른 사람들에게 도움이 될 수 있도록 여기에 게시하십시오.

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;



SQL Developer에서 프로 시저를 열고 거기에서 실행하십시오. SQL Developer는 실행되는 SQL을 표시합니다.

BEGIN
  PROCEEDURE_NAME_HERE();
END;


Related