首页 > 解决方案 > 存储过程-SQL Developer

问题描述

问题:编写一个存储过程,它接受camperid、category、chargeate 和amount 作为输入参数,并有一个varchar2 类型的输出参数,其中包含一条消息。o 如果露营者 ID 不是有效的露营者 ID,则输出参数应设置为“错误:没有此类露营者 ID”。o 如果类别不是有效类别,则输出参数应设置为“错误:没有此类收费类别”。o 如果金额不在正确范围内,则输出参数应设置为“错误:金额必须 >0 且不超过 40 美元”。o 如果金额会导致总花费超过该露营者的预算,则输出参数应设置为“错误:资金不足”。这是我的查询

create or replace procedure P_STORED
       (c_camperid in charges.camperid%type,c_category in charges.camperid%type, c_chargedate in charges.camperid%type, c_amt in charges.camperid%type,
        c_message   out varchar2  )
     as
       p_camperid   charges.camperid%type;
       c_cat charges.category%type;
       a_amt charges.amt%TYPE;
       c_date charges.chargedate%type;
       p_error varchar2(5);
       begin
       v_error := 'False';
       select c.camperid, c.category
        into p_camperid, c_cat
       from charges c
      where c.camperid = c_camperid;
      if p_camperid = c.camperid then
       v_error := 'true';
     c_message := 'Camper ' || c_camperid || ' exists';
     else
     v_error := 'False';
     c_message := 'Error: no such camper ID (' || c_camperid || ')';
     end if;
     if c_cat = c.category then
     v_error := 'true';
     c_message := 'Category ' || c_cat || ' exists';
     else
     v_error := 'False';
     c_message := 'Error: no such charge category (' || c_cat || ')';
      end if;
      if(a_amt >0 and a_amt < 40) then
       v_error := 'true';
     c_message := 'Amount ' || a_amt|| ' is with in range';
     else
     v_error := 'False';
     c_message := 'amount must be >0 and no more than $ 40.';
     end if;
     if(campers.spent < campers.budget) then
     c_message := 'Amount ' || a_amt|| ' is under budget';
     else 
     c_message := 'ERROR: insufficient funds';
     end;

我收到此错误 LINE/COL ERROR


41/5 PLS-00103:遇到符号“;” 预期以下情况之一时:如果错误:检查编译器日志

标签: oraclestored-proceduresplsql

解决方案


当你只需要一个露营者 ID 时,你为什么要传递一大堆参数(其余的你什么也不用做)?那只是没有意义...

这是一个显示如何执行此操作的选项。

样品表:

SQL> select * from charges;

  CAMPERID CATEGORY   CHARGEDATE                 AMT
---------- ---------- ------------------- ----------
         1 Category 1 12.10.2021 00:00:00        500

SQL>

程序:

SQL> create or replace procedure p_test
  2    (par_camperid   in charges.camperid%type,
  3     par_message   out varchar2
  4    )
  5  as
  6    l_camperid   charges.camperid%type;
  7  begin
  8    select c.camperid
  9      into l_camperid
 10      from charges c
 11      where c.camperid = par_camperid;
 12
 13    par_message := 'Camper ' || par_camperid || ' exists';
 14  exception
 15    when no_data_found then
 16      par_message := 'Error: no such camper ID (' || par_camperid || ')';
 17  end;
 18  /

Procedure created.

测试:

SQL> set serveroutput on;
SQL> declare
  2    l_msg varchar2(100);
  3  begin
  4    p_test(1, l_msg);
  5    dbms_output.put_line(l_msg);
  6  end;
  7  /
Camper 1 exists

PL/SQL procedure successfully completed.

SQL> declare
  2    l_msg varchar2(100);
  3  begin
  4    p_test(2, l_msg);
  5    dbms_output.put_line(l_msg);
  6  end;
  7  /
Error: no such camper ID (2)

PL/SQL procedure successfully completed.

SQL>

你写的代码:

  • 错别字,错别字,错别字……是它p_error还是p_erorr
  • if应该有end if
  • if不能包含select语句(必须单独选择值,然后在中使用if
  • where条件不对。永远不要将参数命名为与列名相同的名称。This:where camperid = camperid等于where 1 = 1并且您将从表中获取所有行,而不仅仅是您要查找的行

推荐阅读