оракул процедура возвращает целое число - PullRequest
8 голосов
/ 04 ноября 2008

В oracle я хочу создать строку удаления, которая возвращает целое число в зависимости от результата удаления.

это то, что у меня есть.

create or replace
PROCEDURE Testing
( 
iKey IN VARCHAR2
)
 AS 

BEGIN
  delete from MyTable WHERE 
  TheKey = iKey;

END Testing;

Я пытался вставить RETURNS INTEGER, но sproc не скомпилируется.

Ответы [ 5 ]

16 голосов
/ 04 ноября 2008

Процедура не возвращает значение. Функция возвращает значение, но вы не должны делать DML в функции (иначе вы не можете делать что-то вроде ссылки на функцию в операторе SQL, вы путаете предоставление разрешений, поскольку обычно администраторы баз данных хотят иметь доступ только для чтения пользователям ко всем функциям, чтобы пользователи последовательно выполняли вычисления и т. д.).

Вы можете добавить параметр OUT в процедуру для возврата статуса. Если «success» означает, что одна или несколько строк были обновлены, вы можете использовать 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, которые, похоже, пытаются вернуть код состояния. Как правило, вам гораздо лучше, если вы добьетесь успеха и выбросите исключения в случае ошибки.

5 голосов
/ 07 ноября 2008

Вы можете использовать хранимую процедуру для возврата результатов.

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;
2 голосов
/ 04 ноября 2008

Использование функции и неявного курсора SQL для определения количества удаленных строк

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

BEGIN
  delete from MyTable WHERE 
  TheKey = iKey;

  RETURN SQL%ROWCOUNT;

END Testing;

Это должно работать

0 голосов
/ 22 ноября 2013

SQL%ROWCOUNT вернет значение сразу после DML, его значение будет сброшено, если будет выполнен другой DML.

Чтобы обойти проблему, когда я выполнял удаление в цикле, я выполнил следующую команду после dml:

row_count := row_count + SQL%ROWCOUNT;

Пожалуйста, убедитесь, что вы объявляете и инициализируете row_count := 0;

0 голосов
/ 04 ноября 2008

Вы, вероятно, ищете функцию вместо этого.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...