programing

oracle 프로시저가 정수를 반환합니다.

iphone6s 2023. 7. 31. 21:12
반응형

oracle 프로시저가 정수를 반환합니다.

오라클에서는 삭제 결과에 따라 정수를 반환하는 삭제 저장 프로시저를 만들고 싶습니다.

이것이 제가 지금까지 가지고 있는 것입니다.

create or replace
PROCEDURE Testing
( 
iKey IN VARCHAR2
)
 AS 

BEGIN
  delete from MyTable WHERE 
  TheKey = iKey;

END Testing;

RETURNES 정수를 넣으려고 했지만 저장 프로시저가 컴파일되지 않습니다.

프로시저는 값을 반환하지 않습니다.함수는 값을 반환하지만 함수에서 DML을 수행해서는 안 됩니다. 그렇지 않으면 SQL 문에서 함수를 참조하는 것과 같은 작업을 수행할 수 없습니다. 일반적으로 DBA는 사용자가 일관되게 계산을 수행할 수 있도록 모든 함수에 대한 읽기 전용 사용자 액세스 권한을 부여하기를 원하기 때문에 권한 부여를 혼동합니다.

OUT 파라미터를 절차에 추가하여 상태를 반환할 수 있습니다."성공"이 하나 이상의 행이 업데이트되었음을 의미하는 경우, SQL%ROWCOUNT를 사용하여 이전 SQL 문에 의해 수정된 행 수를 카운트하고 이를 사용하여 반환 매개 변수를 채울 수 있습니다.

CREATE OR REPLACE PROCEDURE test_proc (
  p_iKey    IN VARCHAR2,
  p_retVal OUT INTEGER
)
AS
BEGIN
  DELETE FROM myTable
   WHERE theKey = p_iKey;

  IF( SQL%ROWCOUNT >= 1 )
  THEN
    p_retVal := 1;
  ELSE
    p_retVal := 0;
  END IF;
END test_proc;

물론 일반적인 코드 명확성의 관점에서 볼 때 상태 코드를 반환하려는 것으로 보이는 OUT 매개 변수에 대해서는 의문이 듭니다.일반적으로 성공을 가정하고 오류가 발생할 경우 예외를 던지는 것이 훨씬 좋습니다.

저장 프로시저를 사용하여 결과를 반환할 수 있습니다.

CREATE OR REPLACE PROCEDURE testing (iKey IN VARCHAR2, oRes OUT NUMBER)
AS
BEGIN
   DELETE FROM MyTable
         WHERE TheKey = iKey;

   oRes := SQL%ROWCOUNT;
END;

절차를 호출하려면 다음과 같은 방법을 사용합니다.

DECLARE
   pRes   NUMBER;
BEGIN
   testing ('myspecialkey', pRes);
   DBMS_OUTPUT.put_line (pRes);
END;

함수와 암시적 SQL 커서를 사용하여 삭제된 행 수 결정

create or replace
FUNCTION Testing
( 
iKey IN VARCHAR2
) RETURN INTEGER
 AS 

BEGIN
  delete from MyTable WHERE 
  TheKey = iKey;

  RETURN SQL%ROWCOUNT;

END Testing;

그러면 되겠군요.

대신 함수를 찾고 있을 수 있습니다.

FUNCTION TESTING (iKEY IN VARCHAR2) RETURN NUMBER
IS
  v_count NUMBER;
  yourNumber NUMBER;
BEGIN

  SELECT COUNT(*) INTO v_count
  FROM MyTable
  WHERE TheKey = iKey;

  IF v_count > 0
    THEN
       DELETE FROM MyTable 
       WHERE TheKey = iKey;

       SELECT COUNT(*) INTO v_count
       FROM MyTable
       WHERE TheKey = iKey;

       IF (v_count = 0)
         THEN
           yourNumber :=  1; --means successful deletion
       END IF;
  ELSE
       yourNumber := 0; --means no items to delete
  END IF;
  return yourNumber;

  EXCEPTION
      WHEN OTHERS THEN
        RETURN -1; --means error was encountered
END TESTING;

참고: 제가 일하는 곳에서는 일반적으로 sql 패키지 안에 함수를 넣습니다.

SQL%ROWCOUNT다른 DML이 실행된 경우 DML의 값이 재설정된 직후에만 값을 반환합니다.

루프에서 삭제를 실행하면서 문제를 해결하기 위해 dml 뒤에 다음 명령을 실행했습니다.

row_count := row_count + SQL%ROWCOUNT;

선언하고 초기화해야 합니다.row_count := 0;

언급URL : https://stackoverflow.com/questions/262338/oracle-procedure-returns-integer

반응형