programing

SQL Developer에서 저장 프로시저를 실행하시겠습니까?

css3 2023. 3. 16. 21:40

SQL Developer에서 저장 프로시저를 실행하시겠습니까?

입력 및 출력 매개 변수가 여러 개인 저장 프로시저를 실행하려고 합니다.이 순서는 [연결(Connections)]패널에 네비게이트 할 때만 표시할 수 있습니다.

Other Users | <user> | Packages | <package> | <procedure>

마우스 오른쪽 버튼을 클릭하면 메뉴 항목은 "Order Members By...(멤버 주문 기준)"와 "Create Unit Test(유닛 테스트 작성)"(회색 표시)입니다.사용자가 프로시저를 액세스할 때는 프로시저를 "실행"할 수 없습니다.

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:

알렉스의 대답에 기초하여, 나는 가석방 앞에서 콜론을 제거하려고 시도했고, 이것을 얻었다.

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:

간단한 파라미터 유형(즉, 레퍼서 등이 아님)을 사용하여 다음과 같은 작업을 수행할 수 있습니다.

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


편집필 to use the OP's spec, and with an alternative approach to utilise :var bind variables:

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;

실행이 간단.결과를 얻는 것은 어려울 수 있습니다.

질문을 보세요.오라클 패키지 프로시저에서 결과를 얻을있는 최선의 방법/툴입니다.

그 요약은 다음과 같습니다.

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

새 SQL 파일(파일 새로 만들기)만 생성하면 됩니다.다음과 같이 연결 및 붙여넣기를 설정하고 실행한다.

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

SqlDeveloper 3+를 사용하고 있는 고객의 경우, 다음 사항을 놓쳤을 경우를 대비해서:

Sql Developer에는 저장된 proc/function을 직접 실행하는 기능이 있으며, 출력이 읽기 쉽게 표시됩니다.

function 후 [/stored proc/stored]를합니다.Run 선택합니다.target실행하는 proc/func가 되기 위해 SQL Developer는 실행할 코드 스니펫을 생성합니다(입력 파라미터를 입력할 수 있습니다).실행되면 출력 파라미터가 대화상자의 하반부에 표시되며 참조 커서 지원도 내장되어 있습니다. 커서 결과는 별도의 출력 탭으로 표시됩니다.

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;

용도:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

"PACKAGE_NAME", "PROCEDURE_NAME" 및 "parameter_value"를 필요한 것으로 대체합니다.OUT 파라미터는 다음에 선언해야 합니다.

이 질문은 꽤 오래된 질문이지만, sql developer에게 쉽게 실행할 수 있는 방법을 찾지 못하고 계속 같은 결과에 빠집니다.몇 번의 시도 끝에 sql developer 자체에서 저장 프로시저를 쉽게 실행할 수 있는 방법을 찾았습니다.

  • 패키지에서 원하는 패키지를 선택하고 저장 프로시저 이름이 아닌 패키지 이름을 마우스 오른쪽 버튼으로 클릭합니다.

  • 실행할 수 있는 옵션이 있습니다.이 항목을 선택하고 필요한 인수를 지정합니다.[확인]을 클릭하면 아래 출력 변수 섹션에서 출력을 볼 수 있습니다.

SQL 개발자 버전 4.1.3.20을 사용하고 있습니다.

이 대답들 중 어떤 것도 나에게는 통하지 않았다.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;

그런 다음 Proc가 전달된 변수에 대해 무엇을 해야 하는지 표를 확인해야 합니다. 출력은 변수가 값을 수신했음을 확인합니다(이론적으로 Proc에 전달).

참고(내 것과 다른 것의 차이):

  • .:
  • 팅팅지.package. ★★★★★★★★★★★★★★★★★」.packages.
  • 안 넣어도 요.&변수 값으로 지정합니다.
  • 안 함print
  • 안 함var

이 모든 문제들로 인해 저는 가장 오랫동안 머리를 긁적거리게 되었고, 이 엄청난 오류들을 제거해내고, 타르칠하고, 깃털로 덮어버리도록 했습니다.

SQL Developer에서는 이 기능이 실행되지 않는다니 믿을 수 없습니다.

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

print r;

단, 이것은 다음과 같습니다.

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

print r;

분명히 모든 것이 한 줄로 되어 있어야 합니다.

SQL Developer Version 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;
/

SQL developer-only에서 프로시저를 실행하려면 다음 명령을 실행하십시오.

EXECUTE PROCEDURE_NAME;

만, 제 패키지 타입커스텀 타입)이었습니다.T_CURSOR다음과 같이 정의되는 규약처럼 보입니다.REF CURSOR.

더 나은 방법이 있을 수 있지만 커서가 반복하고 있는 테이블의 모든 열에 대해 변수를 정의하고 커서를 루프하여 각 행으로 가져온 후 출력했습니다.

SET serveroutput on;
DECLARE
  testvar number;
  v_cur  SYS_REFCURSOR;
  ORIGINAL_EMP_NUM  NUMBER;
  TEMPORARY_EMP_NUM NUMBER;
  ORG_UNIT_CODE VARCHAR2(2 BYTE);
  MRU_CODE  VARCHAR2(10 BYTE);
  CTRL_COMPANY_CODE VARCHAR2(10 BYTE);
  IS_TEMP_FLAG  VARCHAR2(1 BYTE);
BEGIN
  testvar := 420;
  foo.updates.get_temporary_authorisations(testvar, v_cur);
  dbms_output.enable;
  dbms_output.put_line(testvar);
  
  LOOP
    FETCH v_cur INTO ORIGINAL_EMP_NUM, TEMPORARY_EMP_NUM, ORG_UNIT_CODE, MRU_CODE, CTRL_COMPANY_CODE, IS_TEMP_FLAG;
    EXIT WHEN v_cur%NOTFOUND;
    dbms_output.put_line(ORIGINAL_EMP_NUM || ',' || TEMPORARY_EMP_NUM || ',' || ORG_UNIT_CODE || ',' || MRU_CODE|| ',' || CTRL_COMPANY_CODE|| ',' || IS_TEMP_FLAG);
  END LOOP;
  CLOSE v_cur;
END;

나는 @Alex Pool의 답변을 얻을 수 없었다.그러나 시행착오로 다음과 같은 작업을 발견했습니다(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;
--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;

파라미터가 많은 프로시저가 많은 경우 PL/SQL 블록을 작성하는 것이 번거로울 수 있습니다.Python에 쓰여져 있는 어플리케이션이 있습니다.절차 선언으로 파일을 해석하고 편리한 절차 호출을 위해 웹 앱을 만듭니다.

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

언급URL : https://stackoverflow.com/questions/3991721/run-stored-procedure-in-sql-developer