0

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

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

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

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

老实说,我很茫然。到目前为止,对于存储的过程,我有:

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),并且该过程将显示数据库中有多少模型类型。

4

2 回答 2

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 -“精确提取返回超过请求的行数” *原因:精确提取中指定的数量小于返回的行数. *行动:重写查询或更改请求的行数

于 2013-09-25T03:21:09.907 回答
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 中,将提示“用户”提供 :model_name 的值。

于 2013-09-26T13:58:52.830 回答