简单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;