【问题标题】:Stored procedure and IF statement存储过程和 IF 语句
【发布时间】:2014-12-11 13:24:16
【问题描述】:

我正在尝试在 oracle 中编写一个将新数据插入表中的存储过程,但在插入数据之前,我希望它检查客户端是否正在接受可能相互冲突的处理。我一直在尝试应用 IF 语句来使其正常工作,但没有成功,这是我目前拥有的代码:

CREATE OR REPLACE PROCEDURE FPRESC (
    FP_ID VARCHAR2,
    FTREAT_ID VARCHAR2,
    FCLIENT_ID VARCHAR2,
    FDOC_ID VARCHAR2)
AS
   V_CLIENT_ID PRESCRIPTION.CLIENT_ID%TYPE;
   V_CONFLICT TREATMENTS.CONFLICT%TYPE;
BEGIN
    IF (FCLIENT_ID = V_CLINET_ID AND FTREAT_ID = V_CONFLICT)
      BEGIN
         DBMS_OUTPUT.PUT_LINE('CONFLICT');
      END;
    ELSE
       BEGIN
         INSERT INTO PRESCRIPTION (P_ID, TREAT_ID, CLIENT_ID, DOC_ID)
         VALUES (FP_ID, FTREAT_ID, FCLIENT_ID, FDOC_ID);
END FPRESC;

以及我如何调用该过程的示例:

EXEC FPRESC ('P00011', 'T016', 'C00017', 'D006');

如果我应该改变什么或如何解决这个问题,我将不胜感激。

【问题讨论】:

  • 怎么了?是编译失败吗?我看到您在 IF 声明的 ELSE 部分缺少 END ;它应该在INSERT 命令之后。另请注意,您不需要在 IF 条件周围加上括号,但它们也不会受到伤害 - 在那里根据您的喜好选择。
  • IF条件THEN语句;这里THEN 不见了
  • OP,我格式化了你的查询,所以如果你看清楚,一些结束的 END 语句,然后 if 丢失
  • @Aramillo 不太熟悉触发器的使用
  • @Ed 是的,程序给出了编译错误

标签: sql database oracle stored-procedures


【解决方案1】:
CREATE OR REPLACE PROCEDURE FPRESC (
    FP_ID VARCHAR2,
    FTREAT_ID VARCHAR2,
    FCLIENT_ID VARCHAR2,
    FDOC_ID VARCHAR2)
AS
   V_CLIENT_ID PRESCRIPTION.CLIENT_ID%TYPE;
   V_CONFLICT TREATMENTS.CONFLICT%TYPE;
BEGIN
    IF FCLIENT_ID = V_CLIENT_ID AND FTREAT_ID = V_CONFLICT THEN 
         DBMS_OUTPUT.PUT_LINE('CONFLICT');
    ELSE
         INSERT INTO PRESCRIPTION (P_ID, TREAT_ID, CLIENT_ID, DOC_ID)
         VALUES (FP_ID, FTREAT_ID, FCLIENT_ID, FDOC_ID);
    END IF;
END FPRESC;

【讨论】:

  • 该过程将不起作用,因为您没有为 v_client_id 和 v_conflict 分配任何值
  • 没关系.. 由开发人员编写正确的逻辑。这里指出的错误是一个编译问题,这解决了它。我无法告诉业务逻辑等。
【解决方案2】:

试试这个

CREATE OR REPLACE PROCEDURE FPRESC (
    FP_ID VARCHAR2,
    FTREAT_ID VARCHAR2,
    FCLIENT_ID VARCHAR2,
    FDOC_ID VARCHAR2)
AS
   V_CLIENT_ID PRESCRIPTION.CLIENT_ID%TYPE;
   V_CONFLICT TREATMENTS.CONFLICT%TYPE;
BEGIN
    IF FCLIENT_ID = V_CLIENT_ID AND FTREAT_ID = V_CONFLICT THEN 
      BEGIN
         DBMS_OUTPUT.PUT_LINE('CONFLICT');
      END;
    ELSE
       BEGIN
         INSERT INTO PRESCRIPTION (P_ID, TREAT_ID, CLIENT_ID, DOC_ID)
         VALUES (FP_ID, FTREAT_ID, FCLIENT_ID, FDOC_ID);
       END;
    END IF;
END FPRESC;

【讨论】:

  • 这也不会编译.. ELSE 子句中的 BEGIN 缺少 END... 如果没有完成异常处理,IF 和 ELSE 也不需要单独的 BEGIN END。
  • 它编译时出错,说那里不需要 IF 语句 (PLS-00103)
  • @Shankar:- 谢谢,我修改了,使用 BEGIN 和 END ,没有害处
  • @user3112130:_ 现在试试
  • Piyush 和 Shankar 都以相同的方式编译。现在我有一个错误说必须声明标识符 V_CLIENT_ID
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多