使用 PL/SQL 删除 SQL 行

Posted

技术标签:

【中文标题】使用 PL/SQL 删除 SQL 行【英文标题】:Delete an SQL row with PL/SQL 【发布时间】:2014-05-24 21:34:08 【问题描述】:

我想通过进入 ID 医院来删除行,但由于某种原因,我在执行过程时出错。

CREATE OR REPLACE PROCEDURE BorrarHospital (codihospital IN OUT NUMBER)
IS
idhospital NUMBER;
CURSOR C1 (codihospital NUMBER) IS SELECT HOSPITAL_CODI FROM HOSPITAL WHERE HOSPITAL_CODI = codihospital;

BEGIN

idhospital := codihospital;
OPEN C1 (codihospital);
FETCH C1 INTO codihospital;
IF (C1%FOUND) THEN
DELETE FROM HOSPITAL WHERE HOSPITAL_CODI = idhospital;
ELSE
DBMS_OUTPUT.PUT_LINE('No hi ha cap hospital amb aquest codi');
END IF;
COMMIT;
CLOSE C1;
END;

-

DECLARE
codihospital NUMBER;

BEGIN 
BorrarHospital(99);
END;

我收到此错误

ORA-06550: line 6, column 16:
PLS-00363: expression '99' cannot be used as an assignment target
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored

谁能告诉我我做错了什么?我刚开始学习 PL/SQL,但我没有找到如何解决这个问题。

【问题讨论】:

【参考方案1】:

您将参数声明为codihospital IN OUT NUMBER。这意味着它需要输入 输出。所以你需要传递一个变量,一个可以取值的东西。 99 是一个常数,因此不能赋值。这是错误消息所说的内容。

幸运的是,只需对代码稍作改动即可更正它:只需传递您已声明但目前未使用的变量即可。 (我怀疑您认为您正在使用它,但 PL/SQL 中的工作方式并非如此)。

DECLARE
  codihospital NUMBER;

BEGIN 
  codihospital := 99;
  BorrarHospital(codihospital);
END;

【讨论】:

【参考方案2】:

无需打开游标并获取它来确定医院是否存在 - 只需继续删除它,然后检查 SQL%ROWCOUNT 以确定是否实际删除了任何行:

CREATE OR REPLACE PROCEDURE BorrarHospital (codihospital IN NUMBER)
IS
BEGIN
  DELETE FROM HOSPITAL WHERE HOSPITAL_CODI = codihospital ;

  IF SQL%ROWCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('No hi ha cap hospital amb aquest codi');
  END IF;

  COMMIT;
END BorrarHospital;

分享和享受。

【讨论】:

以上是关于使用 PL/SQL 删除 SQL 行的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL 中合并行

pl / sql触发器改变序列

PL/SQL 比较 XMLTypes

如何在 PL/SQL 中增量集成数据

替换 PL/SQL 中的几行正则表达式函数

ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句