简单的Oracle过程失败

时间:2018-01-11 10:15:14

标签: oracle stored-procedures plsql

我有一个非常简单的测试过程:

create or replace PROCEDURE TestSproc
    (userName in VARCHAR2, p_Test OUT SYS_REFCURSOR)IS 
BEGIN
    OPEN p_Test FOR
    SELECT * FROM Test_Table 
    WHERE name = userName ;

END TestSproc;

当我在proc页面上的sqldeveloper中运行proc(ctrl f10)时,我得到了我期望的结果。但是当我尝试使用以下查询调用proc时,我收到错误:

  

从命令行中的第1行开始出错 - 开始DB.TestSproc('Phil');端;
  错误报告 - ORA-06550:第2行第1列:
  PLS-00306:调用'TestSproc'时参数的数量或类型错误   ORA-06550:第2行,第1列:PL / SQL:语句被忽略
  06550. 00000 - “行%s,列%s:\ n%s”
  *原因:通常是PL / SQL编译错误   *行动:

begin 
    DB.TestSproc('Phil');
end;

任何人都可以指出我正确的方向。

修改

在SQL Server中,我只会这样做:

USE DB;  
GO  
EXEC dbo.TestSproc@Name= 'Phil'; 

2 个答案:

答案 0 :(得分:2)

假设您正在使用带有12c客户端的Oracle 12c:

create or replace procedure testsproc
    ( username in varchar2 )
as
    resultset sys_refcursor;
begin
    open resultset for
        select * from test_table 
        where  name = username;

    dbms_sql.return_result(resultset);
end testsproc;

然后用

调用它
exec testsproc('Phil')

call testsproc('Phil');

begin
    testsproc('Phil');
end;

取决于您所称的内容。

Further reading

答案 1 :(得分:1)

你必须把输出放在某处,所以 - 声明一个合适的变量:

SQL> create or replace procedure p_test (par_deptno in number, p_emps out sys_refcursor) is
  2  begin
  3    open p_emps for
  4      select deptno, empno, ename
  5      from emp
  6      where deptno = par_deptno;
  7  end;
  8  /

Procedure created.

SQL>
SQL> var l_out refcursor
SQL>
SQL> begin
  2    p_test(10, :l_out);
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>
SQL> print :l_out;

    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        10       7839 KING
        10       7782 CLARK
        10       7934 MILLER

SQL>