如何在Oracle PLSQL中选择变量作为查询结果

时间:2019-07-10 19:50:26

标签: oracle plsql

我看上去高低不一,但无法弄清楚。

我在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 个答案:

答案 0 :(得分:2)

将函数重新定义为不具有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 |

db <>提琴here


更新

如果无法重新定义该函数以删除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 |

db <>提琴here

答案 1 :(得分:2)

因此,我能够找到仅当您具有12c或更高版本的JDBC驱动程序时才有效的解决方案:

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参数和返回值的FUNCTION是一个好主意。

答案 2 :(得分:1)

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变量。这通常是编码不佳的征兆,这就是为什么我在上面使用了2个变量,因此您可以查看该函数是否通过修改INPUTVAR1或使用返回值来“返回”新值。或两者兼有。

答案 3 :(得分:0)

您具有dbms_output的原始Oracle代码是正确的。基本上,在调用函数后,您将完全像分配变量一样使用分配的变量(与SQL Server相同)。 因此,在调用之后返回一个值(假设为9)的函数调用
“ x:= some_function(y)”与编写
“ x:= 9”完全相同。因此,您的功能再次正确。
但是,您表示已使用SQL Developer。我的猜测是您没有打开dbms_output。为此,请在SQL Developer菜单栏中选择“查看”,然后单击“ Dbms输出”。这将打开dbms_output窗口。但是您还没有完成。在Dbms输出窗口中,单击绿色的 + ,选择适当的架构(如果需要),然后单击“确定”。现在将在该窗口中显示Dbms_output。

答案 4 :(得分:-1)

尝试

def load_data(self, size):
        '''Creates a data frame of all orders with number of items in that order equals to argument size'''
        data = pd.read_csv(self.file_name, sep="\t", header=0, 

        #grouping
        grouping = data.groupby('A')
        df =  grouping.filter(lambda x: len(x) == size) #filters all the data with specific size
        values = []
        for i in range(0, len(df)):
            if i% size == 0:
                dat = df[i: i+size]
                temp = dat[['B']]
                temp_values = np.append(df.iloc[i][0], temp.values.flatten())
                values.append(temp_values)

        new_df = pd.DataFrame(np.array(values))
        return new_df