执行存储过程 - Oracle PL SQL

Posted

技术标签:

【中文标题】执行存储过程 - Oracle PL SQL【英文标题】:Executing Stored Procedure - Oracle PL SQL 【发布时间】:2015-11-17 18:51:35 【问题描述】:

我目前正在尝试在 Oracle PL SQL 中执行存储过程。我一直在执行下面遇到同样的错误。

我尝试过两次执行都出现相同的错误 设置服务器输出; EXEC get_phone(200.00,500.00);

  SET SERVEROUTPUT ON;
   DECLARE
   c_minprice products.price%type;
   c_maxprice products.price%type;
  BEGIN
   c_minprice := get_phone(200);
   c_maxprice := get_phone(500);
  END;


 ERROR from executing the above:
c_minprice := get_phone(200);
              *

ERROR at line 5: 
 ORA-06550: line 5, column 15: 
 PLS-00306: wrong number or types of arguments in call to 'GET_PHONE' 
 ORA-06550: line 5, column 1: 
 PL/SQL: Statement ignored 
 ORA-06550: line 6, column 15: 
 PLS-00306: wrong number or types of arguments in call to 'GET_PHONE' 
 ORA-06550: line 6, column 1: 
 PL/SQL: Statement ignored 

  ****Sample Snip-its form my code:

   CREATE OR REPLACE PROCEDURE get_phone
   (
    c_minprice IN products.price%type,  
    c_maxprice IN products.price%type,  
    i_result OUT VARCHAR2 
  ) AS

--Checking if starting price range is valid or not
IF c_minprice IS NULL THEN
   i_result := 'Starting price range should be valid and cannot be empty';
  RAISE V_MINPRICE; -- Raising exception if starting price is null
END IF;

 --Checking if end price range is valid or not
IF c_maxprice IS NULL THEN
  i_result := 'End price range should be valid and cannot be empty';
  RAISE V_MAXPRICE; -- Raising exception if end price is null
END IF;  

【问题讨论】:

【参考方案1】:

你的过程需要三个参数,所以你必须传入三个参数

DECLARE
  l_result varchar2(100);
BEGIN
  get_phone( 200, 500, l_result );
END;
/

应该可以。当然,您的程序似乎毫无意义。如果目标只是返回一个结果,那么您真的应该使用函数而不是带有out 参数的过程。

【讨论】:

谢谢贾斯汀。这行得通……我同意你的看法。我可能会考虑使用一个函数来解决这个问题。【参考方案2】:

get_phone 需要 3 个参数,c_minprice、c_maxprice 和 i_result。你只传递一个数字。将其余参数传递给它。

【讨论】:

这就是我试图遇到问题的地方 --- 我添加了最低价格和最高价格。当我只希望它在最小和最大价格范围之间的产品时,为什么我需要添加结果。例如,我将 I_result 用于以下内容: --检查起始价格范围是否有效 IF c_minprice IS NULL THEN i_result := '起始价格范围应该有效且不能为空';提高 V_MINPRICE; -- 如果起始价格为空则引发异常 END IF; 设置服务器输出;声明 c_minprice products.price%type; c_maxprice products.price%type;开始 c_minprice := get_phone(200); c_maxprice := get_phone(500);结束; 使用额外的完整信息更新您的原始帖子。由于没有格式,注释部分不是代码的地方。 我已经在我的帖子中进行了适当的编辑。谢谢

以上是关于执行存储过程 - Oracle PL SQL的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

PL_sql如何执行oracle存储过程

Oracle 存储过程

oracle SQL语句中怎么样调用存储过程

赵强老师Oracle存储过程中的out参数

赵强老师Oracle存储过程中的out参数