Как выбрать переменную как результат запроса в Oracle PLSQL - PullRequest
0 голосов
/ 10 июля 2019

Я выглядел высоко и низко, но не смог понять это.

У меня определена эта функция в Oracle:

FUNCTION MY_FUNCTION(
    INPUTVAR1 IN OUT NUMBER,
    INPUTVAR2 VARCHAR2
) RETURN NUMBER;

Человек, который создал эту функцию,в основном возвращает входной параметр, если он не равен 0. В противном случае, если INPUTVAR1 равен 0, он вернет новое значение.Я хочу это новое значение.

В T-SQL все так просто, что глупо:

DECLARE @MyVar INT = 0;
SET @MyVar = MY_FUNCTION(@MyVar, NULL);
SELECT @MyVar as Result;

Но в Oracle я не могу понять, как вернуть возвращаемое значение в результате.Это то, что у меня пока есть:

DECLARE MyVar NUMBER := 0;
BEGIN
MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)
END;

Но я не могу понять, как использовать MyVar в результате.Я определенно не могу выбрать это.Я пытался DBMS_OUTPUT.PUT_LINE(MyVar);, но не повезло.

Кто-нибудь знает, как я могу вернуть значение MyVar?

Ответы [ 5 ]

2 голосов
/ 11 июля 2019

Так что я смог найти это решение, которое работает, только если у вас есть драйверы JDBC 12c или выше:

DECLARE MyVar NUMBER := 0;
    rc sys_refcursor; 
BEGIN
MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)

open rc for SELECT MyVar FROM dual; 
dbms_sql.return_result(rc); 

END;

Я бы хотел встретиться с человеком, который думал, что это хорошая идея - иметьФУНКЦИЯ с параметрами IN / OUT и возвращаемым значением.

2 голосов
/ 11 июля 2019

Переопределите функцию, чтобы не иметь параметра OUT:

CREATE FUNCTION MY_FUNCTION(
    INPUTVAR1 IN NUMBER,
    INPUTVAR2 IN VARCHAR2
) RETURN NUMBER
IS
BEGIN
  RETURN INPUTVAR1;
END;
/

Затем вы можете использовать его в запросе SQL:

SELECT MY_FUNCTION( INPUTVAR1 => 0, INPUTVAR2 => NULL ) AS value
FROM   DUAL

Вывод:

| VALUE |
| ----: |
|     0 |

дБ <> скрипка здесь


Обновление

Есливы не можете переопределить функцию, чтобы удалить параметр OUT, а затем написать обертку вокруг него:

CREATE FUNCTION MY_FUNCTION_WRAPPER(
    INPUTVAR1 IN NUMBER,
    INPUTVAR2 IN VARCHAR2
) RETURN NUMBER
IS
  var1 NUMBER := INPUTVAR1;
BEGIN
  RETURN MY_FUNCTION( INPUTVAR1 => var1, INPUTVAR2 => INPUTVAR2 );
END;
/

Затем вы можете вызвать ее из оператора SQL:

SELECT MY_FUNCTION_WRAPPER( INPUTVAR1 => 0, INPUTVAR2 => NULL ) AS value
FROM   DUAL;

Вывод:

| VALUE |
| ----: |
|     0 |

дБ <> скрипка здесь

1 голос
/ 10 июля 2019

dbms_output отлично работает для меня:

create or replace FUNCTION MY_FUNCTION(
    INPUTVAR1 IN OUT NUMBER,
    INPUTVAR2 VARCHAR2
) RETURN NUMBER is
begin
    if inputvar1 = 0 then
        return -1;
    else
        return inputvar1;
    end if;
end;
/

declare
  my_var number := 0;
  my_var2 number := 0;
begin
  my_var2 := my_function(my_var, 'A');
  dbms_output.put_line('my_var:' || my_var);
  dbms_output.put_line('my_var2:' || my_var2);
end;
/

my_var:0
my_var2:-1

Редактировать: Меня немного беспокоит наличие переменной OUT в функции.Обычно это признак плохого кодирования, поэтому я использовал выше две переменные, чтобы вы могли видеть, «возвращала ли» новое значение функция, изменяя INPUTVAR1 или используя возвращаемое значение.Или оба.

0 голосов
/ 11 июля 2019

Ваш исходный код Oracle с dbms_output правильный. По сути, после вызова функции вы используете назначенную переменную точно так же, как если бы вы присвоили ей значение (так же, как SQL Server). Так что вызов функции
"x: = some_function (y)", который возвращает значение (скажем, 9), после вызова точно такой же, как если бы вы написали
"x: = 9". Итак, снова ваша функция была правильной.
Однако вы указали, что используете SQL Developer. Я предполагаю, что у вас не был включен dbms_output. Для этого в строке меню SQL Developer выберите View, а затем нажмите Dbms output. Это откроет окно dbms_output. Но вы не совсем сделали. В окне вывода Dbms щелкните большой зеленый + , выберите подходящую схему (при необходимости) и нажмите кнопку ОК. Dbms_output теперь будет отображаться в этом окне.

0 голосов
/ 10 июля 2019

попробуйте

 DECLARE MyVar NUMBER := 0;
   varout VARCHAR2();
 BEGIN
 --MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)
 select MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL) INTO varout from dual;
  dbms_output.put_line(MyVar);
  END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...