Sql 使用参数调用oracle函数

Sql 使用参数调用oracle函数,sql,oracle,Sql,Oracle,我开始学习pl/sql。我对函数有问题。我创建了这样一个函数 create or replace FUNCTION GET_RANK_INFO( p_no IN VARCHAR2, p_date IN DATE, p_count IN NUMBER, p_cycle OUT VARCHAR2, p_return_code OUT INTEGER, p_return_

我开始学习pl/sql。我对函数有问题。我创建了这样一个函数

create or replace
 FUNCTION              GET_RANK_INFO(
 p_no               IN     VARCHAR2,
 p_date     IN     DATE,
 p_count   IN  NUMBER,
 p_cycle          OUT VARCHAR2,
 p_return_code         OUT INTEGER,
 p_return_desc         OUT VARCHAR2)
 RETURN SYS_REFCURSOR
AS
   .... --Some variable definitions
   ....

BEGIN

  ....
  ...

END;
我想这样调用这个函数

create or replace
 FUNCTION              GET_RANK_INFO(
 p_no               IN     VARCHAR2,
 p_date     IN     DATE,
 p_count   IN  NUMBER,
 p_cycle          OUT VARCHAR2,
 p_return_code         OUT INTEGER,
 p_return_desc         OUT VARCHAR2)
 RETURN SYS_REFCURSOR
AS
   .... --Some variable definitions
   ....

BEGIN

  ....
  ...

END;
从dual中选择获取排名信息('12345',截止日期('2019年3月10日','dd/mm/yyyy'),空)
但它给出的错误类似于调用的参数类型的数量不正确

我将调用转换为pl/sql块结构,但代码仍给出相同的错误:

DECLARE
 p_no            VARCHAR2(200);
 p_date           DATE;
 p_count          NUMBER;
 p_cycle          NUMBER;
 p_return_code    NUMBER;
 p_return_desc    VARCHAR2(200);
 v_Return SYS_REFCURSOR;
BEGIN
 p_no   := '23';
 p_date  := to_date('10/03/2019','dd/mm/yyyy');
 p_count:= NULL;

 v_Return := GET_RISK_RANK_FN(
   p_no=> p_no,
   p_date  => p_date  ,
   p_count => p_count,
   p_cycle => p_cycle,
   p_return_code => p_return_code,
   p_return_desc => p_return_desc
 );
DBMS_OUTPUT.PUT_LINE('p_cycle= ' || p_cycle);

  :p_cycle := p_cycle ;
DBMS_OUTPUT.PUT_LINE('p_return_code = ' || p_return_code );

  :p_return_code := p_return_code ;
DBMS_OUTPUT.PUT_LINE('p_return_desc = ' || p_return_desc );

  :p_return_desc := p_return_desc ;


  :v_Return := v_Return; --<-- Cursor
 END;
声明
p_no VARCHAR2(200);
p_日期;
p_计数;
p_循环数;
p_返回_代码编号;
p_return_desc VARCHAR2(200);
返回系统参考光标;
开始
p_编号:='23';
付款日期:=截止日期('2019年3月10日','dd/mm/yyyy');
p_计数:=NULL;
v_回报率:=获取风险等级FN(
p_no=>p_no,
p_日期=>p_日期,
p_计数=>p_计数,
p_循环=>p_循环,
p_return_code=>p_return_code,
p_return_desc=>p_return_desc
);
DBMS|u OUTPUT.PUT_LINE('p|u cycle='| p|u cycle);
:p_循环:=p_循环;
DBMS_OUTPUT.PUT_LINE('p_return_code='| | p_return_code');
:p_return_code:=p_return_code;
DBMS_OUTPUT.PUT_LINE('p_return_desc='| | p_return_desc);
:p_return_desc:=p_return_desc;

:v_Return:=v_Return-- 如果函数中有
OUT
参数,则无法从SQL查询中调用该参数

此外,如果函数中有任何DML,则无法在SQL查询中调用该函数


您需要从PL/SQL块调用此函数。

这样的函数是可疑的;如果它返回一个值就可以了,但是-将它与几个
OUT
参数一起返回非常像一个过程,您应该使用它。下面是一个如何做到这一点的示例:

SQL> create or replace procedure p_test
  2    (par_deptno in  number,
  3     par_count  out number,
  4     par_name   out varchar2,
  5     par_rc     out sys_refcursor
  6    )
  7  is
  8  begin
  9    select count(*), max(dname)
 10      into par_count, par_name
 11      from dept
 12      where deptno = par_deptno;
 13
 14    open par_rc for select * from dept;
 15  end;
 16  /

Procedure created.
测试:

SQL> set serveroutput on
SQL> declare
  2    l_deptno dept.deptno%type := 10;
  3    l_count  number;
  4    l_name   dept.dname%type;
  5    --
  6    l_rc     sys_refcursor;
  7    r_deptno dept.deptno%type;
  8    r_dname  dept.dname%type;
  9    r_loc    dept.loc%type;
 10  begin
 11    p_test (l_deptno, l_count, l_name, l_rc);
 12
 13    dbms_output.put_line('count = ' || l_count);
 14    dbms_output.put_line('name  = ' || l_name);
 15
 16    loop
 17      fetch l_rc into r_deptno, r_dname, r_loc;
 18      exit when l_rc%notfound;
 19      dbms_output.put_line(r_deptno ||' - '|| r_dname ||' - '|| r_loc);
 20    end loop;
 21  end;
 22  /
count = 1
name  = ACCOUNTING
10 - ACCOUNTING - NEW YORK
20 - RESEARCH - DALLAS
30 - SALES - CHICAGO
40 - OPERATIONS - BOSTON

PL/SQL procedure successfully completed.

SQL>
SQL> set serveroutput on
SQL> declare
  2    l_deptno dept.deptno%type := 10;
  3    l_count  number;
  4    l_name   dept.dname%type;
  5    --
  6    l_rc     sys_refcursor;
  7    r_deptno dept.deptno%type;
  8    r_dname  dept.dname%type;
  9    r_loc    dept.loc%type;
 10  begin
 11    l_rc := f_test (l_deptno, l_count, l_name);
 12
 13    dbms_output.put_line('count = ' || l_count);
 14    dbms_output.put_line('name  = ' || l_name);
 15
 16    loop
 17      fetch l_rc into r_deptno, r_dname, r_loc;
 18      exit when l_rc%notfound;
 19      dbms_output.put_line(r_deptno ||' - '|| r_dname ||' - '|| r_loc);
 20    end loop;
 21  end;
 22  /
count = 1
name  = ACCOUNTING
10 - ACCOUNTING - NEW YORK
20 - RESEARCH - DALLAS
30 - SALES - CHICAGO
40 - OPERATIONS - BOSTON

PL/SQL procedure successfully completed.

SQL>

如果你坚持一个函数,哦,好吧,给你;如您所见,它与前面的示例非常相似:

SQL> create or replace function f_test
  2    (par_deptno in  number,
  3     par_count  out number,
  4     par_name   out varchar2
  5    )
  6  return sys_refcursor
  7  is
  8    l_rc sys_refcursor;
  9  begin
 10    select count(*), max(dname)
 11      into par_count, par_name
 12      from dept
 13      where deptno = par_deptno;
 14
 15    open l_rc for select * from dept;
 16    return l_rc;
 17  end;
 18  /

Function created.
测试:

SQL> set serveroutput on
SQL> declare
  2    l_deptno dept.deptno%type := 10;
  3    l_count  number;
  4    l_name   dept.dname%type;
  5    --
  6    l_rc     sys_refcursor;
  7    r_deptno dept.deptno%type;
  8    r_dname  dept.dname%type;
  9    r_loc    dept.loc%type;
 10  begin
 11    p_test (l_deptno, l_count, l_name, l_rc);
 12
 13    dbms_output.put_line('count = ' || l_count);
 14    dbms_output.put_line('name  = ' || l_name);
 15
 16    loop
 17      fetch l_rc into r_deptno, r_dname, r_loc;
 18      exit when l_rc%notfound;
 19      dbms_output.put_line(r_deptno ||' - '|| r_dname ||' - '|| r_loc);
 20    end loop;
 21  end;
 22  /
count = 1
name  = ACCOUNTING
10 - ACCOUNTING - NEW YORK
20 - RESEARCH - DALLAS
30 - SALES - CHICAGO
40 - OPERATIONS - BOSTON

PL/SQL procedure successfully completed.

SQL>
SQL> set serveroutput on
SQL> declare
  2    l_deptno dept.deptno%type := 10;
  3    l_count  number;
  4    l_name   dept.dname%type;
  5    --
  6    l_rc     sys_refcursor;
  7    r_deptno dept.deptno%type;
  8    r_dname  dept.dname%type;
  9    r_loc    dept.loc%type;
 10  begin
 11    l_rc := f_test (l_deptno, l_count, l_name);
 12
 13    dbms_output.put_line('count = ' || l_count);
 14    dbms_output.put_line('name  = ' || l_name);
 15
 16    loop
 17      fetch l_rc into r_deptno, r_dname, r_loc;
 18      exit when l_rc%notfound;
 19      dbms_output.put_line(r_deptno ||' - '|| r_dname ||' - '|| r_loc);
 20    end loop;
 21  end;
 22  /
count = 1
name  = ACCOUNTING
10 - ACCOUNTING - NEW YORK
20 - RESEARCH - DALLAS
30 - SALES - CHICAGO
40 - OPERATIONS - BOSTON

PL/SQL procedure successfully completed.

SQL>