Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单Oracle过程失败_Oracle_Stored Procedures_Plsql - Fatal编程技术网

简单Oracle过程失败

简单Oracle过程失败,oracle,stored-procedures,plsql,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; 当我在sqldeveloper中的proc页面上运行proc(ctrl f10)

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

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;
当我在sqldeveloper中的proc页面上运行proc(ctrl f10)时,我得到了预期的结果。但是,当我尝试使用以下查询调用proc时,我得到了错误:

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

谁能给我指一下正确的方向吗

编辑

在SQL Server中,我只需执行以下操作:

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

您必须将输出放在某个地方,因此-声明一个适当的变量:

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>

假设您将Oracle 12c与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')

这取决于你从何处称呼它


这是SQLPlus会话,有4个独立部分:创建过程是一个“脚本”,变量声明是另一个,运行该过程的匿名PL/SQL块是第三个,打印是第四个。那个么,你们称之为“一个剧本”是什么?对不起,我不能完全理解。当我调用begin块时,它不知道p_测试是什么。我想从另一个页面/文件上的查询调用proc。例如,在SQL server中,我会保存存储过程,然后创建一个新查询来调用它,例如test@Phil3992当你说
时,我会创建一个新的查询来调用
。这是否意味着你通过select语句调用它。@XING否。我会从一个空白的查询页执行。例如:这是我想在oracle中做的。但在这个数据库管理系统上似乎更复杂。我多么希望刚才使用的SQLServerP_测试上的项目是一个存储过程,这意味着它驻留在数据库中,并由创建它的用户拥有。您可以从任何地方调用它,只要您有权访问它(即从SQLPlus会话、SQL开发人员、TOAD、Apex、表单等)。因此,没有什么能阻止您从“空白查询页”(不管它是什么)调用它。
exec testsproc('Phil')
call testsproc('Phil');
begin
    testsproc('Phil');
end;