运行PL / SQL过程后,为什么会出现此错误:“ ORA-00922:缺少或无效的选项”?

时间:2019-11-19 18:55:01

标签: oracle plsql

我创建了一个具有某些属性的表Patient,例如p_name,p_surname,p_number ...我想创建一个过程以将患者从该表Patient转移到另一个表(Patient_backup),以防他的“ p_number”属性具有收到输入,将其从第一个表中删除,仅保留在第二个表中。第二个表具有与第一个表相同的结构。我已经对过程进行了编码。

CREATE TABLE patient (
p_number      VARCHAR2(10) NOT NULL,
p_name            VARCHAR2(15),
p_surname         VARCHAR2(15),
p_street            VARCHAR2(20),
p_city            VARCHAR2(15)
);

CREATE TABLE patient_backup (
p_number      VARCHAR2(10) NOT NULL,
p_name            VARCHAR2(15),
p_surname         VARCHAR2(15),
p_street            VARCHAR2(20),
p_city            VARCHAR2(15)
);

CREATE [OR REPLACE] PROCEDURE transfer (p_number VARCHAR2)
AS
CURSOR k1 IS SELECT p_number FROM patient;
BEGIN
OPEN k1;
LOOP
FETCH k1 INTO p_number;
IF p_number IS NULL THEN
dbms_output.put_line('empty');
ELSE
INSERT INTO patient_backup (SELECT * FROM patient);
Execute Immediate 'Drop Table patient;';
END IF;
END LOOP;
CLOSE k1;
END transfer;

但是当我运行它时,出现错误“ ORA-00922:缺少或无效的选项”。你能帮我吗?我想知道代码是否正确。我已经阅读了有关PL / SQL的材料,但是这些概念没有相互联系,所以我只是尝试将所有内容收集在一起,希望它是正确的。您能帮我纠正此代码并使它生效吗?

3 个答案:

答案 0 :(得分:5)

很难确定错误的确切位置,但我的猜测是:从;的字符串内部删除execute immediate

但是我认为您不想不想想要DROP表-这样就将表从数据库中完全删除,包括 all 行及其定义。此后将无法访问。

认为您真正想要的是从该表中DELETE行,而不是完全删除该表。

此外:整个循环完全没有必要(而且效率很低)。您可以使用两个简单的SQL语句来做到这一点:

insert into patient_backup
select *
from patient
where p_number = 42; --<< to pick one patient

delete from patient 
where p_number = 42;

将其放入过程中:

CREATE PROCEDURE transfer (p_number_to_delete VARCHAR2)
AS
BEGIN
  insert into patient_backup
  select *
  from patient
  where p_number = p_number_to_delete;

  delete from patient 
  where p_number = p_number_to_delete;

END transfer;

强烈建议不要使用列名作为参数名。这就是为什么我将参数命名为p_number_to_delete(但是p_number对于以数字开头的列来说是一个不好的名字-但这是另一种讨论)

答案 1 :(得分:0)

我认为您需要先DECLARE定义光标。

答案 2 :(得分:0)

在您的过程代码中有错误

1.P_NUMBER输入参数不能用于陈述  2.不要在EXECUTE IMMEDIATE字符串中使用分号  3.在循环语句中,您应该使用exit,否则它将运行     连续

此处是代码

CREATE OR REPLACE PROCEDURE TRANSFER (P_NUMBER IN VARCHAR2) AS
CURSOR K1 IS 
    SELECT P_NUMBER FROM PATIENT;
P_NUM PLS_INTEGER;    
BEGIN
    OPEN K1;
        LOOP
            FETCH K1 INTO P_NUM;
                IF P_NUM IS NULL THEN
                    DBMS_OUTPUT.PUT_LINE('EMPTY');
                ELSE
                    INSERT INTO PATIENT_BACKUP (SELECT * FROM PATIENT);
                    DELETE FROM PATIENT;
                END IF;
                EXIT WHEN P_NUM IS NULL;
        END LOOP;
CLOSE K1;
END TRANSFER;