我看上去高低不一,但无法弄清楚。
我在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
的值吗?
答案 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