Oracle存储过程'学习'问题

时间:2013-09-25 02:42:19

标签: sql oracle stored-procedures plsql oracle11g

我在Oracle PL / SQL中编写存储过程的任务(作为作业的一部分)。有三个要求必须满足。

  1. 必须有2个参数,1 IN和1 OUT。

  2. 我必须使用隐式游标和SQL函数来计算相同类型字段数的计数(在这种情况下,类型是汽车模型,因此每个模型有多少辆汽车)。 / p>

  3. 我必须使用另一个隐式光标来显示模型的描述。

  4. 说实话,我不知所措。到目前为止,对于存储过程,我有:

    CREATE OR REPLACE Procedure model_details_sp
    (p_model IN VARCHAR2,
    p_noofcars OUT NUMBER)
    IS
    BEGIN
    SELECT COUNT(Model_Name) INTO p_noofcars
    FROM i_car
    GROUP BY Model_Name;
    END;
    

    我真的不知道从哪里开始。任何建议或指示都将受到最高的赞赏。

    非常感谢。

    大家好,我感谢所有评论。我对最终要求不是很清楚。我希望能够通过匿名块调用此过程,以便用户输入模型类型(& vairalbe),该过程将显示数据库中有多少个模型类型。

2 个答案:

答案 0 :(得分:1)

在处理此类问题时,首先要考虑您要捕获的数据。

处理PL / SQL中的隐式游标需要1行,因此您需要确保理解数据。

在这种情况下,您传入的变量在您的任何查询中均未使用,因此我建议您重新评估。

我手边没有数据库来运行它,但你应该能够解决这个问题,希望能让你更近一点。我把它放在匿名块中,这样我就可以快速写出来。

DECLARE
    PROCEDURE model_details_sp (p_model IN VARCHAR2, p_noofcars OUT NUMBER)
    IS
        p_description   VARCHAR2 (200);
    BEGIN
        --2
        SELECT COUNT (model_name)
          INTO p_noofcars
          FROM i_car
         WHERE model_name = p_model;

        DBMS_OUTPUT.put_line ('No of Cars for model: ' || p_noofcars);

        --3
        SELECT model_description
          INTO p_description
          FROM i_car --the table should be the car_model table so that only one record is returned
         WHERE model_name = p_model;

        DBMS_OUTPUT.put_line ('Model Desc' || p_description);
    END model_details_sp;
BEGIN
    dbms_output.put_line('');
END;

致@David Aldridge评论:

尝试运行它 - 结果应该是失败 - 因为你不能使用into CLAUS选择多行,除非你聚合数据:

DECLARE
  p_num NUMBER;
BEGIN
  SELECT LEVEL INTO p_num FROM DUAL CONNECT BY LEVEL <= 10;
  dbms_output.put(p_num);
END;

您应该看到的错误是:

  

错误报告:

     
    

ORA-01422:精确提取返回超过请求的行数     ORA-06512:第4行     01422. 00000 - “确切的提取返回超过请求的行数”     *原因:精确提取中指定的数字小于返回的行数。     *操作:重写查询或更改请求的行数

  

答案 1 :(得分:0)

从描述和后续评论中,这是我将提供的解决方案:

DECLARE
   PROCEDURE model_details_sp
      (p_model IN VARCHAR2,
       p_noofcars OUT NUMBER)
   IS
   BEGIN
      SELECT COUNT(*) 
      INTO   p_noofcars
      FROM i_car
      WHERE model_name = p_model;
   END;

   no_of_cars NUMBER := 0;
BEGIN
   model_details_sp(:model_name, no_of_cars);
   dbms_output.put_line('no of cars for ' || :model_name || ' = ' || no_of_cars);
END;

我已经在线创建了PROCEDURE,但您可以通过从声明部分中删除它并使用CREATE OR REPLACE执行它来轻松地将其提取到数据库。

此示例假定在执行匿名块时使用支持绑定变量替换(:model_name)的IDE。例如,在TOAD中,将提示“user”为:model_name。

提供值